Charts: LineChart X-Axis - كيفية عرض التسمية الأولى والأخيرة دائمًا

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

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

screen shot 2016-12-25 at 7 00 36 pm

إذا كان هناك المزيد من إدخالات البيانات ، فستبدو أكثر مثل هذا:

screen shot 2016-12-25 at 7 00 50 pm

المشكلة التي أواجهها هي أن التسمية الأخيرة على المحور السيني لا تظهر. هذه بيانات من آخر 30 يومًا ، لذا أود أن تظهر التسمية الأخيرة ، 25 كانون الأول (ديسمبر). هل هناك طريقة لجعل المخطط الخطي يعرض دائمًا التسمية الأولى والأخيرة على المحور X؟ لا يهمني كيف يحسب أو يتخطى التسميات بينهما.

bug

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

    lineChart?.xAxis.setLabelCount(arrOfMonth.count, force: true)

سيساعد هذا في عرض القيمة الأخيرة للمخطط الخطي - لقد حاولت وعملت من أجلي

ال 21 كومينتر

جرب 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 أستخدم مصفوفة سلسلة مخصصة

هذه لقطة شاشة للرسم البياني الخاص بي

untitled

هذا هو شكل الرسم البياني الخاص بي عند تعيين avoidFirstLastClippingEnabled على القيمة true:

screen shot 2016-12-28 at 11 02 15 pm

إليك بعض التعليمات البرمجية الإضافية التي أستخدمها لإعداد المحور السيني الخاص بي:

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 ، يتصرف المحور س مثل المحور ص ، لذا يمكنك التحقق من تسميات المحور ص ، أكبر تسمية للمحور الصادي أصغر من القيمة القصوى للبيانات ، في
image

في 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)

سيساعد هذا في عرض القيمة الأخيرة للمخطط الخطي - لقد حاولت وعملت من أجلي

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

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

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

JW00332 picture JW00332  ·  4تعليقات

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

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

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