客观
我正在尝试在条形图中显示来自两组(ACTIVE和REST)的数据。 这些集合是交替的(意味着有一个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条相比)
答案 0 :(得分: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
希望这会有所帮助!