iOS图表:条形图间距和位置

问题描述 投票:0回答:1

目的

我试图在条形图中显示来自两组(ACTIVE和REST)的数据。这些集是交替的(意味着有一个ACTIVE间隔,后面是REST间隔等等)。相反,每两个ACTIVE集之间有一个REST集。

我用过的代码如下,供参考。然而,我遇到了杆位和间距的问题。

问题:中心条为x值

第一个问题,条形图不以相应的x值为中心。在下面的示例中,第一个橙色条的x = 1。

enter image description here

它明显从x轴上的值1开始(其最左侧对应于约1),但我希望它以x轴上的1值为中心

问题:条间距

由于某种原因,条形交叉点和间距不相等(见截图)。请注意第2栏和第3栏之间的空白区域,以及第1栏和第2栏之间没有空格。

这里的相关代码是:

let barWidth = 1.0
let barSpace = 0.10
let groupSpace = 0.1

chartData.groupBars(fromX: 1, groupSpace: groupSpace, barSpace: barSpace)
chartData.barWidth = barWidth

索引栏和BarChartDataEntry

每个集合(REST和ACTIVE)来自不同的值数组。

如果我按下第一个REST栏,我想在第一个ACTIVE栏上获得相应的值0,值0也是。第二个活动条,值1 ...

但是,在chartValueSelected中,使用entry.x值给出条形图在轴上的x位置(不是我在代码中设置的x值),这是套管误差。

如何在所属的集合中获取所选条形索引的值?

//
//  MARK: Chart Setup
//
func setupBarChart() {

    let intervals = self.session!.getIntervals()

    //  Set chart delegate
    intervalBarChartView.delegate = self

    //
    // Create pairs (x, y) of values 
    //
    var values_ACTIVE : [BarChartDataEntry] = []
    var values_REST   : [BarChartDataEntry] = []

    for i in 0...(intervals.count - 1) {

        let newValue_ACTIVE    = intervals[i].duration!.doubleValue
        //            let newIndex_ACTIVE       = Double(2*i+1)
        let newIndex_ACTIVE      = Double(i)

        values_ACTIVE += [BarChartDataEntry(x: newIndex_ACTIVE, y: newValue_ACTIVE)]

        if i < (intervals.count - 1) {

            let newValue_REST      = (intervals[i+1].startTime!.doubleValue) - intervals[i].getEndTime()!
            //                let newIndex_REST         = Double(2*i+2)
            let newIndex_REST         = Double(i)

            values_REST += [BarChartDataEntry(x: newIndex_REST, y: newValue_REST)]

        }

    }

    //  Create data sets
    let dataSet_ACTIVE  = BarChartDataSet(values: values_ACTIVE, label: "ACTIVE")
    let dataSet_REST    = BarChartDataSet(values: values_REST, label: "REST")

    //Set chart data
    let chartData = BarChartData()
    chartData.addDataSet(dataSet_REST)
    chartData.addDataSet(dataSet_ACTIVE)

    self.intervalBarChartView.data = chartData

    //  Bar sizes
    let barWidth = 1.0
    let barSpace = 0.10
    let groupSpace = 0.1

    chartData.groupBars(fromX: 0, groupSpace: groupSpace, barSpace: barSpace)
    chartData.barWidth = barWidth

    //  Bar Colors
    dataSet_ACTIVE.colors = [runOrange]
    dataSet_REST.colors = [RunGreen]
    self.intervalBarChartView.gridBackgroundColor = NSUIColor.white

    //  Enable/Disable show values and position of values
    chartData.setDrawValues(false)
    intervalBarChartView.drawValueAboveBarEnabled = false

    //  Bar Axes: 
    intervalBarChartView.xAxis.axisMinimum = 0.0
    intervalBarChartView.xAxis.axisMaximum = 10
    intervalBarChartView.leftAxis.axisMinimum = 0.0
    intervalBarChartView.rightAxis.enabled = false

    //  Bar Axes: GridLines
    self.intervalBarChartView.xAxis.drawGridLinesEnabled = false
    self.intervalBarChartView.xAxis.drawAxisLineEnabled = false

    self.intervalBarChartView.rightAxis.drawAxisLineEnabled = true
    self.intervalBarChartView.rightAxis.drawGridLinesEnabled = false

    self.intervalBarChartView.leftAxis.drawGridLinesEnabled = false
    self.intervalBarChartView.leftAxis.drawAxisLineEnabled = false

    //  Bar Text
    self.intervalBarChartView.chartDescription?.text = "Barchart Demo"

    //  Control interaction
    self.intervalBarChartView.doubleTapToZoomEnabled = false

}

编辑

以下是我通过两种不同的设置编辑得到的结果:

使用这些设置:

    //  Bar sizes
    let barWidth = 0.3
    let barSpace = 0.10
    let groupSpace = 0.1

条形之间的间隙(或多或少)相等:

enter image description here

但是,使用以下设置:

let groupSpace = 0.3
let barSpace = 0.05
let barWidth = 0.3

我在第2和第3栏之间得到了更大的差距(与1和2相比)

enter image description here

ios swift ios-charts
1个回答
1
投票

您需要更改barWidth计算,以便在输出中实现预期效果。

GroupBarChart条形和间距计算的逻辑:

(baSpace + barWidth) * dataSet count + groupSpace = 1.0

所以在你的情况下你需要像这样更新上面的值:

let groupSpace = 0.3
let barSpace = 0.05
let barWidth = 0.3
// (0.3 + 0.05) * 2 + 0.3 = 1.00 -> interval per "group"

let startVal = 0

chartData.barWidth = barWidth;
chartData.groupBars(fromX: Double(startVal), groupSpace: groupSpace, barSpace: barSpace)

通过这样做,您将在条形图中获得正确的优化条位置。

另外一个选项是仅为您的图表设置BarWidth,如下所示:

let barChartData = BarChartData(dataSet: barChartDataSet)
barChartData.barWidth = 0.4

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.