Charts: إيقاف تكرار تسميات المحور.

تم إنشاؤها على ٢٤ أغسطس ٢٠١٥  ·  51تعليقات  ·  مصدر: danielgindi/Charts

داخل التطبيق لدي مشكلة حيث تتكرر التسميات الموجودة على المحور الأيسر إما BarChartView أو LineChartView .

لقد أضفت المقتطف أدناه أولاً للتأكد من أن عدد الملصقات على المحور لا يتجاوز الحد الأقصى لقيمة البيانات y.

self.chartView.leftAxis.labelCount = self.chartView.data.yMax > YAxisMaxLabelCount ? YAxisMaxLabelCount : self.chartView.data.yMax;

هذا يضمن أنه إذا كانت القيمة القصوى في البيانات y هي 3 ، فلن يكون هناك سوى تسميات 3 داخل المحور. يعمل هذا الآن بشكل جيد إذا لم يكن الرسم البياني تفاعليًا ، أي لا يمكن للمستخدم تكبير الرسم البياني.

بمجرد أن يقوم المستخدم بالتكبير بشكل واضح ، يظل عدد الملصقات كما هو ويتم ملء مُنسق القيمة في الفجوات مما يسمح بتكرار القيمة.

_مثال على المحور بدون قيم مكررة_
screen shot 2015-08-24 at 5 07 29 pm

_مثال على الرسم البياني نفسه ولكن تم تكبيره_
screen shot 2015-08-24 at 5 07 54 pm

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

شكرا

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

تم إصدار هذا في 2.2.4 ، كميزة granularity

ال 51 كومينتر

أعتقد أنه ليس التسمية مكررة ، لكنها تحتوي على قيم عشرية ومنسق عدد صحيح؟ تحتاج إلى التحقق من القيمة الأولية لكل تسمية محور س وكيفية تنسيقها عند رسم تسميات xAxis في عارض المحور y.

تمكنت من القيام بذلك عن طريق إضافة فحص للتأكد من أن الفاصل الزمني لكل تسمية هو دائمًا قيمة كاملة.
التغيير ضمن وظيفة computeAxisValues() ChartYAxisRenderer للفئة $ # $ 1 $ # $

var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval))
if(_yAxis.valueFormatter?.maximumFractionDigits == 0)
{
    interval = interval < 1 ? 1 : floor(interval)
}

إذا طلب منسق القيمة عدم وجود أرقام كسرية ، فإنه يطابق الفواصل الزمنية ، وإذا كان أقل من ذلك ، فإن الرقم الكامل 1 يضبطه على 1 .

هل تريد طلب سحب؟

شكرا لمساعدتك.

إذا كانت لديك قيم عشرية ، فلماذا يكون maxFractionDigits صفرًا؟ أعتقد أنها مشكلة المنسق.

لا أريد قيمًا عشرية لهذا السبب قمت بتعيين maximumFractionDigits = 0

pal ، بياناتك عشرية ، وتريد فقط استخدام المنسق للتخلي عن أرقام الكسور ، فهذا غير منطقي. لماذا لا تقوم بتحويل بياناتك إلى أعداد صحيحة أولاً؟

قيم y التي أعطيها للمخطط هي

(1, 3, 2, 0, 0, 7, 0)

بمجرد إنشاء ChartDataSet ، تصبح هذه القيم مضاعفة.

ChartDataSet, label: , 7 entries:
ChartDataEntry, xIndex: 0, value 1.0
ChartDataEntry, xIndex: 1, value 3.0
ChartDataEntry, xIndex: 2, value 2.0
ChartDataEntry, xIndex: 3, value 0.0
ChartDataEntry, xIndex: 4, value 0.0
ChartDataEntry, xIndex: 5, value 7.0
ChartDataEntry, xIndex: 6, value 0.0

هذا لأن صفك ChartDataEntry يحتفظ بالقيمة على أنها Double

