Charts: كيفية تعديل قيم المحور X سويفت؟

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

مع الإصدار الجديد ، واجهت بعض المشاكل لإنشاء بعض الرسوم البيانية ، وكان الكود السابق:

func setChart(dataPoints: [String], values: [Double]) {
var dataEntries: [BarChartDataEntry] = []

for i in 0..<dataPoints.count {
    let dataEntry = BarChartDataEntry(value: values[i], xIndex: i)
    dataEntries.append(dataEntry)
}

let chartDataSet = BarChartDataSet(yVals: dataEntries, label: "Units Sold")
let chartData = BarChartData(xVals: months, dataSet: chartDataSet)
barChartView.data = chartData
}

يمكنك تمرير القيم على سبيل المثال مصفوفة من الأشهر باستخدام السطر:

let chartData = BarChartData(xVals: months, dataSet: chartDataSet)

بعد الإصدار الجديد ، يكون الكود لتنفيذ نفس الرسم البياني هو:

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

    var dataEntries: [BarChartDataEntry] = []

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

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold")

    let chartData = BarChartData()
    chartData.addDataSet(chartDataSet)
    barChartView.data = chartData

}

كنت أحاول بضع ساعات ولكن لم أجد طريقة لتعديل قيم المحور X ، آمل أن يتمكن أحدهم من مساعدتي ، شكرًا !!

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

لدي مشكلة مماثلة. الوثائق قصيرة جدًا ، لكن العمل باستخدام المحور x يتطلب بعض أسطر التعليمات البرمجية. باستخدام الكود المقدم من ajimenezjulio ، قمت بعمل امتداد للفئة لتبسيط استخدام BarChartView. ربما سيكون مفيدًا لشخص ما.

extension BarChartView {

    private class BarChartFormatter: NSObject, IAxisValueFormatter {

        var labels: [String] = []

        func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            return labels[Int(value)]
        }

        init(labels: [String]) {
            super.init()
            self.labels = labels
        }
    }

    func setBarChartData(xValues: [String], yValues: [Double], label: String) {

        var dataEntries: [BarChartDataEntry] = []

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

        let chartDataSet = BarChartDataSet(values: dataEntries, label: label)
        let chartData = BarChartData(dataSet: chartDataSet)

        let chartFormatter = BarChartFormatter(labels: xValues)
        let xAxis = XAxis()
        xAxis.valueFormatter = chartFormatter
        self.xAxis.valueFormatter = xAxis.valueFormatter

        self.data = chartData
    }
} 

إستعمال

func setChart(){
        let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let unitsSold = [20.0, 4.0, 3.0, 6.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

        barChartView.setBarChartData(xValues: months, yValues: unitsSold, label: "Monthly Sales")
    } 

ال 33 كومينتر

أقوم بتعديل قيمة المحور السيني في المخطط المبعثر وهو يعمل الآن.
لقد وجدت نقطتين:

1: let dataEntry = BarChartDataEntry (x: Double (i + 2)، y: القيم [i] ، البيانات: شهور)
استخدم ChartDataEntry (x، y) بدلاً من أسلوب BarChartDataEntry.

2: اسمحوا chartData = BarChartData () -> دع مخطط بيانات = BarChartData (مجموعة بيانات)

أتمنى أن يساعدك.

شكرًا لك NyoSeint ، أنت محق في طريقتك يمكنك تعديل المحور x ولكن بطريقة رقمية فقط ، أحاول وضع سلاسل في هذه الحالة أشهر في المحور x

هل راجعت ChartsDemo؟ أعتقد أن هناك إجابات.

أنا أيضًا أبحث عن إجابة لهذا ، فتحت قضية في وقت سابق هنا - https://github.com/danielgindi/Charts/issues/1331

تعذر العثور على إجابة في العروض التوضيحية ، يرجى إعلامي إذا وجدت حلاً. شكرا

لقد وجدت الحل ، ربما يمكن لشخص آخر حل هذه المشكلة بطريقة أفضل ، دون إنشاء فصل جديد ، حسنًا هذا ما وجدته:

أولاً ، يجب عليك إنشاء فئة جديدة ، والتي ستكون فئة المنسق الخاصة بك وإضافة واجهة IAxisValueFormater ، ثم تستخدم سلسلة السلسلة ForValue لتخصيص القيم الجديدة ، فهي تأخذ معلمتين ، الأولى هي القيمة الفعلية (يمكنك رؤيتها مثل الفهرس) والثاني هو المحور حيث القيمة.

import UIKit
import Foundation
import Charts

@objc(BarChartFormatter)
public class BarChartFormatter: NSObject, IAxisValueFormatter{

var months: [String]! = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]


public func stringForValue(value: Double, axis: AxisBase?) -> String {

    return months[Int(value)]
}

}

