You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Swift中如何为Charts图表底部标签添加自定义值

解决HorizontalBarChart底部标签自定义问题

先明确你代码里的核心问题:要修改的是底部的X轴标签,但你错误设置了rightAxis的格式化器,方向完全不对;另外标签数组缺少"0",且需要按数值匹配标签而非索引。

正确实现步骤:

  1. 补全标签数组,把需要的"0"加上:
var dollarValue = ["0", "$25", "$50", "$75", "$100"]
  1. 自定义X轴数值格式化器,按数值对应标签(0→0、25→$25...):
class DollarValueFormatter: NSObject, AxisValueFormatter {
    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        // 把数值转成对应标签的索引:0对应索引0,25对应索引1,以此类推
        let index = Int(value / 25)
        // 防止索引越界,兜底显示原数值
        guard index >= 0, index < dollarValue.count else { return "\(value)" }
        return dollarValue[index]
    }
}
  1. 配置X轴(底部标签),并调整刻度范围和间隔:
    在updateCharts方法里添加X轴的设置:
// 获取图表的X轴(就是底部的数值轴)
let xAxis = horizontalBarChartContainnerView.xAxis
// 设置自定义格式化器
xAxis.valueFormatter = DollarValueFormatter()
// 强制设置X轴的最小、最大值和刻度间隔,确保显示你需要的标签
xAxis.axisMinimum = 0
xAxis.axisMaximum = 100
xAxis.granularity = 25 // 每25个单位显示一个标签
// 明确指定X轴标签显示在底部
xAxis.labelPosition = .bottom
  1. 修正数据点的坐标逻辑:
    横向柱状图的Y轴是分类索引,X轴才是数值,所以数据点的X值应该直接用你要展示的数值:
for i in 0..<xValue.count {
    // 横向柱状图:y是分类索引,x是实际数值
    let value = BarChartDataEntry(x: xValue[i], y: Double(i))
    chartDataEntry.append(value)
}

完整修改后的代码:

var xValue = [25.0, 50.0]
var dollarValue = ["0", "$25", "$50", "$75", "$100"]

// 自定义数值格式化器
class DollarValueFormatter: NSObject, AxisValueFormatter {
    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        let index = Int(value / 25)
        guard index >= 0, index < dollarValue.count else { return "\(value)" }
        return dollarValue[index]
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    updateCharts()
}

func updateCharts() {
    var chartDataEntry = [BarChartDataEntry]()
    
    // 生成横向柱状图的数据点
    for i in 0..<xValue.count {
        let value = BarChartDataEntry(x: xValue[i], y: Double(i))
        chartDataEntry.append(value)
    }

    let chartDataSet = BarChartDataSet(entries: chartDataEntry, label: "10x In-Store ")
    chartDataSet.colors = ChartColorTemplates.material()

    let chartMain = BarChartData(dataSet: chartDataSet)
    chartMain.barWidth = 5.0
    
    // 配置底部X轴
    let xAxis = horizontalBarChartContainnerView.xAxis
    xAxis.valueFormatter = DollarValueFormatter()
    xAxis.axisMinimum = 0
    xAxis.axisMaximum = 100
    xAxis.granularity = 25
    xAxis.labelPosition = .bottom
    
    // 隐藏左侧Y轴的索引标签(不需要的话)
    let yAxis = horizontalBarChartContainnerView.leftAxis
    yAxis.drawLabelsEnabled = false
    
    horizontalBarChartContainnerView.animate(yAxisDuration: 0.5)
    horizontalBarChartContainnerView.data = chartMain
}

关键说明:

  • 横向柱状图的结构是:X轴是数值轴(显示在底部),Y轴是分类轴(显示在侧边),所以修改底部标签必须操作X轴
  • 自定义AxisValueFormatter能精准控制每个数值对应的显示文本,避免索引不匹配的问题
  • 设置granularity确保刻度间隔固定为25,正好对应你需要的标签序列

内容的提问来源于stack exchange,提问作者sham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:26:27