/// the actual value (y axis)
public var value = Double(0.0)

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

لا أريد أن يفترض المخطط أنني أريد قيمًا إضافية بين الأعداد الصحيحة لأنني أريد فقط إظهار تسمية لعدد صحيح.

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

عن طريق إضافة الشيك مقابل منسق القيمة فإنه يسمح بهذا السلوك. قد تعرف طريقة أفضل لتوفير هذا السلوك بدلاً من التحقق من مُنسق القيمة ولكنها حالة استخدام يريدها بعض الأشخاص.

لقد لاحظت للتو أنني أستخدم قاعدة الكود في الالتزام a7e30dd16fbfaecb8e44c01ad8618a3a745fd101 وعندما يتم تنفيذ هذا التغيير في آخر التزام للمخططات ، فإنه لا يعمل كما هو متوقع.

هل ستكون قادرًا على تقديم المشورة بشأن أفضل السبل لتحقيق السلوك الذي أريده؟

لقد أرفقت صورة متحركة للسلوك المتوقع.

يمكنك أن ترى أدناه أنه لا توجد تسميات تعرض نفس القيمة وأن المخطط لا يحاول وضع أي تسمية بين التسميات الأخرى حيث يوجد شرط أن تكون التسميات قيمًا كاملة.

chart

آه لقد فهمت. إذا قمت بالتكبير لنفترض [3،4] ، فسيكون النطاق [3،4] ويريد المحور عرض [3.0 ، 3.2 ، 3.4 ، 3.6 ، 3.8 ، 4.0] ، ولا تريد كسور الأرقام ، فعلا؟

لا يمكنني فعل أي شيء في الواقع ... نظرًا لأن بياناتك صغيرة جدًا ، وعلينا عرض 4-6 تسميات هناك ... ماذا لو كان النطاق [0،1] ، وتحتاج إلى عرض 5 تسميات ، فماذا يمكن تعرض غير كسور الأرقام؟

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

راجع للشغل ، لقطات الشاشة الخاصة بك تعمل بشكل رائع ، وقد حلت مشكلتك

هناك أيضًا بعض الخصائص التي تساعدك على تحديد عدد الملصقات. يمكنك محاولة التعديل والملاءمة لمستويات الميزان المختلفة.

    public func setLabelCount(count: Int, force: Bool)
    {
        _labelCount = count

        if (_labelCount > 25)
        {
            _labelCount = 25
        }
        if (_labelCount < 2)
        {
            _labelCount = 2
        }

        forceLabelsEnabled = force
    }

للحصول على نفس السلوك على المحور Y ، من الضروري تعيين حد تكبير Y. # 382

388

steprescott ، هل تم حل مشكلتك # 388؟

من خلال النظر في الالتزام بالإصدار رقم 388 ، فإن التغيير الوحيد هو خاصية جديدة في منفذ العرض.

كيف يمكنني الحصول على السلوك المقصود الذي يظهر في gif ولكن مع التغييرات التي أجريتها؟

مرحبًا steprescott ، جرب [_chartView.viewPortHandler setMaximumScaleY: 2.f] ؛ على سبيل المثال ، مثل هذا ، فإن دقة التكبير / التصغير ليست كبيرة جدًا لإظهار القيم المتكررة. من الأمثلة الجيدة على ذلك أنه عندما يكون لديك خط حرف أفقي بدون حد ، يتم تكرار جميع قيم Y عندما يكون التكبير كبيرًا. مع MaximumScaleY لا يحدث هذا التكرار.

بدون حدود:
screen shot 2015-09-22 at 23 29 16

مع الحد 2f:
screen shot 2015-09-22 at 23 30 07

ياnoais

يعمل هذا على مجموعة بيانات تحتوي على نطاق كبير من القيم ولكن إذا كان لديك نطاق صغير من القيم ، على سبيل المثال كونك مصفوفة من القيم من 0 إلى 7 ، فمن المحتمل أن يؤدي التكبير بمعامل 2 إلى توفير تسميات مكررة.

