iOS 当集合使用不同的 X 坐标范围时,图表将不会绘制多个数据集
iOS charts will not draw multiple datasets when the sets use different ranges of X-coordinates
从多个数据集创建折线图时,折线图仅显示其中一个数据集,并且在缩放或平移图表时崩溃并显示 致命错误:无法形成范围upperBound < lowerBound.
如果我根据一个数据集创建折线图,它会按预期工作。
仅当两个数据集的 X 值范围完全不同时才会出现此问题。
下面的代码应该绘制一个 x 范围从 0 到 19 的图表(即 2 个数据集)。但它只绘制第二个数据集。如果平移或缩放图表,图表会崩溃。
如果我编辑代码,将 for x in (10..<20)
替换为 for x in (0..<10)
,两个数据集都会正确绘制并且图表不会崩溃。
总结一下:当添加两个具有不同 X 坐标范围的条目的数据集时,图表绘制不正确并且会崩溃。
是否需要 iOS_charts API 调用来防止这种情况发生?如何绘制两个 X 坐标不重叠的数据集?
当 运行 代码使用 this demo code 修改它以创建多个具有非重叠 x 坐标的数据集时,我已经能够产生相同的崩溃。
class ElevationChartViewController: UIViewController {
@IBOutlet var chartView: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
chartView.backgroundColor = .white
chartView.legend.enabled = false
chartView.maxVisibleCount = 20000
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let dataSets = createChartDataSets()
chartView.data = LineChartData(dataSets: dataSets)
}
}
func createChartDataSets() -> [LineChartDataSet] {
var dataSets = [LineChartDataSet]()
var entriesOne = [ChartDataEntry]()
var entriesTwo = [ChartDataEntry]()
var y = 0.0
for x in (0..<10) {
entriesOne.append( ChartDataEntry(x: Double(x), y: y))
y = y + 10
if y > 60 {y = 0.0}
}
dataSets.append(LineChartDataSet(entriesOne))
for x in (10..<20) {
entriesTwo.append( ChartDataEntry(x: Double(x), y: y))
y = y + 10
if y > 50 {y = 0.0}
}
dataSets.append(LineChartDataSet(entriesTwo))
return dataSets
}
Swift版本:5.4
Xcode 12.4
在真实的 iPhone 12 sw 版本 14.4 上观察到 运行
图表 v4.0.1
我一直面临类似的问题,到目前为止这个解决方案对我有效。不确定由此可能产生的潜在副作用。我没有测试过平移或缩放。
子类 LineChartDataSet
并覆盖 entryIndex(x xValue:closestToY yValue:rounding)
复制并粘贴超级实现,但删除函数顶部的 guard
语句
var closest = partitioningIndex { [=10=].x >= xValue }
guard closest < endIndex else { return -1 }
并替换为
var closest = partitioningIndex { [=11=].x >= xValue }
if closest >= endIndex {
closest = endIndex - 1
}
从多个数据集创建折线图时,折线图仅显示其中一个数据集,并且在缩放或平移图表时崩溃并显示 致命错误:无法形成范围upperBound < lowerBound.
如果我根据一个数据集创建折线图,它会按预期工作。
仅当两个数据集的 X 值范围完全不同时才会出现此问题。
下面的代码应该绘制一个 x 范围从 0 到 19 的图表(即 2 个数据集)。但它只绘制第二个数据集。如果平移或缩放图表,图表会崩溃。
如果我编辑代码,将 for x in (10..<20)
替换为 for x in (0..<10)
,两个数据集都会正确绘制并且图表不会崩溃。
总结一下:当添加两个具有不同 X 坐标范围的条目的数据集时,图表绘制不正确并且会崩溃。
是否需要 iOS_charts API 调用来防止这种情况发生?如何绘制两个 X 坐标不重叠的数据集?
当 运行 代码使用 this demo code 修改它以创建多个具有非重叠 x 坐标的数据集时,我已经能够产生相同的崩溃。
class ElevationChartViewController: UIViewController {
@IBOutlet var chartView: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
chartView.backgroundColor = .white
chartView.legend.enabled = false
chartView.maxVisibleCount = 20000
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let dataSets = createChartDataSets()
chartView.data = LineChartData(dataSets: dataSets)
}
}
func createChartDataSets() -> [LineChartDataSet] {
var dataSets = [LineChartDataSet]()
var entriesOne = [ChartDataEntry]()
var entriesTwo = [ChartDataEntry]()
var y = 0.0
for x in (0..<10) {
entriesOne.append( ChartDataEntry(x: Double(x), y: y))
y = y + 10
if y > 60 {y = 0.0}
}
dataSets.append(LineChartDataSet(entriesOne))
for x in (10..<20) {
entriesTwo.append( ChartDataEntry(x: Double(x), y: y))
y = y + 10
if y > 50 {y = 0.0}
}
dataSets.append(LineChartDataSet(entriesTwo))
return dataSets
}
Swift版本:5.4 Xcode 12.4 在真实的 iPhone 12 sw 版本 14.4 上观察到 运行 图表 v4.0.1
我一直面临类似的问题,到目前为止这个解决方案对我有效。不确定由此可能产生的潜在副作用。我没有测试过平移或缩放。
子类 LineChartDataSet
并覆盖 entryIndex(x xValue:closestToY yValue:rounding)
复制并粘贴超级实现,但删除函数顶部的 guard
语句
var closest = partitioningIndex { [=10=].x >= xValue }
guard closest < endIndex else { return -1 }
并替换为
var closest = partitioningIndex { [=11=].x >= xValue }
if closest >= endIndex {
closest = endIndex - 1
}