簡體   English   中英

iOS圖表:條形圖的間距和位置

[英]iOS Charts : Bar chart spacing and position

目的

我正在嘗試在條形圖中顯示兩組(活動和休息)中的數據。 這些集合是交替的(意味着有一個ACTIVE間隔,然后是一個REST間隔,等等)。 相反,每兩個活動集之間就有一個REST集。

我使用的代碼如下,以供參考。 但是,我在桿的位置和間距方面遇到了問題。

問題:以x值居中

第一個問題是,條形未居中於相應的x值。 在下面的示例中,第一個橙色條的x = 1。

在此處輸入圖片說明

它顯然從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欄,我想獲得對應的值0。在第一個ACTIVE欄上,值也為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

條之間的間隙(或多或少)等於:

在此處輸入圖片說明

但是,通過以下設置:

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

我在第2條和第3條之間有一個更大的差距(與第1條和第2條相比)

在此處輸入圖片說明

您需要更改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

希望這會有所幫助!

暫無
暫無

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

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