على الرغم من أن الحد من عامل التكبير / التصغير قد أدى إلى حل مشكلتك ، إلا أنه لا يحل مشكلة تكرار القيم الكاملة.

لقد حصلت على نتائجي المتوقعة عند تحرير فئة ChartYAxisRenderer التي تشير إلى الالتزام a7e30dd16fbfaecb8e44c01ad8618a3a745fd101.

تم ذلك عن طريق أرضية القيمة.

var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval))
if(_yAxis.valueFormatter?.maximumFractionDigits == 0)
{
    interval = interval < 1 ? 1 : floor(interval)
}

على الرغم من أن هذا نجح (ولكن ليس عند استخدام HEAD من هذا الريبو) ، إلا أنني أشعر أنكم ستعرفون مكانًا أفضل في إطار العمل الخاص بك لوضع هذا لتقديم نفس النتيجة كما هو موضح في gif.

ربما خاصية allowRepeatingValues BOOL على محور. أنتم يا رفاق ستعرفون أفضل.

نعم أنت محق ، كان هذا عملًا واحدًا. اسمحوا لي أن أحاول معرفة ما إذا كان من السهل إنشاء طريقة ما مثل allowRepeatingValues.

سيكون ذلك مفيدًا جدًا ، شكرًا لك.

مرحبًا noais و @ liuxuan30. هل سنحت لك الفرصة للتحقيق في هذا؟ لقد تمكنت من الحصول على التأثير المطلوب باستخدام إطار العمل ولكني لا أعرف أفضل مكان يجب أن تقع فيه هذه الخاصية ضمن إطار العمل وما إذا كانت هناك طريقة أفضل لتحقيق نفس النتيجة.

شكرا على وقتك.

ما زلت أفكر في ذلك لأن المُنسق هو الذي أنتج تسميات مكررة بأرقام صغيرة ، وليس الخوارزمية. إذا قمت بحذف المنسق ، فسوف يعرض الرقم بشكل صحيح ، أليس كذلك؟
يمكنك حلها باستخدام الكود الخاص بك ، لكنني لست متأكدًا مما إذا كانت جيدة لكل واحد.
danielgindi ما رأيك

مرحبًا يا شباب ، التصويت على allowRepeatingValues ​​، لدي أرقام صغيرة ولا أريد عرض صمامات المحور الصادي المكرر

عندما تكون جميع قيمي صفرية ، أحصل على تسميات المحاور المتكررة-
chart

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

ما لا يسمح به هذا المقتطف هو إزالة القيم المكررة ، لذا إذا كانت القيم 1.1, 1.2, 1.2, 1.3 وكنت ترغب في الاحتفاظ بالرقم العشري الوحيد ، فلن يعمل. ستعرفون يا رفاق أفضل مكان وتنفيذ لهذه الميزة ويقضي الأشخاص وقتًا في النظر إلى المشكلات الحالية لإطار العمل ولكي يقوموا بالتصويت ، فإنه يظهر أنه خيار يريده الآخرون أيضًا.

allowRepeatingValues: +1:

noais @ liuxuan30 هل لديك حل أفضل لهذا مما اقترحته؟

كلا ، باستثناء allowRepeatingValues ​​.. لأن مشكلتك الأصلية تتعلق بالتنسيقات. لا تريد أرقامًا عشرية على مستوى ولكن بياناتك في الواقع لها المستوى التالي

من الناحية المثالية ، يجب ألا يُظهر الرسم البياني قيمًا متكررة على الإطلاق! هل يمكن إخفاء القيم المتكررة ببعض المنطق ، مما ينتج عنه قيم فريدة فقط؟

vigyanhoon إنه ليس "تكرار" القيم خلفه ، إنه المنسق الذي يتسبب في "تكرار" القيمة. إذا كنت لا تريد التكرار ، فقم بإعطاء مُنسق عشري يمكنه حلها.

