Charts: (v3.0 + Swift3.0) تمييز عرض الرسم البياني ValueWithX لا يعمل

تم إنشاؤها على ٢٠ سبتمبر ٢٠١٦  ·  23تعليقات  ·  مصدر: danielgindi/Charts

يبدو أن طريقة عرض ChartView قد توقفت عن العمل لـ v3.0 + Swift3.0
Xcode 8 / الفرع الرئيسي / Objc.

bug ★★★

التعليق الأكثر فائدة

غيّر هذا الخط: lineChartView.highlightValue (x: 3، dataSetIndex: 0)

to: lineChartView.highlightValue (Highlight (x: 3، y: 0، dataSetIndex: 0)

ال 23 كومينتر

PhilJay highlightValue(x...) تفشل وظائف ، لأن عارض التمييز يتوقع وجود قيمة Y. والنتيجة هي NaN ، مما يجعلها لا تقدم أي مكان ...

كل من Android و iOS؟

بلى...

هممم ... نظرت للتو في الكود ، هذا أمر صعب. في حالة وجود إدخالات متعددة في نفس الموضع x ، فلن يكون من الممكن تمييز إدخال معين بنجاح دون أي تحديد للموضع y.

لذا ربما يجب أن نتخلى عن هذه الطريقة؟
هناك خيار آخر يتمثل في تضمين موضع y في الطريقة (كمعامل)؟

حسنًا ، تبدأ المشكلة بالاختيار من أحداث اللمس - فهي لا تزال لا تعمل حقًا ، إذا كان لديك مخططات مبعثرة أو فقاعية بقيم متعددة في نفس x. إنه في الواقع يختار الأول أو الأخير على نفس x - اعتمادًا على موضع اللمس على المحور X!

بعد أن نصلح ذلك - أعتقد أن الخوارزمية ستعرف أنها تأخذ قيمة Y وبعد الوصول إلى X الصحيح ، ستبدأ في البحث عن Y الصحيح.
وبعد ذلك سيكون لدينا خيار تمرير قيمة Y ، كطريقة منفصلة! :-)
النسخة الأصلية ، التي يتم تسليط الضوء عليها ببساطة بواسطة X مفيدة للغاية ويعتمد عليها الكثير من الأشخاص ، بناءً على المشكلات ... لذلك سنتلقى رسائل كراهية إذا أزلنا ذلك :-)

هل هناك أي عمل حالي حول تمييز عنصر مخطط خطي برمجيًا؟ هل كل طرق التظليل معطلة في الوقت الحالي؟

يجب أن يعمل المخطط الخطي apurva على ما يرام. لقد راجعت ChartsDemo مع أحدث فرع الأم

تمييز برمجيًا ما زال لا يعمل في المخططات الخطية.

أحاول إبراز القيمة الأخيرة:

[self.lineChartView highlightValueWithX:self.lineChartView.chartXMax dataSetIndex:0 callDelegate:YES];

ولكن في طريقة التفويض - (باطل) مخطط القيمة الإلكترونية

يمكنني إعادة التأكيد على أن العنصر المميز لـ lightValueWithX لا يعمل.

حاولت إنشاء تمييز
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
واستخدمت طريقة HighlightValueWithHighlight معها ولكنها لم تبرز بعد. يتم استدعاء طريقة chartValueSelected: الإدخال: تسليط الضوء: التفويض ، والتي تحتوي على القيم الصحيحة في كائن الإدخال ولكن كائن التمييز له NaN في القيمة y.

هل توجد أي طريقة لإنشاء كائن ChartHighlight * يحتوي على قيمة y أيضًا؟ أرى طرق بدء مختلفة لفئة ChartHighlight ولكن كل الآخرين يحتاجون إلى مواضع بكسل مطلقة.

@ liuxuan30 هل يمكنك الإشارة إلى أي جزء من العرض التوضيحي للمخططات يبرز الرسم البياني برمجيًا؟

بدلاً من ذلك ، هل هناك طريقة لإظهار الإدخال المحدد حاليًا في أي آلية أخرى إلى جانب استخدام التمييز؟

