في المخطط الخطي الخاص بي ، قمت بإعداده بحيث إذا كان هناك إدخال بيانات واحد فقط ، فأنا أجعل نقطة البيانات تظهر في المنتصف مثل هذا:
إذا كان هناك المزيد من إدخالات البيانات ، فستبدو أكثر مثل هذا:
المشكلة التي أواجهها هي أن التسمية الأخيرة على المحور السيني لا تظهر. هذه بيانات من آخر 30 يومًا ، لذا أود أن تظهر التسمية الأخيرة ، 25 كانون الأول (ديسمبر). هل هناك طريقة لجعل المخطط الخطي يعرض دائمًا التسمية الأولى والأخيرة على المحور X؟ لا يهمني كيف يحسب أو يتخطى التسميات بينهما.
جرب avoidFirstLastClippingEnabled
، الافتراضي هو خطأ.
/// if set to true, the chart will avoid that the first and last label entry in the chart "clip" off the edge of the chart
open var avoidFirstLastClippingEnabled = false
@ cnowak7 هل استطعت حل المشكلة المذكورة في الصورة الثانية؟ يرجى مشاركة الحل
avoidFirstLastClippingEnabled
لا يساعد. يتم قطع الملصق الأخير دائمًا
إذا نظرت إلى الكود المصدري ، فسيتم حساب إدخالات المحور بـ AxisRendererBase.computeAxisValues
ولا توجد طريقة لفرض القيمة القصوى التي سيتم عرضها. أعتقد أن هذه الوظيفة كانت مدعومة في الإصدار السابق بالرغم من ذلك.
يبدو https://github.com/danielgindi/Charts/issues/2007 نفس المشكلة مع هذا واحد؟
ondrejhanslik افتراضيًا ، تأخذ computeAxisValues () قيمة دنيا وأقصى لحساب النطاق. لذلك يجب أن تكون قيمة min و max أكبر من قيمة min / max للبيانات للاحتفاظ بجميع البيانات. هل راجعت ما هي قيمة الحد الأدنى / الأقصى في computeAxisValues () ، وما هي قيمة الحد الأدنى / الأقصى لبياناتك؟
@ liuxuan30 أستخدم مصفوفة سلسلة مخصصة
هذه لقطة شاشة للرسم البياني الخاص بي
هذا هو شكل الرسم البياني الخاص بي عند تعيين avoidFirstLastClippingEnabled
على القيمة true:
إليك بعض التعليمات البرمجية الإضافية التي أستخدمها لإعداد المحور السيني الخاص بي:
private func setUpLineChartPreferences() {
.
.
.
// x-axis
self.lineChart.xAxis.labelPosition = .bottom
self.lineChart.xAxis.drawGridLinesEnabled = true
self.lineChart.xAxis.granularity = 1.0
.
.
.
}
private func setUpLineChart(withDataEntries entries: [ChartDataEntry]) {
let entryCount = entries.count
if entryCount > 0 {
let dataSet = LineChartDataSet(values: entries, label: nil)
dataSet.drawFilledEnabled = true
dataSet.fillColor = .green
dataSet.circleRadius = 5
dataSet.drawValuesEnabled = false
dataSet.setColor(.black)
dataSet.highlightColor = .green
dataSet.setCircleColor(.blue)
let lineChartData = LineChartData(dataSet: dataSet)
self.lineChart.data = lineChartData
// SET UP X-AXIS
self.lineChart.xAxis.valueFormatter = IndexAxisValueFormatter(values: self.chartLabels)
self.lineChart.xAxis.avoidFirstLastClippingEnabled = true
print("NOWAK: CHART LABELS THO - \(self.chartLabels)")
if entryCount == 1 {
self.lineChart.xAxis.axisMinimum = -1.0
self.lineChart.xAxis.axisMaximum = 1.0
} else {
self.lineChart.xAxis.axisMinimum = 0.0
self.lineChart.xAxis.axisMaximum = Double(self.chartLabels.count - 1)
}
print("X MIN IS \(self.lineChart.xAxis.axisMinimum) AND X MAX IS \(self.lineChart.xAxis.axisMaximum)")
} else {
self.lineChart.noDataText = "No Stats For The Past \(self.currentFilter.capitalized)"
self.lineChart.setNeedsDisplay()
}
switch self.currentFilter {
case "week":
self.weekFilterButton.backgroundColor = .blue
self.monthFilterButton.backgroundColor = .darkGray
self.yearFilterButton.backgroundColor = .darkGray
case "month":
self.monthFilterButton.backgroundColor = .blue
self.weekFilterButton.backgroundColor = .darkGray
self.yearFilterButton.backgroundColor = .darkGray
case "year":
self.yearFilterButton.backgroundColor = .blue
self.weekFilterButton.backgroundColor = .darkGray
self.monthFilterButton.backgroundColor = .darkGray
default:
print("ERROR SETTING FILTER BUTTON BACKGROUND COLORS")
}
self.stopLoading()
}
بالمناسبة أنا أستخدم الرسوم البيانية 3.0.1 :)
كذلك هنا. الرسوم البيانية 3.0.1 و XCode 8.0 و Swift 3.0
إذا لم يكن الحل ممكنًا لهذا الموقف ، أعتقد أن الحل الذي من المحتمل أن يكون منطقيًا هو ، عند عرض المخطط ، إبراز القيمة الأخيرة (اليوم) حتى يظهر "BalloonMarker" ويعرض النص "Dec XX \ n500 ".
من جانبي بوضوح :)
حسنا راجعتها.
في المخطط 3.0 ، يتصرف المحور س مثل المحور ص ، لذا يمكنك التحقق من تسميات المحور ص ، أكبر تسمية للمحور الصادي أصغر من القيمة القصوى للبيانات ، في
في computeAxisValues()
، يقرأ الحد الأدنى والحد الأقصى للقيمة من قيمة الحد الأدنى / الأقصى للمحور (وهي قيمة الحد الأدنى / الحد الأقصى للبيانات) ويحسب الفاصل الزمني للحصول على تسميات المحور س.
على سبيل المثال في ChartsDemo - Line Chart Dual YAxis ، إذا كانت قيم x الخاصة بي من 0 إلى 20 ،
يأخذ computeAxisValues()
0 ، 20 كقيمة دنيا / قصوى ، ثم ، labelCount
هو 6 بشكل افتراضي ، وسوف يحسب rawInterval = (max - min) / labelCount
، وبعد ذلك سيكون الفاصل الزمني النهائي هو 3. ثم يبدأ من 0 ، للحصول على 7 (labelCount + 1) تسميات ، وهي 0،3،6،9،12،15،18. تسميات المحور س الأخيرة هي 18 وليس 20.
السبب في عدم عمل isAvoidFirstLastClippingEnabled
هو أنه يعالج عندما تكون التسمية الأخيرة خارج النطاق ، لذلك فهي غير ذات صلة بهذه المشكلة.
إذا كنت تريد التأكد من أن التصنيف يمثل قيمة x لبياناتك ، فيجب عليك تعديل computeAxisValues()
لإرجاع الملصقات. فقط قم بإلقاء نظرة على computeAxisValues()
لترى التفاصيل ويجب أن تكون قادرًا على تغييرها.
danielgindi ما رأيك في حالات المستخدم هذه؟
@ liuxuan30 لا نريد تعديل computeAxisValues
لإرجاع بعض الملصقات المحددة. على سبيل المثال ، عندما أعرض مخططًا خلال التواريخ (على سبيل المثال ، قيم x هي أيام الأسبوع أو أيام الشهر أو أشهر السنة) ، أحتاج إلى عرض التسميات الأولى والأخيرة (على سبيل المثال ، الاثنين والأحد أو 1 / 1 و 31/1).
أقوم أولاً بإنشاء القيم المنسقة (على سبيل المثال ، أسماء الأيام أو الأيام المنسقة) ثم قم بتعيينها على النحو التالي:
xAxis.axisMinimum = 0
xAxis.axisMaximum = Double(xValues.count - 1)
xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues)
ما أحتاجه هو computeAxisValues
أكثر ذكاءً والذي سيعرض دائمًا التسمية الأولى والتسمية الأخيرة ثم يحسب الملصقات بينهما.
هذه حالة استخدام أساسية وشائعة جدًا.
أنا أفهم. لا تزال هناك أخطاء حول تسميات المحور س ، مثل تداخل الملصقات.
المنطق الحالي هو معرفة القيمة الدنيا / القصوى أولاً ، وإنشاء فترات زمنية منه والتراكم للحصول على تسميات المحور. ومع ذلك ، فإن computeAxisValues()
لا يضمن أن القيمة القصوى / التسمية الأخيرة هي xAxis.axisMaximum. هذا ما أحتاجه إلى مدخلات
ربما يجب علي استخدام "override" بدلاً من "tweak" لـ computeAxisValues (). يمكنك توفير تطبيق للتأكد من عرض القيمة الأولى / الأخيرة دائمًا كحل بديل. ومع ذلك ، قد يتسبب هذا في خروج التسمية عن نطاق الالتزام أو مشكلات أخرى.
طريقة أخرى ، يمكنك تجربة setLabelCount(count, forceLabelEnabled)
يساوي عدد قيم x أو نصفها لترى النتيجة.
المنطق مختلف تمامًا إذن:
// force label count
if axis.isForceLabelsEnabled
{
interval = Double(range) / Double(labelCount - 1)
// Ensure stops contains at least n elements.
axis.entries.removeAll(keepingCapacity: true)
axis.entries.reserveCapacity(labelCount)
var v = yMin
for _ in 0 ..< labelCount
{
axis.entries.append(v)
v += interval
}
n = labelCount
}
لا تتضمن العملية الإضافية ، فقط الرياضيات البسيطة.
@ liuxuan30 ماذا لو كانت قيم المحور السيني بتنسيق String؟ في حالتي ، قيم المحور x هي تواريخ بتنسيق String
@ vaibhav-varshaaweblabs المحور x الآن يأخذ المضاعفة فقط في الرسم البياني 3.x ، لذا يمكنك استخدام valueFormatter لعرض التسمية بدلاً من المضاعفة. ومع ذلك ، قد تكون قيمة valueFormatter معقدة ، عندما تحتاج إلى التفكير في التكبير / التمرير
هل وجد أي شخص حلاً لهذا في الرسوم البيانية 3.0.2؟ أنا أستخدم سلاسل التاريخ لملصقات المحور السيني الخاصة بي وأرى التسمية الأخيرة تختفي من حين لآخر ، ولكني أواجه مشكلة في إعادة الإنتاج. هذا مع تعيين isAvoidFirstLastClippingEnabled
على true
. أتساءل عما إذا كان هذا يمكن أن يكون مرتبطًا بالرقم 2563؟
@ vaibhav-varshaaweblabsraudabaugh: كيف ش اللاعبين تمكنوا من سلاسل مؤامرة على المحور السيني، كأسلوب setDataCount تتوقع صحيح أو مزدوجة قيم X و Y.
يرجى إعلامي ، شكرًا مقدمًا
bottomAxis.setLabelCount (إدخالات حجم () ، صواب) ؛ وقم أيضًا بتعيين الهامش على اليمين لجعل العد الأخير مرئيًا.
lineChart?.xAxis.setLabelCount(arrOfMonth.count, force: true)
سيساعد هذا في عرض القيمة الأخيرة للمخطط الخطي - لقد حاولت وعملت من أجلي
التعليق الأكثر فائدة
سيساعد هذا في عرض القيمة الأخيرة للمخطط الخطي - لقد حاولت وعملت من أجلي