Charts库水平条形图:新增条形颜色修改及轴标签设置问题
使用Charts库实现水平条形图自定义颜色与轴标签的解决方案
一、为新增条形设置不同颜色
你当前把所有条形数据放在同一个BarChartDataSet里,导致颜色统一。要实现不同颜色,需将原有数据和新增用户数据拆分为两个独立的DataSet:
let barWidth = 5.3 let spaceForBar = 10.3 var n = 0 // 1. 处理原有数据的DataSet let originalYVals = (0..<count).map { (i) -> BarChartDataEntry in let val = items.map{Double($0.iqLevel)}[n] n += 1 return BarChartDataEntry(x: Double(i)*spaceForBar, y: val) } let originalDataSet = BarChartDataSet(entries: originalYVals) originalDataSet.setColor(.systemBlue) // 自定义原有条形的颜色 // 2. 处理新增用户数据的DataSet let userData = testResultItem(group: "New user", iqLevel: 118).iqLevel let newEntry = BarChartDataEntry(x: 2.5*spaceForBar, y: Double(userData)) let newUserDataSet = BarChartDataSet(entries: [newEntry]) newUserDataSet.setColor(.systemRed) // 自定义新增条形的颜色 // 3. 合并两个DataSet并赋值给图表 let chartData = BarChartData(dataSets: [originalDataSet, newUserDataSet]) chartData.barWidth = barWidth yourBarChartView.data = chartData
二、为x轴添加新标签
水平条形图的x轴是数值轴,需自定义XAxisValueFormatter来映射条形位置与对应标签:
// 1. 准备完整的标签列表(原有标签+新增标签) var xLabels = items.map { $0.group } // 假设原有数据的group字段是标签文本 xLabels.insert("New user", at: 3) // 根据新增条形的位置调整插入索引 // 2. 自定义轴值格式化器 class CustomXAxisFormatter: NSObject, AxisValueFormatter { var labels: [String] init(labels: [String]) { self.labels = labels super.init() } func stringForValue(_ value: Double, axis: AxisBase?) -> String { // 根据条形的x位置计算对应标签索引 let index = Int(value / spaceForBar) guard index >= 0 && index < labels.count else { return "" } return labels[index] } } // 3. 将格式化器应用到x轴 yourBarChartView.xAxis.valueFormatter = CustomXAxisFormatter(labels: xLabels) yourBarChartView.xAxis.labelPosition = .bottom yourBarChartView.xAxis.granularity = spaceForBar // 确保标签间隔与条形间距匹配
注意:如果新增条形的x位置不是spaceForBar的整数倍,需要调整stringForValue中的索引计算逻辑,或者将新增条形的x位置改为Double(xLabels.count - 1)*spaceForBar,保证标签与位置一一对应。
内容的提问来源于stack exchange,提问作者Avoopihra
相关产品推荐
相关产品推荐