@ liuxuan30 هل يمكن أن تشرح ما تعنيه ب "_إعطاء منسق عشري_"؟ باستخدام بياناتي ، أعطيت مُنسقًا حدد maximumFractionDigits = 0 . لست متأكدًا من كيفية الحصول على النتائج المتوقعة بما هو موجود حاليًا؟ هل تمكنت من إنتاج مخطط بإطار العمل لأنه يعطي نفس النتائج مثل gif الذي نشرته في 28 أغسطس؟

هل قصدت استخدام numberFormatter.allowsFloats = NO ، إذا كانت الإجابة بنعم ، فلم يساعدني ذلك ، ما زلت أرى INTs مكررة ؟! الطريقة الوحيدة التي لم أتمكن من خلالها من عرض القيم المتكررة هي استخدام ملصقين على xAxis (أعلى / أسفل)

steprescott آسف إذا لم أكن واضحًا. لا يجب أن يكون MaximumFractionDigits 0 ، وإلا فسيتم عرض جزء العدد الصحيح فقط. لقد واجهت مشكلات مماثلة ، إذا كان نطاق البيانات صغيرًا وكانت هناك حاجة إلى 5 ~ 6 ملصقات ، فإن إعطاء maxFractionDigits = 0 سيكون له قيم متكررة. لا توجد طريقة سهلة لإصلاح هذا على ما أعتقد. فكر فيما إذا كان نطاق البيانات [0،2] ، ويجب أن أعرض 5 تسميات: 0 ، 0.4،0.8،1.2،1.6 ، 2.0. إذا طبقنا maxFractionDigits = 0 ، فربما يكون 0 ، 0 ، 1 ، 1 ، 2 ، 2

injectios ، ماذا عن MaximumFractionDigits = 2 أو حتى 4؟

مرحبا جميعا!
أواجه نفس المشكلة.

@ liuxuan30 اعتمادًا على نوع البيانات ، ليس من المنطقي أن يكون لديك كسور عشرية. مثل مخطط البشر ، لن يكون لديك أبدًا 1.5 إنسان ، إما 1 أو 2.

jpros لقد حصلت على نقطة ، ولكن من الناحية الحسابية ، لا يمكن أن يكون لدينا 4 تسميات بدون كسور عشرية في النطاق [0،2].

لذلك إما أن تقوم بتشغيل yAxis.showOnlyMinMaxEnabled لتجنب القيم المتكررة كحل بديل في الوقت الحالي ،
أو تقوم بتطبيق منطقك لحساب القيم الخاصة بك في ChartYAxisRenderer.computeAxis لتتجنبها ،
أو علينا انتظار ميزة "allowRepeatValues"

PhilJay هل لدينا أي حل لذلك حاليًا؟ :-)

من Android (و ofc iOS) POV ، هذا السطر هنا: https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartLib/src/com/github/mikephil/charting/renderer/YAxisRenderer.java#L108

يمكن أن يكون موقعًا لمعالجة هذه المشكلة. تم حساب float interval لتسميات المحور ، ويمكن استخدامها لمنع المزيد من التغييرات على التسميات إذا تم تنسيق تسميتين بشكل متساوٍ.
هذا ما يتبادر إلى ذهني عندما أفكر في الأمر بسرعة. ما رأيك؟

لقد تخلصت من الازدواجية بتحديد قيمة قصوى

leftAxis.customAxisMax = maxYLabelCount

vigyanhoon الأمر مختلف تمامًا ، يمكن أن تكون القيم بالملايين ، بينما لا يمكن لـ maxYLabelCount. customAxisMax هو تحديد القيمة القصوى التي يمكن أن يكون نطاق المحور.

+1 لحل مشكلة العرض. لدي أيضًا رسم بياني للأشخاص ، ولدي [0 ، 0 ، 1 ، 1 ، 2 ، 2]. تعيين numberFormatter.maximumFractionDigits على أي شيء بخلاف 0 ليس له أي معنى.