يعد هذا ضروريًا للغاية بالنسبة إلى TVOS نظرًا لأن الرسوم البيانية لا تدعم بيئة التركيز ، ويجب التعامل مع تفاعلات المستخدم على الرسم البياني برمجيًا بدلاً من الاعتماد على أدوات التعرف على الإيماءات المضمنة.

للتغلب على هذه المشكلة ، قمت بما يلي في نسختي المحلية:

في Highlight.swift ، أضف مُهيئًا يأخذ قيمة ay أيضًا:

    /// - parameter x: the x-value of the highlighted value
    /// - parameter y: the y-value of the highlighted value
    /// - parameter dataSetIndex: the index of the DataSet the highlighted value belongs to
    public init(x: Double, y: Double, dataSetIndex: Int)
    {
        _x = x
        _y = y
        _dataSetIndex = dataSetIndex
    }

ثم عندما أرغب في التحديد برمجيًا ، أفعل ذلك على النحو التالي:

   let entry = //... the ChartDataEntry I want to highlight
   self.chart.highlightValue(
       Highlight(x: entry.x, y: entry.y, dataSetIndex: 0)
   )

أنا بالتأكيد لست على دراية كافية بالشفرة لمعرفة ما إذا كان هذا هو النهج اللائق للمضي قدمًا أم لا. إذا كان الأمر كذلك ، أعتقد أن أحد الأشياء التي من شأنها أن تساعد هو ChartData.highlightForEntry() -> Highlight ليكون معكوسًا لـ ChartData.entryForHighlight()

في الواقع ، عند النظر عن كثب ، وجدت أن هناك إصلاحات حديثة لبعض برامج العرض الأخرى التي لم يتم تطبيقها على المخططات الخطية.

في هذا الالتزام:

https://github.com/danielgindi/Charts/commit/8905a46c8262998ccdb780bbd5d2c03e45b8ab5a#diff -52d760df99fc778bb8222bd3cc9ce413R225

تم تغيير المتغيرات x و y لتأتي من entry ، وليس من Highlight h . أعتقد أنه إذا تم تطبيق هذا الإصلاح نفسه على LineChartRenderer فسيتم إصلاح المشكلة.

سأحاول ذلك وآمل أن أحصل على علاقات عامة جاهزة اليوم إذا سمح الوقت بذلك.

أيضًا ، لا يبدو أن قيمة y مستخدمة فعليًا ، نظرًا لأن سطر التمييز ينتقل فقط من contentTop إلى contentBottom. جذر المشكلة هو في الواقع في هذا السطر:

let pt = trans.pixelForValues(x: x, y: y)

إذا كان y هو NaN فإن pt.x يظهر كـ NaN أيضًا. يبدو أن هذا في الواقع خطأ في Swift 3 / CoreGraphics ، كما يتضح في Swift Repl هنا:

  7> import CoreGraphics
  8> let trans = CGAffineTransform(scaleX: 1.0, y: 1.0)
trans: CGAffineTransform = {
  a = 1
  b = 0
  c = 0
  d = 1
  tx = 0
  ty = 0
}
  9> let pt = CGPoint(x: 1.0, y: Double.nan)
pt: CGPoint = (x = 1, y = NaN)
 10> pt.applying(trans)
$R2: CGPoint = (x = NaN, y = NaN)

apurva ، هل يمكنك تجربة fix-1495 هنا:

https://github.com/ryanschneider/Charts/tree/fix-1495

ومعرفة ما إذا كان يعمل كما هو متوقع بالنسبة لك؟ إنه يعمل بالنسبة لي. danielgindi & @ liuxuan30 ، لقد قمت بنسخ الكود من ScatterChartRenderer لكنني أضفت الشيك if x > chartXMax * animator.phaseX الذي كان يحتوي على LineChartRenderer .

