Go 每日一库:plot 库,数据可视化从零开始
【免费下载链接】go-daily-lib Go 每日一库 项目地址: https://gitcode.com/GitHub_Trending/go/go-daily-lib
你是否还在为 Go 项目中的数据可视化需求烦恼?面对枯燥的数字报表无从下手?本文将带你使用 plot 库(基于 Gonum 科学计算库)快速实现专业级数据图表,从基础折线图到实时监控面板,无需复杂配置即可让数据直观呈现。读完本文你将掌握:基础图表绘制流程、5种常见图表类型实现、实时数据可视化方案及完整项目实践。
核心功能概览
plot 库是 Go 语言生态中功能强大的数据可视化工具,支持多种图表类型和交互方式。项目示例代码结构清晰,覆盖从入门到高级应用的全场景:
- 基础图表:折线图(get-started/main.go)、柱状图(bar/main.go)、函数曲线图(function/main.go)
- 高级可视化:气泡图(bubble/main.go)、方形散点图(square/main.go)
- 实战应用:系统资源监控面板(monitor/)
快速入门:10行代码绘制折线图
从最简单的折线图开始,只需三步即可完成可视化:
- 创建画布:初始化 plot 对象设置标题和坐标轴
- 准备数据:生成或导入需要可视化的数据点
- 渲染输出:将图表保存为图片或输出到浏览器
package main
import (
"log"
"math/rand"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/plotutil"
"gonum.org/v1/plot/vg"
)
func main() {
p, _ := plot.New()
p.Title.Text = "Get Started"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
// 添加三条随机数据线
plotutil.AddLinePoints(p, "First", randomPoints(15), "Second", randomPoints(15))
p.Save(4*vg.Inch, 4*vg.Inch, "points.png") // 保存为4x4英寸图片
}
func randomPoints(n int) plotter.XYs {
points := make(plotter.XYs, n)
for i := range points {
points[i].X = float64(i)
points[i].Y = rand.Float64() * 100
}
return points
}
五种常用图表实现方案
1. 对比柱状图:性能测试可视化
在性能对比场景中,柱状图能清晰展示不同方案的差异。以下代码比较三种 JSON 解析库的性能指标:
// 代码片段来自 [bar/main.go](https://link.gitcode.com/i/a2ab2c69ab0ebbbfbb7982197e992516)
std := plotter.Values{35510, 1960, 99} // 标准库性能数据
easyjson := plotter.Values{8499, 160, 4} // easyjson性能数据
jsoniter := plotter.Values{5623, 160, 3} // jsoniter性能数据
// 创建三个并列柱状图
stdBar, _ := plotter.NewBarChart(std, vg.Points(20))
stdBar.Color = plotutil.Color(0)
stdBar.Offset = -vg.Points(20)
easyjsonBar, _ := plotter.NewBarChart(easyjson, vg.Points(20))
easyjsonBar.Color = plotutil.Color(1)
jsoniterBar, _ := plotter.NewBarChart(jsoniter, vg.Points(20))
jsoniterBar.Color = plotutil.Color(2)
jsoniterBar.Offset = vg.Points(20)
p.Add(stdBar, easyjsonBar, jsoniterBar)
p.NominalX("ns/op", "分配字节", "分配次数") // X轴分类标签
2. 函数曲线图:数学模型可视化
函数曲线图适合展示数学关系或趋势预测,支持自定义线条样式和颜色:
// 代码片段来自 [function/main.go](https://link.gitcode.com/i/e9ac6e7c83f6d0d94f9ee0b441d4b1eb)
square := plotter.NewFunction(func(x float64) float64 { return x * x })
square.Color = plotutil.Color(0) // 蓝色实线
sqrt := plotter.NewFunction(func(x float64) float64 { return 10 * math.Sqrt(x) })
sqrt.Dashes = []vg.Length{vg.Points(1), vg.Points(2)} // 虚线样式
sqrt.Color = plotutil.Color(1)
exp := plotter.NewFunction(func(x float64) float64 { return math.Pow(2, x) })
exp.Width = vg.Points(2) // 线宽
exp.Color = plotutil.Color(2)
p.Add(square, sqrt, exp)
p.Legend.Add("x²", square)
p.Legend.Add("10√x", sqrt)
p.Legend.Add("2ˣ", exp)
3. 气泡图:三维数据展示
气泡图通过点的大小和位置同时表达三个维度的数据关系,适合展示数据集群特征:
// 代码片段来自 [bubble/main.go](https://link.gitcode.com/i/b972fc0e5e44e73f761b1c662a8cb751)
bs, _ := plotter.NewScatter(bubbleData)
bs.GlyphStyleFunc = func(i int) draw.GlyphStyle {
// 根据Z值动态调整气泡大小
z := bubbleData[i].Z
radius := vg.Points(1) + vg.Length((z - minZ)/(maxZ - minZ)) * 19
return draw.GlyphStyle{
Color: color.RGBA{R: 196, B: 128, A: 255},
Radius: radius,
Shape: draw.CircleGlyph{},
}
}
实时监控系统实战
plot 库不仅能生成静态图片,还可结合 HTTP 服务实现动态监控面板。monitor/ 目录提供完整示例,通过定时采集系统资源数据并实时更新图表:
// 代码片段来自 [monitor/main.go](https://link.gitcode.com/i/24f617e5f3cee5935e3e8a0285960ec0)
type Monitor struct {
Mem []float64 // 内存使用率数据
CPU []float64 // CPU使用率数据
Lock sync.Mutex
}
// 定时采集系统数据
func (m *Monitor) Run() {
for {
m.Collect() // 调用gopsutil获取系统信息
time.Sleep(500 * time.Millisecond)
}
}
// HTTP处理器实时生成图表
func image(w http.ResponseWriter, r *http.Request) {
m.Lock.Lock()
defer m.Lock.Unlock()
// 创建CPU和内存数据线
cpuLine, _ := plotter.NewLine(cpuData)
memLine, _ := plotter.NewLine(memData)
p.Add(cpuLine, memLine)
p.Save(4*vg.Inch, 4*vg.Inch, w) // 直接输出到HTTP响应
}
前端通过定时刷新图片实现动态效果:
<!-- 代码来自 [monitor/index.html](https://link.gitcode.com/i/249f8851385b6d026e1b91cba64086d1) -->
<img src="/image" alt="系统监控" id="img">
<script>
// 每500毫秒刷新一次图表
setInterval(() => {
img.src = "/image?s=" + Math.random() // 随机参数防止缓存
}, 500)
</script>
项目应用与扩展
环境配置与依赖安装
使用本项目示例代码前,需先安装必要依赖:
go get gonum.org/v1/plot
go get github.com/shirou/gopsutil # 系统监控示例依赖
自定义样式与高级功能
- 颜色方案:使用
plotutil.Color(i)选择预定义颜色,或自定义color.RGBA值 - 字体设置:通过
vg.FontMap配置中文字体支持 - 交互扩展:结合 ebiten/ 项目可实现交互式图表(如缩放、悬停提示)
总结与后续学习
本文介绍了 plot 库的核心功能和实战应用,从基础图表到实时监控系统,展示了数据可视化在 Go 项目中的实现方案。建议继续探索:
- 三维图表绘制(使用
gonum.org/v1/plot3d包) - 大数据量优化(采样与分块渲染)
- 导出矢量图(SVG/EPS格式支持)
完整示例代码可在项目 plot/ 目录中获取,欢迎贡献更多图表类型和使用场景。如果觉得本文有用,请点赞收藏,关注获取更多 Go 每日一库实战教程!
【免费下载链接】go-daily-lib Go 每日一库 项目地址: https://gitcode.com/GitHub_Trending/go/go-daily-lib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



