首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在iOS-charts中添加X轴上的字符串?

如何在iOS-charts中添加X轴上的字符串?
EN

Stack Overflow用户
提问于 2016-08-20 08:00:09
回答 5查看 28.8K关注 0票数 27

在新版本中,我在创建一些图形时遇到了一些麻烦,之前的代码是:

代码语言:javascript
复制
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
}

您可以使用下面的代码行来传递这些值,例如一个月份数组:

代码语言:javascript
复制
let chartData = BarChartData(xVals: months, dataSet: chartDataSet)

在新版本之后,实现相同图形的代码是:

代码语言:javascript
复制
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轴值的方法,我希望有人能帮助我,谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-08-25 23:21:25

我找到了解决方案,也许另一个可以更好地解决这个问题,而不需要创建一个新的类,这就是我发现的:

首先您需要创建一个新类,它将是您的格式化器类并添加IAxisValueFormater接口,然后您使用stringForValue方法来自定义新值,它有两个参数,第一个是实际值(您可以像索引一样看到它),第二个是值所在的轴。

代码语言:javascript
复制
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()函数的开头,您必须创建两个变量,一个用于格式化器类,另一个用于axis类:

代码语言:javascript
复制
let formato:BarChartFormatter = BarChartFormatter()
let xaxis:XAxis = XAxis()

接下来,继续执行for in循环的末尾,并将索引和轴传递给格式化程序变量:

代码语言:javascript
复制
formato.stringForValue(Double(i), axis: xaxis)

在循环之后,将格式添加到您的轴变量:

代码语言:javascript
复制
xaxis.valueFormatter = formato

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

代码语言:javascript
复制
barChartView.xAxis.valueFormatter = xaxis.valueFormatter

这就是setChart()函数中的所有其他行,只要保持它的位置就可以了,希望它能对您有所帮助。

票数 16
EN

Stack Overflow用户

发布于 2017-01-20 19:31:56

您好,最近我遇到了同样的问题,并以这种方式解决了它-

代码语言:javascript
复制
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

    }
}

在最后,只需添加委托的扩展

代码语言:javascript
复制
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找到了这个解决方案

票数 22
EN

Stack Overflow用户

发布于 2017-02-24 08:33:42

正如许多人所说的,你可以创建一个类或者用IAxisValueFormatter类型扩展,但是你可以很容易地使用下面的方法,它只需要3行代码:

代码语言:javascript
复制
self.chartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: {(index, _) in
    return xStrings[Int(index)]
})

下面是我的setChart()函数,以防您对我的一些定制感兴趣:

代码语言:javascript
复制
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
}

entry是我创建的一个结构:

代码语言:javascript
复制
struct entry {
    var timestamp: Int
    var temperature: Double
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39049188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档