الآن في ملفك في بداية دالة setChart () ، عليك إنشاء متغيرين أحدهما لفئة المنسق والآخر لفئة المحور:

let formato:BarChartFormatter = BarChartFormatter()
let xaxis:XAxis = XAxis()

بعد ذلك ، تابع في نهاية حلقة for in ومرر الفهرس والمحور إلى متغير التنسيق:

formato.stringForValue(Double(i), axis: xaxis)

بعد التكرار ، أضف التنسيق إلى متغير المحور:

xaxis.valueFormatter = formato

الخطوة الأخيرة هي إضافة xaxisformatted الجديد إلى barChartView:

barChartView.xAxis.valueFormatter = xaxis.valueFormatter

وهذه هي كل الأسطر الأخرى في وظيفة setChart () فقط احتفظ بها في مكانها ، وآمل أن تساعدك.

ajimenezjulio هذه هي الطريقة الصحيحة بالفعل :-)

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

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

يرجى إعادتنا طريقة سهلة لتخصيص المحور xaxis.
الإصدار السابق كان لطيفًا جدًا لذلك! (أو على الأقل برنامج تعليمي لكل من Swift / Objc)

شكرا.

أي تحديث ؟

@ dante20007 معذرة ، لا يمكنك الحصول عليها كلها. يريد الأشخاص أن يكونوا قادرين على إضافة مدخلات في أي مؤشر x ، ليس فقط 0 ، 1 ، 2 ، ولكن أيضًا 0 ، 1.3 ، 2.7 ... لا يمكن للمصفوفة أن تمثل تسميات لمثل هذه القيم.

ماذا لو أردنا عرض الأشهر على المحور X؟ غير ممكن ايضا؟

شكرا.

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

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

هذه طريقة سهلة لتخصيص مشكلتي وهي أنه عندما أنتقل إلى اليمين أبدأ في العرض مرة أخرى لذلك أقوم بتعديل lib وأتجاهل إذا كان الفهرس عند التقديم

آسف كنت أتحدث عن "كيفية تعديل قيم X Axis Swift؟" باستخدام السلاسل

نعم و انا ايضا. لقد استخدمت نفس إجابةajimenezjulio

أنا أحتفظ بمشروع موجود في Objective-C ، وعلى الرغم من أنني تمكنت من إعادة إنتاج إجابة ajimenezjulio ، فلن يتم تجميعها: لسبب ما لم يتم التعرف على IAxisValueFormatter مطلقًا.

لدي مشكلة مماثلة. الوثائق قصيرة جدًا ، لكن العمل باستخدام المحور x يتطلب بعض أسطر التعليمات البرمجية. باستخدام الكود المقدم من ajimenezjulio ، قمت بعمل امتداد للفئة لتبسيط استخدام BarChartView. ربما سيكون مفيدًا لشخص ما.

extension BarChartView {

    private class BarChartFormatter: NSObject, IAxisValueFormatter {

        var labels: [String] = []

        func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            return labels[Int(value)]
        }

        init(labels: [String]) {
            super.init()
            self.labels = labels
        }
    }

    func setBarChartData(xValues: [String], yValues: [Double], label: String) {

        var dataEntries: [BarChartDataEntry] = []

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

        let chartDataSet = BarChartDataSet(values: dataEntries, label: label)
        let chartData = BarChartData(dataSet: chartDataSet)

        let chartFormatter = BarChartFormatter(labels: xValues)
        let xAxis = XAxis()
        xAxis.valueFormatter = chartFormatter
        self.xAxis.valueFormatter = xAxis.valueFormatter

        self.data = chartData
    }
} 

إستعمال

