使用Go语言绘制折线统计图教程

使用Go语言绘制折线统计图教程

在本教程中,我们将学习如何使用Go语言及gg包绘制折线统计图,并将图表保存为PNG格式的图片。折线图适用于展示数据的变化趋势,并能直观地展示数据随时间或其他指标的变化。

安装gg包

首先,确保你已经安装了gg包。如果还没有安装,可以使用以下命令进行安装:

sh 复制代码
go get -u github.com/fogleman/gg

代码示例

以下是一个完整的Go程序,它会绘制一个折线统计图并将其保存为line_chart.png文件。

go 复制代码
package main

import (
	"fmt"
	"log"

	"github.com/fogleman/gg"
)

func main() {
	// 定义折线图文件路径
	lineChartFile := "line_chart.png"

	// 创建折线图
	if err := createLineChart(lineChartFile); err != nil {
		log.Fatalf("创建折线图时出错: %v", err)
	}

	fmt.Println("折线图生成成功")
}

// 创建折线图并保存为图片
func createLineChart(filename string) error {
	const (
		width  = 900 // 画布宽度
		height = 600 // 画布高度
	)

	// 数据
	data := []struct {
		label string
		value float64
	}{
		{"身份证", 15},
		{"电话号码", 20},
		{"地址信息", 25},
		{"银行卡号", 30},
		{"财务数据", 35},
		{"基础信息", 40},
		{"户籍信息", 45},
	}

	// 创建画布
	dc := gg.NewContext(width, height)
	dc.SetRGB(1, 1, 1) // 背景色为白色
	dc.Clear()

	barWidth := float64(width-200) / float64(len(data)) // 调整每个数据点之间的间隔
	maxValue := 50.0                                    // 纵坐标最大值

	// 加载自定义字体
	if err := dc.LoadFontFace("_examples/word-template/msyh.ttf", 12); err != nil {
		return fmt.Errorf("无法加载字体: %v", err)
	}

	// 绘制折线图
	dc.SetRGB(0, 0, 0) // 线条颜色为黑色
	for i, d := range data {
		x := 50 + float64(i)*(barWidth+20)                       // x轴起始位置
		y := height - 50 - (d.value / maxValue * (height - 100)) // y轴起始位置减去数据点的高度

		if i == 0 {
			dc.MoveTo(x, y)
		} else {
			dc.LineTo(x, y)
		}
	}
	dc.Stroke()

	// 绘制坐标轴
	dc.SetRGB(0, 0, 0)                              // 黑色
	dc.DrawLine(50, height-50, width-50, height-50) // X轴
	dc.DrawLine(50, height-50, 50, 50)              // Y轴
	dc.Stroke()

	// 添加横坐标标签
	for i, d := range data {
		dc.DrawStringAnchored(d.label, 50+float64(i)*(barWidth+20), height-30, 0.5, 1)
	}

	// 添加纵坐标标签
	for i := 0; i <= int(maxValue); i += 5 {
		y := height - 50 - (float64(i) / maxValue * (height - 100))
		dc.DrawStringAnchored(fmt.Sprintf("%d", int(i)), 30, y, 1, 0.5)
	}

	// 保存图像为PNG文件
	return dc.SavePNG(filename)
}

代码解析

  1. 导入必要的包 :代码导入了fmt、log和github.com/fogleman/gg包。

  2. 定义数据结构:定义了一个包含标签和数值的数据集。

  3. 初始化数据:创建了一组数据,其中包含标签(如"身份证")和对应的数值。

  4. 定义画布大小:画布的宽度为900像素,高度为600像素。

  5. 创建画布 :使用gg.NewContext创建一个新的绘图上下文,并设置背景颜色为白色。

  6. 计算每个数据点之间的间隔:根据画布宽度和数据点的数量计算每个数据点之间的间隔。

  7. 加载自定义字体:加载自定义字体以便在图表上绘制文本标签。

  8. 绘制折线图:遍历数据,计算每个数据点的x轴和y轴位置,并绘制折线图。

  9. 绘制坐标轴:绘制x轴和y轴。

  10. 添加横坐标标签:在x轴上添加数据标签。

  11. 添加纵坐标标签:在y轴上添加数值标签。

  12. 保存图像为PNG文件 :将图像保存为line_chart.png文件。

运行代码

将上述代码保存为main.go,然后在命令行运行以下命令:

sh 复制代码
go run main.go

运行成功后,你将在当前目录下看到生成的line_chart.png文件。

结论

通过本文的介绍,你已经学会了如何使用Go语言及gg包绘制折线统计图。你可以根据需要调整数据和图表样式,生成各种自定义的折线图。希望本文对你有所帮助,祝你编程愉快!

效果

相关推荐
xiaoye-duck5 分钟前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
AI源码38 分钟前
基于 Python 的短视频用户行为分析系统
开发语言·python
IT规划师1 小时前
编程术语中的同步与异步:从"等不等"到工程取舍
后端·面试
旖旎夜光1 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
揽星河..2 小时前
【C语言】结构体
c语言·开发语言
孟陬2 小时前
Foobar 技术周刊#159:当看不懂代码时,如何高效排障调试。脏页陷阱:一条只读查询,写入数 TB 数据。推测解码:大模型加速利器
前端·人工智能·后端
GoGeekBaird2 小时前
别再给每个 AI 做自我介绍了:我做了一个「个人上下文」管理系统
后端·github·agent
2601_966949652 小时前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
码事漫谈2 小时前
腾讯混元 Hy4 正式版发布了
后端
Mikko72 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端