الكود التالي الذي اقترحه steprescott ثابت بالنسبة لي أيضًا. لقد أضفته في مفترقتي هنا:

https://github.com/natanrolnik/ios-charts/commit/01df4d9264e0adbef4db88763075376f4a0f255c

هل سيتمكن العلاقات العامة من إغلاق هذه المشكلة؟ ما رأيك @ danielgindi @ liuxuan30steprescott ؟ هل هناك حالات لا يصلحها هذا الرمز؟ إذا كان الأمر كذلك ، فما هي الحلول الأفضل؟

natanrolnik ماذا لو كبر المستخدم وأصبح النطاق [25.2 ، 25.3]؟ سيكون الفاصل الزمني 1.0 بينما يجب أن يكون ، على سبيل المثال 0.02.
من المفترض أن يكون مفيدًا إذا قام المستخدم بتعيين الحد الأقصى لعدد الكسر على 0 ، فإننا نحصر الفاصل الزمني. لم أختبر القيم السلبية رغم ذلك.
ليس لدينا حل أفضل حتى الآن ، لكنني أعتقد أن ميزة مثل "allowRepeatValues" هي ما يمكننا التفكير فيه؟

أوافق بخصوص allowRepeatedValues !

أعتقد أن steprescott هو حل جيد. يحتاج فقط إلى ضبط القيمة 1 على متغير دقة.

مع هذه المشكلة @ liuxuan30 لم تعد موجودة.

إذا وضعنا هذا الرمز في السطر 75 في ChartYAxisRenderer:

interval = interval < granuality ? granuality : interval       

https://github.com/noais/ios-charts/compare/master...Noais
ما رأيك؟

حسنًا ، هذا مغلق الآن ولكن لم يتم دمجه في شكل رئيسي. متى من المحتمل أن يحدث هذا؟

تم إصدار هذا في 2.2.4 ، كميزة granularity

لست متأكدًا مما إذا كان ينبغي عليّ نشر هذه المشكلة هنا ولكن هذا منطقي بالنسبة لي.

لدي مشكلة مشابهة جدًا مع ملصقات xAxis الخاصة بي. لدي تنسيق IAxisValueFormatter مخصص يقوم بإرجاع سلاسل للوقت ، ويعطي ساعات مثل هذه "22:00" ، "23:00" لبعض الرسوم البيانية ، أيام الأسبوع مثل "الاثنين" ، "الخميس". للآخرين وما إلى ذلك ..

عندما يتم تكبير المخطط كثيرًا ، تبدأ القيم في التكرار كما هو موضح هنا:

Screenshot 2019-07-19 at 17 59 11

في هذه الحالة ، لا تعمل ميزة granularity لأنها تعمل مع الفرق بين الأرقام.

هل لديك أي فكرة عن كيفية منع تكرار هذه التسميات؟

شكرا

ضبط الدقةتمكين العمل الزائف بالنسبة لي
leftAxis.granularityEnabled = true

مرحبًا يا شباب ، أريد عدم تكرار قيمة xAxis عند التكبير
Formater الخاص بي:
func stringForValue (_ value: Double، axis: AxisBase؟) -> سلسلة {
اسمحوا التاريخ = التاريخ (timeIntervalSince1970: القيمة)
تاريخ الإرجاع. formattedString (withDateFormat: .daymonth)
}
كما أنني أستخدم الدقة ، ولكن لا يزال لدي نفس المشكلة
xAxis.granularity = 1.0
xAxis.granularityEnabled = صحيح

يمكن لأي شخص أن يعرف كيفية حلها من فضلك؟

تضمين التغريدة
لدي نفس المشكلة ، هل وجدت الحل؟

لدي نفس المشكلة عندما أجبر عدد تسمية المحور السيني ، وأرسم بضع نقاط.

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