Objective-C转SwiftUI:如何复刻CorePlot图表轴样式?
SwiftUI Charts 轴样式适配方案
针对你需要的CorePlot风格轴样式,修改代码如下,逐一实现无贯穿网格线、底部X轴线、小型刻度和自定义颜色的需求:
Chart(data) { LineMark( x: .value("x", $0.x), y: .value("y", $0.y) ) .interpolationMethod(.catmullRom) .lineStyle(StrokeStyle(lineWidth: 1)) } // X轴配置 .chartXAxis { AxisMarks(position: .bottom, values: .automatic) { value in // 小型刻度 AxisTick(length: 4, stroke: StrokeStyle(lineWidth: 1, color: .gray)) // 轴标签自定义颜色 AxisValueLabel(anchor: .top) { Text(value.as(String.self) ?? "") .foregroundColor(.gray) } // 底部X轴线(仅显示轴本身,无网格线) AxisStroke(stroke: StrokeStyle(lineWidth: 1, color: .gray)) // 隐藏网格线(不添加AxisGridLine即可) } } .chartXAxisLabel(position: .bottom, alignment: .center) { Text(chartProperties.xTitle) .foregroundColor(.gray) // 轴标题自定义颜色 } .chartXScale(domain: [chartProperties.minX, chartProperties.maxX]) // Y轴配置 .chartYAxisLabel(position: .leading, alignment: .center) { Text(chartProperties.yTitle) .foregroundColor(.gray) // Y轴标题自定义颜色 } .chartYScale(domain: [chartProperties.minY, chartProperties.maxY]) .chartYAxis { AxisMarks(position: .leading, values: .automatic) { value in // Y轴小型刻度 AxisTick(length: 4, stroke: StrokeStyle(lineWidth: 1, color: .gray)) // Y轴标签自定义颜色 AxisValueLabel(anchor: .trailing) { Text(value.as(String.self) ?? "") .foregroundColor(.gray) } // Y轴线 AxisStroke(stroke: StrokeStyle(lineWidth: 1, color: .gray)) // 隐藏Y轴网格线 } } // 全局隐藏默认网格线(确保没有贯穿绘图区的网格) .chartPlotStyle { plotArea in plotArea .background(.clear) .grid(.horizontal, stroke: .clear) .grid(.vertical, stroke: .clear) }
关键实现说明:
- 无贯穿网格线:通过两种方式确保:一是在
AxisMarks中不添加AxisGridLine,二是通过chartPlotStyle全局清除默认的水平/垂直网格线。 - 底部X轴线:在X轴的
AxisMarks里添加AxisStroke,设置线宽和颜色,仅显示轴本身。 - 小型刻度:给
AxisTick设置length参数(示例设为4,可按需调整),同时指定刻度的颜色和线宽。 - 自定义颜色:分别给
AxisTick、AxisStroke、AxisValueLabel和轴标题设置对应颜色(示例用.gray,可替换为你需要的颜色)。
内容的提问来源于stack exchange,提问作者koen
相关产品推荐
相关产品推荐

