如何在iOS图表的X轴上添加string?

随着新版本的发布,我有一些麻烦来创build一些图表,以前的代码是:

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) 

新版本之后,实现相同graphics的代码是:

 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轴值的方法,希望有人能帮助我,谢谢!

我认为这是用string设置x轴标签更完美的解决scheme,不需要创build任何类,如下所示。

Swift 3.0中用于X轴标签的解决scheme: –

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

而已。

欲了解更多详情,请参阅此

我find了解决scheme,也许另一个可以更好地解决这个问题,而无需创build一个新的类,以及这是我发现:

首先你要创build一个新的类,它将是你的格式化程序类,并添加IAxisValueFormater接口,然后使用方法stringForValue来定制新的值,它需要两个参数,第一个是实际值(你可以看到它索引),其次是值的轴。

 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()函数开始的文件中,您必须为您的格式化程序类和轴类创build两个variables:

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

接下来,在for循环结束处继续,并将索引和轴传递给您的格式化程序variables:

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

循环后,将格式添加到您的轴variables:

 xaxis.valueFormatter = formato 

最后一步是将新的xax格式添加到barChartView:

 barChartView.xAxis.valueFormatter = xaxis.valueFormatter 

这就是setChart()函数中的所有其他行,只要保持它在哪里,我希望它可以帮助你。

如果你inheritance一个图的话,一个更清晰的方法来实现上面的build议,就是在你的子类中实现IAxisValueFormatter协议

 class CustomGraphView : LineChartView, ChartViewDelegate, IAxisValueFormatter {} 

喜欢这个…

 public func stringForValue(_ value: Double, axis: Charts.AxisBase?) -> String { return "My X Axis Label Str"; // Return you label string, from an array perhaps. } 

然后在你的init()

 self.xAxis.valueFormatter = self; 

你好,最近我也被困住了,我试过了这个方法 –

 class ViewController: UIViewController { var months: [String]! var unitsSold = [Double]() weak var axisFormatDelegate: IAxisValueFormatter? @IBOutlet var viewForChart: BarChartView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. axisFormatDelegate = self months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0] // setChart(_ dataPoints:months,_ forY: unitsSold) setChart(dataEntryX: months, dataEntryY: unitsSold) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func setChart(dataEntryX forX:[String],dataEntryY forY: [Double]) { viewForChart.noDataText = "You need to provide data for the chart." var dataEntries:[BarChartDataEntry] = [] for i in 0..<forX.count{ // print(forX[i]) // let dataEntry = BarChartDataEntry(x: (forX[i] as NSString).doubleValue, y: Double(unitsSold[i])) let dataEntry = BarChartDataEntry(x: Double(i), y: Double(forY[i]) , data: months as AnyObject?) print(dataEntry) dataEntries.append(dataEntry) } let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units Sold") let chartData = BarChartData(dataSet: chartDataSet) viewForChart.data = chartData let xAxisValue = viewForChart.xAxis xAxisValue.valueFormatter = axisFormatDelegate } } 

最后只是为代表添加了扩展名

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

从这个链接我学到了https://medium.com/@skoli/using-realm-and-charts-with-swift-3-in-ios-10-40c42e3838c0#.minfe6kuk

正如很多人所说的,你可以创build一个类或使用IAxisValueFormattertypes来扩展,但是你可以很容易的使用下面的方法,只需要3行:

 self.chartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: {(index, _) in return xStrings[Int(index)] }) 

这里是我的setChart()函数,以防有些人发现我的一些自定义有趣:

 func setChartView(entriesData: [entry]) { var chartEntries: [ChartDataEntry] = [] var xStrings: [String] = [] let sortedentriesData = entriesData.sorted { (s1: entry, s2: entry) -> Bool in return s1.timestamp < s2.timestamp } for (i, entry) in sortedentriesData.enumerated() { let newEntry = ChartDataEntry(x: Double(i), y: entry.temperature) chartEntries.append(newEntry) let dateFormatter = DateFormatter() dateFormatter.timeStyle = .medium dateFormatter.dateStyle = .none xStrings.append("\(dateFormatter.string(from: Date.init(timeIntervalSince1970: TimeInterval(entry.timestamp))))") } let set: LineChartDataSet = LineChartDataSet(values: chartEntries, label: "°C") set.setColor(NSUIColor.blue, alpha: CGFloat(1)) set.circleColors = [NSUIColor.blue] set.circleRadius = 3 set.mode = LineChartDataSet.Mode.cubicBezier let data: LineChartData = LineChartData(dataSet: set) self.chartView.xAxis.labelRotationAngle = -90 self.chartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: {(index, _) in return xStrings[Int(index)] }) self.chartView.xAxis.setLabelCount(xStrings.count, force: true) self.chartView.data = data } 

条目是我创build的结构:

 struct entry { var timestamp: Int var temperature: Double }