[英]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.