func setChart(){
        let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
        let unitsSold = [20.0, 4.0, 3.0, 6.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

        barChartView.setBarChartData(xValues: months, yValues: unitsSold, label: "Monthly Sales")
    } 

مهلا ، هل يمكن أن يكون لديك تمديد الرسوم البيانية الأخرى أيضا؟

تظهر لي رسالة الخطأ "لا يتوافق BarChartFormatter مع بروتوكول IAxisValueFormatter.

لماذا فعلت هذا؟ كان من السهل جدًا استخدامه في Android Studio. هل يعرف أي شخص كيفية الحصول على مصفوفة ["J" ، "F" ، إلخ ... في المحور X؟ أنا مشدود هنا. هذه "الأمثلة فوق مستوى مهارتي.

هل هناك حل لـ ObjC لتنسيق المحور X بتسميات مخصصة؟

في YourViewControllerViewController يعلنون أشهر مختلفة: [String] = سلسلة وتعيين قيم الشهر الذي تحتاجه
extension YourViewControllerViewController: IAxisValueFormatter {
func stringForValue (_ value: Double، axis: AxisBase؟) -> سلسلة {
إرجاع الأشهر [Int (القيمة)٪ months.count]
}
}

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

نعم ، أتمنى لو فهمت أكثر كيف يتم استدعاء stringForValue وكيف يغير تخصيصك للمخطط / البيانات كيفية استدعائها لبياناتك. لقد قمت ببعض هذا الفحص لتجنب الفهرس خارج النطاق. نوع من إسعافات أولية على الرغم من 🤷‍♂️

       func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            let index = Int(value)
            if index < labels.count && index >= 0 {
                return labels[index]
            } else {
                return ""
            }
        }

زر الفتح

robotsquidward - أنا أيضًا. سيكون من الجيد أن توضح الوثائق كيفية عملها أو ، الأفضل من ذلك ، أظهر أحد العروض التوضيحية كيفية القيام بذلك. أتخيل أن هناك الكثير من الأشخاص الذين يحتاجون إلى استخدام سلاسل للتسميات ولكن لا يوجد تفسير واضح أو مثال يمكنني أن أجده مفيدًا. لقد رأيت للتو مجموعة من الإجابات التي تقول look at stringForValue() . تنهد...

تضمين التغريدة
شكرا جزيلا على التمديد! إنه يعمل بشكل رائع. أنا أستخدم مخططًا خطيًا ، لذلك قمت بتعديل الكود قليلاً. إنه يعمل ، ولكن لدي خطأ بصري. هل لديك أي فكرة عن سبب عدم محاذاة الأيام على المحور X بشكل صحيح؟ كما يتم عرض الاثنين والأربعاء مرتين على التوالي.
انظر لقطة الشاشة: https://imgur.com/a/OG7OuSY

dataContent1 = ["MON"، "TUE"، "WED"، "THU"، "FRI"]
dataContent2 = [230، 320، 403، 430، 312]
chartView.setLineChartData (xValues: dataContent1، yValues: dataContent2، label: "BTC")

تضمين التغريدة
تحتاج إلى تعيين عدد تسمية لـ xAxis. إذا كنت تستخدم رمزًا كما هو الحال في ملحق خاص بي ، فقم فقط بإضافة سلسلة واحدة في دالة setLineChartData الخاصة بك:
self.xAxis.setLabelCount(xValues.count, force: true)

benzai لقد وجدت أنني اضطررت إلى تعديل نهج AlexSmet قليلاً وتعيين force: false لعرض مخطط بياني لمدة 12 شهرًا بشكل صحيح:

barChartView.xAxis.setLabelCount(dataPoints.count, force: false)

عندما تم تعيين force إلى true ، سيطلب المخطط قيم xAxis غريب الأطوار في مفوض المنسق (على سبيل المثال -0.5 بدلاً من 0.0) ولم تتم محاذاة التسميات بشكل صحيح مع yValue المقابلة.

تشير علامة التوثيق إلى أنه "إذا كان هذا صحيحًا ، فسيتم فرض العدد المحدد من تسميات y" مما يعني أن هذا مخصص خصيصًا لعناوين y ولكن يبدو أنه ينطبق على كل من تسميات المحور x و y ، أليس كذلك؟

هل يمكنني تعيين تسمية السلسلة في المحور الأيسر؟

إلى LineChart:

self.lineChart.xAxis.valueFormatter = IndexAxisValueFormatter(values: self.chartLabels)
self.lineChart.xAxis.avoidFirstLastClippingEnabled = true

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

tE1U5
أريد رسم هذا النوع من الرسم البياني الخطي.
بين فترتين زمنيتين ، كيف تضيف نقاط متعددة؟ (مثال ، يريد عرض نقاط متعددة بين الساعة 7 صباحًا و 8 صباحًا)

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