簡體   English   中英

如何在Swift中創建分組條形圖?

[英]How to create a grouped bar chart in Swift?

我正在使用圖表庫在我的應用程序中顯示圖表。 我的應用程序中有一個條形圖,該條形圖過去在Swift 2.3和Charts 2.2.5版中都能正常工作。 但是,我最近將應用程序更新為Swift 4.1和Charts 3.1.0,但是Charts庫中的重大更改破壞了我應用程序的功能。 如何正確遷移此代碼塊以在新版本中工作?

這是我正在使用的示例圖表:

我的圖表

這是創建此圖表的JSON數據:

[{"Items":[{"X":"01.03.2018","Value":10000},{"X":"02.03.2018","Value":2500}],"Name":"Group 1"},{"Items":[{"X":"01.03.2018","Value":5000}],"Name":"Group 2"}]

這是我在Swift 2.3中很好用的代碼:

var xVals = [String]()
var datasets = [BarChartDataSet]()

    for i in 0..<json.count{

        var entries = [BarChartDataEntry]()

        for j in 0..<json[i]["Items"].count{

            if i == 0{
                xVals.append(json[i]["Items"][j]["X"].stringValue)
            }

            if json[i]["Items"][j]["Value"].doubleValue != 0.0{
                let entry = BarChartDataEntry(value: json[i]["Items"][j]["Value"].doubleValue, xIndex: j)

                entries.append(entry)
            }

        }

        let dataset = BarChartDataSet(yVals: entries, label: json[i]["Name"].stringValue)
        datasets.append(dataset)
    }

    let data = BarChartData(xVals: xVals, dataSets: datasets)
    barChart.data = data

遷移后的外觀如下:

在此處輸入圖片說明

這有兩個問題:

條堆疊而不是分組。
xAxis確實顯示索引而不是日期。

這是新的Swift 4.1代碼:

var xVals = [String]()
var datasets = [BarChartDataSet]()

for i in 0..<json.count{

    var entries = [BarChartDataEntry]()

    for j in 0..<json[i]["Items"].count{

        if i == 0{
            xVals.append(json[i]["Items"][j]["X"].stringValue)
        }

        if json[i]["Items"][j]["Value"].doubleValue != 0.0{
            let entry = BarChartDataEntry(x: Double(j), y: json[i]["Items"][j]["Value"].doubleValue)

            entries.append(entry)
        }

    }

    let dataset = BarChartDataSet(values: entries, label: json[i]["Name"].stringValue)
    datasets.append(dataset)
}

let data = BarChartData(dataSets: datasets)
barChart.data = data

那么我該如何解決這兩個問題呢?

[ Swift 4 ]您需要使用groupBarsvalueFormatter形式的BarChart API。

這只是代碼示例,您需要根據需要進行微調。

[ 編輯1 ]

公式 :(0.2 + 0.03)* countGourp + 0.08 = 1.00->每個“組”的間隔

 let data = BarChartData(dataSets: datasets)
 // (0.2 + 0.03) * 2 + 0.54 = 1.00 
    let groupSpace = 0.54
    let barSpace = 0.03
    let barWidth = 0.2
    data.barWidth = barWidth

    barView.xAxis.axisMinimum = Double(0)
    barView.xAxis.axisMaximum = Double(0) + data.groupWidth(groupSpace: groupSpace, barSpace: barSpace) * Double(2)  // group count : 2
    data.groupBars(fromX: Double(0), groupSpace: groupSpace, barSpace: barSpace)

    barView.data = data

    let x_Axis = barView.xAxis
    x_Axis.valueFormatter = IndexAxisValueFormatter(values:xVals)
    x_Axis.centerAxisLabelsEnabled = true
    x_Axis.granularity = 1
    barView.xAxis.labelPosition = .top

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM