news 2026/9/20 15:41:47

DGCharts LineChart完整教程:从基础折线图到渐变填充与贝塞尔曲线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DGCharts LineChart完整教程:从基础折线图到渐变填充与贝塞尔曲线

DGCharts LineChart完整教程:从基础折线图到渐变填充与贝塞尔曲线

【免费下载链接】ChartsBeautiful charts for iOS/tvOS/OSX! The Apple side of the crossplatform MPAndroidChart.项目地址: https://gitcode.com/gh_mirrors/cha/Charts

DGCharts(原名 Charts)是 iOS/tvOS/macOS 平台上最流行的开源图表库,而LineChartView是其中使用频率最高的组件之一。本教程带你从零搭建 DGCharts 折线图,逐步掌握数据点圆圈、渐变色填充(Gradient Fill)与贝塞尔曲线(Cubic Bezier)三大进阶技巧,10 分钟即可做出漂亮的趋势图表。

一、5 分钟搭建第一个折线图

在 Xcode 中通过 CocoaPods 或 SPM 引入 DGCharts 后(参考 README.md 的 Usage 章节),只需四步即可画出第一条折线:

import DGCharts // 1. 创建数据点 let entries: [ChartDataEntry] = [ ChartDataEntry(x: 0, y: 12), ChartDataEntry(x: 1, y: 25), ChartDataEntry(x: 2, y: 18) ] // 2. 创建数据集(LineChartDataSet 定义了折线的所有样式) let set = LineChartDataSet(entries: entries, label: "月度数据") set.lineWidth = 2 set.circleRadius = 3 // 3. 创建图表数据 let data = LineChartData(dataSet: set) // 4. 交给视图渲染 lineChartView.data = data

LineChartView继承自BarLineChartViewBase,内部使用专门的渲染器完成绘制,定义见 LineChartView.swift。

二、折线与数据点圆圈:常用样式速查

LineChartDataSet暴露了大量开箱即用的属性,下表是最常用的几个:

属性默认值作用
lineWidth1折线粗细(0–10)
circleRadius8数据点圆圈半径
circleHoleRadius4圆圈中心"孔"的半径
drawCirclesEnabledtrue是否显示数据点圆圈
drawFilledEnabledfalse是否填充折线下方区域
lineDashLengthsnil虚线样式,如[5, 2.5]
mode.linear曲线模式(见第四节)

想要"空心小圆点"这种精致风格,只需:

set.circleRadius = 4 set.circleHoleRadius = 2 set.setCircleColor(.white) // 点颜色 set.circleHoleColor = .blue // 孔颜色

完整属性清单可查看 LineChartDataSetProtocol.swift。

三、渐变填充:让折线下方"上色"

这是折线图最惊艳的效果之一。开启填充只需两个属性:

set.drawFilledEnabled = true // 打开填充 set.fillColor = .systemBlue // 填充颜色 set.fillAlpha = 0.33 // 填充透明度(默认 0.33)

填充区域的"底边"由FillFormatter决定,默认实现是 DefaultFillFormatter.swift:数据全为正数时填充到 Y 轴最小值,数据全为负数时填充到最大值,正负混合时填充到 0 线。想固定填充到某个值,用闭包写法一行搞定:

// 填充固定到 Y 轴最小值(常见于全屏趋势图) set.fillFormatter = DefaultFillFormatter { _, _ in return self.lineChartView.leftAxis.axisMinimum }

官方 Demo 中"上顶到最大值、下底到最小值"的双数据集填充案例,可直接阅读 LineChartFilledViewController.swift。

真正的"渐变色"填充:LinearGradientFill

fillColor只能填纯色,想要蓝→紫这种渐变,需要用到fill属性配合LinearGradientFill

let colors = [UIColor.systemBlue.cgColor, UIColor.systemPurple.cgColor] let gradient = CGGradient(colorsSpace: nil, colors: colors as CFArray, locations: nil)! set.fill = LinearGradientFill(gradient: gradient, angle: 90) set.drawFilledEnabled = true

Fill协议内置了四种填充器,全部定义在 Fill.swift:

  • ColorFill—— 纯色填充
  • LinearGradientFill—— 线性渐变(最常用)
  • RadialGradientFill—— 径向渐变
  • ImageFill—— 用图片填充(支持平铺)

