如何使用iOS图表设置X轴标签

27

我最近开始使用ios charts库,但在查找如何使用swift3更新的方式操纵x轴时遇到了问题。

我想要的是用时间值标记x轴,例如2:03:00,2:03:01,2:03:02等。在我找到的在线教程中,这似乎非常容易;其中许多使用年份月份作为x轴标签。

然而,在swift3更新中,charts现在使用x和y值初始化数值,我不确定如何在此版本的库中使用标签。有人知道如何在swift3中创建charts标签吗?


这个问题/答案有帮助吗?:[链接](https://dev59.com/35vga4cB1Zd3GeqP2n73) - Lyra
请考虑评论一下为什么您要对这个问题投反对票。 - pylover
6个回答

69

在Swift 3+中X轴字符串标签的正确解决方案

let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values:months)
    barChartView.xAxis.granularity = 1

粒度将为条形图下的xValues设置适当的位置。 - Maryam Fekri
1
我使用了你的代码来显示xValues,但它是按交替基础显示月份。 - Raj Aggrawal
1
这不是基于你有每个月的数据的假设吗?如果你没有4月份的数据,那么数值格式化程序永远不会传递对应于4月的索引,4月份的标签也不会生成,对吧? - Brian Sachetta
谢谢啊,真的救了我。我已经花了2个小时摆弄了。 - Aisha

16
创建一个像这样的类:
    import Foundation
    import Charts

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

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

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

}

将x轴设置如下:

    let xAxis = XAxis()
    let chartFormmater = ChartFormatter()
    
    for i in index{
        chartFormmater.stringForValue(Double(i), axis: xAxis)
    }
    
    xAxis.valueFormatter = chartFormmater
    chartView.xAxis.valueFormatter = xAxis.valueFormatter

1
花了一些时间,但是在最新的 Charts 库版本中,饼图(Pie Chart)有一个新的入口初始化器叫做 pieChartDataEntry,它需要标签作为参数。 let entry = PieChartDataEntry(value: Double(entryValue), label: label) - Jesus Rodriguez
1
我尝试过这个解决方案,但并没有帮助到我。您能否看一下我的问题 - Amir Shabani
Amir,我去看一下我的项目,我忘了它在哪里了。@AmirShabani - Hamed
@HamedAkhlaghi 我找到了答案,非常感谢 :) - Amir Shabani
我在代码上犯了一个错误,顺便说一下,我使用了类似于你的代码。 - Amir Shabani
显示剩余4条评论

10

Swift 5.5

我使用标准的DateFormatter()取得了相当不错的结果,我将UNIX时间戳转换为日.月的格式。

final class XAxisNameFormatter: NSObject, AxisValueFormatter {
    
    func stringForValue( _ value: Double, axis _: AxisBase?) -> String {
        
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "dd.MM"
        
        return formatter.string(from: Date(timeIntervalSince1970: value))
    }
    
}

使用方法:

self.lineChartView.xAxis.valueFormatter = XAxisNameFormater()
self.lineChartView.xAxis.granularity = 1.0

完美解决方案。 - Pavithra Duraisamy

6

我建议使用更灵活和美观的解决方案。您可以创建一个如下的格式化类:

final class MonthNameFormater: NSObject, IAxisValueFormatter {
    func stringForValue( _ value: Double, axis _: AxisBase?) -> String {
        return Calendar.current.shortMonthSymbols[Int(value)]
    }
}

将此类型设置到您的 barChartView 中:

barChartView.xAxis.valueFormatter = MonthNameFormater()
barChartView.xAxis.granularity = 1.0

作为结果,您将得到:1月,2月,…,12月 另外,如果您想更改演示方式,则应该使用其他的monthSymbols、veryShortMonthSymbols、standaloneMonthSymbols替换 shortMonthSymbols。

关于最新版本的库,有一件事我不太明白:如果我们想要为未输入数据的月份添加标签怎么办?比如说三月没有数据,但是我们仍然想在图表中显示“Mar”。那么,在stringForValue中的“value”是否永远不会等于2(三月)呢? - Brian Sachetta
我过于复杂地思考了这个问题。这个解决方案非常简单!谢谢你!! - Jordan

2
你可以通过创建自己的时间格式化程序来实现这一点。下面是我提供的示例代码,仅供参考。
    public class DateValueFormatter: NSObject, AxisValueFormatter {
    private let dateFormatter = DateFormatter()

    override init() {
        super.init()
        dateFormatter.dateFormat = "HH:mm:ss"
    }

    public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        return dateFormatter.string(from: Date(timeIntervalSince1970: value))
    }
}

要设置您的值,只需使用以下代码。

self.yourChart.xAxis.valueFormatter = DateValueFormatter()
self.yourChart.xAxis.granularity = 1.0

0

我在创建类时遇到了问题,就像之前的答案所述。

'没有名为'IChartAxisValueFormatter'的类型或协议'

我除去了 NSObject 的继承,只留下了 IAxisValueFormatter 像这样:

final class XAxisNameFormater: IAxisValueFormatter {.....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接