Цель
Я пытаюсь отобразить данные из двух наборов (ACTIVE и REST) на гистограмме.Наборы чередуются (имеется в виду один АКТИВНЫЙ интервал, за которым следует REST-интервал и т. Д.).Скорее, между каждыми двумя наборами ACTIVE всегда есть один набор REST.
Код, который я использовал, приведен ниже для справки.Я, однако, сталкиваюсь с проблемами с позициями стержней и расстоянием между ними.
Проблема: центрирующий стержень со значением x
Первая проблема, стержень не центрирован всоответствующее значение х.В приведенном ниже примере первая оранжевая полоса имеет x = 1.
Она явно начинается со значения 1 на оси x (ее левая сторона соответствуетпримерно до 1), но я хочу, чтобы он был центрирован вокруг значения 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) поступает из разных массивов значений.
Если я нажму на 1-й строке REST, я бы хотела получить соответствующее значение 0. on1-й АКТИВНЫЙ бар, значение 0 тоже.2-ой АКТИВНЫЙ бар, значение 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)