لا أعتقد أنني بحاجة إلى تكرار ما يزيد عن set.entriesForXValue(high.x) لكنني حاليًا. لا أعتقد أن هناك ضررًا لأنه لا ينبغي أبدًا أن يكون هناك أكثر من إدخال واحد ، ولكن إذا كان بإمكانك تأكيد ذلك ، فسوف يسعدني طي ذلك إلى مكالمة واحدة set.entryForXValue(high.x) وإرسال PR.

سيكون من الجيد أيضًا إضافة خيار تمييز برمجي إلى ChartsDemo للمساعدة في اختبار الانحدار ، لكنني لم أحقق في ما يتطلبه الأمر للقيام بذلك.

شكرا لجهودكryanschneider ! danielgindi ما رأيك؟

ryanschneider شكرا لجهودكم. لقد جربت التغييرات في الفرع الخاص بك ، ولكن كلا الطريقتين تسليط الضوء علىValueWithX و highValueWithHighlight كلاهما لا يزالان غير مناسبين لي. لا تزال قيمة y للتمييز هي NaN ولا يتم رسم التمييز على الرسم البياني عند استدعائه برمجيًا.

danielgindi تم اختباره للتو مع أحدث معلم ، بما في ذلك الالتزام الخاص بك على https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

highValueWithX ما زال لا يُظهر خطوط الإبراز. يتم فصل المندوب ولا تزال قيمة y للتمييز هي NaN في المفوض. كما هو الحال سابقًا ، يُظهر التظليل عبر أدوات التعرف على الإيماءات خطوط الإبراز ، ولكن ليس كذلك عند استدعاء تمييز ValueWithX.

لا يزال لا يعمل.

ما زلت لا أعمل معي في Swift 3.

`فئة ChartsViewController: UIViewController {

<strong i="7">@IBOutlet</strong> var lineChartView: LineChartView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0]

    setChart(dataPoints: months, values: unitsSold)

}

func setChart(dataPoints: [String], values: [Double]) {

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
    }

    let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Units Sold")
    let lineChartData = LineChartData(dataSet: lineChartDataSet)
    lineChartDataSet.highlightLineWidth = 2
    lineChartDataSet.highlightColor = UIColor.red

    lineChartView.data = lineChartData

    lineChartView.highlightValue(x: 3, dataSetIndex: 0)

    }

} `

غيّر هذا الخط: lineChartView.highlightValue (x: 3، dataSetIndex: 0)

to: lineChartView.highlightValue (Highlight (x: 3، y: 0، dataSetIndex: 0)

حاولت تحديد ay: 0 على رسم بياني خطي بمجموعات بيانات متعددة وما زال لا يعمل. هل هناك أي تحديث على ذلك؟ إنها حشرة كبيرة جدًا.

أنا أتصل من الهدف ج.

القليل من الاختراق للحصول على موضع القيمة المميزة

// Highlight set programmatically
let dataEntry = dataEntries[linechartData.entryCount-1]
self.lineChartView.highlightValue(Highlight(x:` dataEntry.x, y:dataEntry.y, dataSetIndex: 0), callDelegate:` true)
func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        var markerPosition = CGPoint(x:highlight.xPx, y: highlight.yPx)
        // Hack to get the real position of the highlight programaticaly
        if markerPosition.x.isNaN || markerPosition.y.isNaN{
            let transformer = lineChartView.getTransformer(forAxis: lineChartView.leftAxis.axisDependency)
            let pt = transformer.pixelForValues(x: entry.x, y: entry.y)
            markerPosition.x = pt.x
            markerPosition.y = pt.y
        }
}

لقد جربت الاختراق الخاص بك ، jndefosse ، ولكن كيف يمكنني استدعاء الوظيفة لإظهار الملصقات فقط عند تمييز الإدخال؟

هل تم إصلاح هذا الخطأ؟ لا يمكنني تمييز قسم في الرسم البياني الدائري لنظام iOS 13.5 Swift 5.1

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

kirti0525 picture kirti0525  ·  3تعليقات

kwstasna picture kwstasna  ·  3تعليقات

PrashantKT picture PrashantKT  ·  3تعليقات

newbiebie picture newbiebie  ·  3تعليقات

ahmedsafadii picture ahmedsafadii  ·  3تعليقات