iOS图表库

时间:2016-10-02 14:08:15

标签: ios swift charts mpandroidchart ios-charts

我正在使用iOSCharts快速通过@ danielgindi https://github.com/danielgindi/Charts

所以这是我的数据集

let dateArray = [26,27,28,29,30,01,02]
        let values = [11.0,5.0,0.0,0.0,4.0,1.0,0.0]

        var dataEntries: [BarChartDataEntry] = []

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

        let data = BarChartData()
        let ds1 = BarChartDataSet(values: dataEntries, label: "Hello")
        ds1.colors = [NSUIColor.red]
        data.addDataSet(ds1)




        self.barChartView.data = data

         self.barChartView.fitBars = true

        self.barChartView.gridBackgroundColor = NSUIColor.white

        self.barChartView.chartDescription?.text = ""

我期待的是这个 enter image description here

但我得到的是这个

enter image description here

因此,您可以看到问题在下面

1)图表从上面的一个网格开始,你会看到底部的空间 2)xaxis标签不同,我不知道如何设置它们。 3)我想将x轴和y轴标签显示为int而不是double。

3 个答案:

答案 0 :(得分:1)

查看ChartsDemo项目中BarchartViewController的主版本,它会实现您的两个问题:

1)左轴对齐,见:

https://github.com/danielgindi/Charts/blob/master/ChartsDemo/Classes/Demos/BarChartViewController.m#L76

具体来说,你想在左轴上设置axisMinimum,例如它是:

self.barChartView.leftAxis.axisMinimum = 0.0

2)X轴值格式化。

这个有点棘手。您可以从ChartsDemo借用DayAxisValueFormatter,但这是Objective-C代码,因此您需要熟悉将Objective-C添加到项目中。

你也可以通过让你的视图控制器成为IAxisValueFormatter来实现你所要求的,并且实现如下:

class MyViewController: UIViewController, IAxisValueFormatter {

    var dateArray: [Int] = [26,27,28,29,30,01,02] //member variable

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

    //edit:  forgot to say this earlier, you need to do this somewhere in your bar graph setup code
    self.barChwrtView.xAxis.formatter = self
}

只要您更新图表,就可以保持dateArray和值同步。

答案 1 :(得分:0)

您的第二个问题是X标签问题,是由此行引起的:

让dataEntry = BarChartDataEntry(x:Double(i),y:values [i])

当我怀疑你打算将它设置为x时,i值仅设置为Double(dateArray[i])(作为双倍),如下所示:

让dateArray = [26,27,28,29,30,01,02]         let values = [11.0,5.0,0.0,0.0,4.0,1.0,0.0]

var dataEntries: [BarChartDataEntry] = []

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

使用zipmap

可以缩短此代码
let dataEntries = zip(dateArray, values).map(BarChartDataEntry.init(x:y:))

此代码会将dateArray的每个日期与value的值配对。然后,通过传递到BarChartDataEntry.init(x:y:)初始值设定项来转换这些对。这种技术很好,因为它不需要dataEntries可变。

答案 2 :(得分:0)

尝试leftAxis.axisMinValue = 0.0