Demo 中"透明蓝→红色"的渐变填充写法见 LineChart1ViewController.swift。

四、贝塞尔曲线:一键平滑折线

默认的mode = .linear画出来是折线段。DGCharts 提供四种曲线模式(定义见 LineChartDataSet.swift#L18-L25):

模式效果
.linear直线段(默认)
.cubicBezier三次贝塞尔曲线,完全平滑
.horizontalBezier水平贝塞尔曲线,仅在水平方向平滑
.stepped阶梯状折线,适合"阶跃"型数据

平滑曲线只需一行:

set.mode = .cubicBezier set.cubicIntensity = 0.6 // 曲线强度 0.05~1,默认 0.2,越大越"飘"

💡 小贴士:cubicIntensity调到 1 时曲线会非常夸张地过冲,推荐 0.5~0.8 之间微调,视觉效果最自然。

曲线 + 自定义填充底边的完整 Demo,参见 CubicLineChartViewController.swift,其中还演示了如何自定义FillFormatter把填充底边固定到-10

五、让图表动起来:动画与高亮

数据加载时的生长动画只需一行,配合前文的效果非常出片:

lineChartView.animate(xAxisDuration: 2.5) // X 轴展开 lineChartView.animate(xAxisDuration: 2, yAxisDuration: 2, easingOption: .easeOutQuart) // 双轴 + 缓动曲线

用户点按数据点时的高亮样式,通过highlightColor设置:

set.highlightColor = .systemRed lineChartView.maxHighlightDistance = 50 // 点按距离数据点 50pt 内都可选中

缓动曲线枚举见 ChartAnimationEasing.swift。

六、新手常见问题(FAQ)

Q1:数据更新了但图表没变化?赋值给lineChartView.data后记得调用lineChartView.setNeedsDisplay();若数据是同一个引用修改的,可改用lineChartView.data?.notifyDataChanged()

Q2:如何同时显示多条折线?把多个LineChartDataSet一起放进LineChartData(dataSets: [set1, set2]),图例会按数据集颜色自动生成,legend.form = .line可把图例图标画成短线条。

Q3:折线数据点太多、圆圈挤成一团?关闭圆圈set.drawCirclesEnabled = false(性能也会更好),或在数据密集时动态调小circleRadius

写在最后

掌握LineChartDataSet的样式属性、FillFormatter填充控制与四种曲线mode,你就能覆盖 90% 的折线图需求。想要更多现成写法,推荐直接浏览官方 Demo 目录 ChartsDemo-iOS/Swift/Demos/,每个ViewController都是一个可运行的最小案例。🚀

【免费下载链接】ChartsBeautiful charts for iOS/tvOS/OSX! The Apple side of the crossplatform MPAndroidChart.项目地址: https://gitcode.com/gh_mirrors/cha/Charts

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 15:40:30

PL-300备考指南:一套练习数据通关Power BI实操

简介:微软商业智能PL-300认证练习数据包,面向备考PL-300认证的开发者、数据分析师以及希望提升数据可视化能力的职场人士。资源源于官方练习场景,覆盖数据连接、数据清洗、数据建模、DAX表达式、交互式报表、仪表板开发和行级安全性等核心考点…

作者头像 李华
网站建设 2026/9/20 15:39:49

CentOS 7下mitmproxy部署与系统集成指南

1. 环境准备与依赖安装在CentOS 7系统上部署mitmproxy前,需要确保基础环境完备。我推荐使用Miniconda作为Python环境管理器,它能有效解决多版本Python和依赖隔离的问题。以下是具体操作步骤:1.1 系统基础依赖安装首先更新系统并安装编译工具链…

作者头像 李华
网站建设 2026/9/20 15:38:05

OpenCore Legacy Patcher 实战:让老 Mac 升级新 macOS 系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 15:36:46

嵌入式AI实战:在MCU上实现本地化决策与TinyML落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 15:35:30

MySQL 8.0 Windows 安装避坑指南:从环境变量到字符集全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 15:31:20

测试管理破局:从“救火队长”到质量负责人

凌晨一点多,办公室只剩下我一个人。白天太吵了——需求评审、版本排期、线上工单、自动化用例挂掉的告警,全都挤在一起,测试负责人只能像救火队员一样到处扑。只有到了这个点,我才会坐下来问自己一个有点扎心的问题:如…

作者头像 李华