使用Go语言绘制饼图的教程

使用Go语言绘制饼图的教程

在本教程中,我们将学习如何使用Go语言及gg包绘制饼图,并将其保存为PNG格式的图片。饼图是一种常用的数据可视化图表,用于展示数据的比例关系和组成部分。

安装gg

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

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

代码示例

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

go 复制代码
package main

import (
	"fmt"
	"github.com/fogleman/gg"
	"math"
)

func main() {
	// 定义饼图图片文件路径
	pieChartFile := "pie_chart.png"

	// 创建饼图并保存为图片
	if err := createPieChart(pieChartFile); err != nil {
		fmt.Printf("创建饼图时出错: %v\n", err)
	} else {
		fmt.Println("饼图创建成功")
	}
}

// 创建饼图并保存为图片
func createPieChart(filename string) error {
	const (
		width  = 640
		height = 600
		radius = 200 // 半径
	)

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

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

	colors := []struct{ R, G, B float64 }{
		{0.9, 0.3, 0.3}, // 红色
		{0.3, 0.9, 0.3}, // 绿色
		{0.3, 0.3, 0.9}, // 蓝色
		{0.9, 0.9, 0.3}, // 黄色
		{0.9, 0.3, 0.9}, // 紫色
		{0.3, 0.9, 0.9}, // 青色
		{0.9, 0.6, 0.3}, // 橙色
	}

	// 设置字体(选择支持中文的字体)
	if err := dc.LoadFontFace("_examples/word-template/msyh.ttf", 12); err != nil {
		return fmt.Errorf("无法加载字体: %v", err)
	}

	var total float64
	for _, d := range data {
		total += d.value
	}

	startAngle := -math.Pi / 2 // 从顶部开始绘制
	for i, d := range data {
		percentage := d.value / total
		angle := percentage * 2 * math.Pi

		// 设置扇形颜色
		color := colors[i%len(colors)]
		dc.SetRGB(color.R, color.G, color.B)
		dc.DrawArc(width/2, height/2, radius, startAngle, startAngle+angle)
		dc.LineTo(width/2, height/2)
		dc.Fill()

		// 计算标签位置
		midAngle := startAngle + angle/2
		labelX := width/2 + (radius+20)*math.Cos(midAngle)
		labelY := height/2 + (radius+20)*math.Sin(midAngle)

		// 绘制标签和数据
		labelText := fmt.Sprintf("%s: %.0f", d.label, d.value)
		dc.SetRGB(0, 0, 0) // 文字颜色(黑色)
		dc.DrawStringAnchored(labelText, labelX, labelY, 0.5, 0.5)

		startAngle += angle
	}

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

代码解析

  1. 导入必要的包 :代码导入了fmtgithub.com/fogleman/ggmath包。

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

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

  4. 定义画布大小和半径:画布的宽度为640像素,高度为600像素,饼图的半径为200像素。

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

  6. 设置颜色和字体:定义了一组颜色,用于填充饼图的扇形。加载支持中文的字体,以便在图表上绘制文本标签。

  7. 计算总值:遍历数据,计算数据的总值,用于计算每个扇形的比例。

  8. 绘制饼图 :遍历数据,计算每个扇形的角度,使用dc.DrawArc绘制扇形,并填充颜色。计算每个扇形的标签位置,并在图表上绘制标签和数据。

  9. 保存图像 :将生成的图像保存为pie_chart.png文件。

运行代码

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

sh 复制代码
go run main.go

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

结论

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

效果

相关推荐
whcyhhh5 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十八4)
大数据·开发语言·python
65岁退休Coder14 分钟前
LangGraph v1.2.9 核心概念 & 流程控制
后端·python·langchain
z落落31 分钟前
C# Modbus-RTU 串口读写设备+CRC16+邮件告警
开发语言·c#
DS随心转小程序32 分钟前
Gemini只能导出了一部分Word文档,很少的一部分,不是我这个窗口所有的对话内容?
开发语言·人工智能·c#·word·豆包·deepseek·ai导出鸭
江畔柳前堤34 分钟前
消息队列:从直觉到精通的完整认知地图
开发语言·人工智能·算法·机器学习·ruby on rails·scala
程序员鱼皮36 分钟前
爆火的《牛来》模型正式发布!DeepSeek 的排名又下降了。。
前端·后端·ai编程
圣殿骑士-Khtangc39 分钟前
Go-sync包并发原语详解从Mutex到Once的深度应用
golang
格林威42 分钟前
C# 相机图像配合频闪光源:实现高速稳定拍摄的几个方法
开发语言·网络·人工智能·数码相机·计算机视觉·c#·视觉检测
灯澜忆梦44 分钟前
【基于GO的Web开发15】gin路由和路由组
前端·后端·golang·gin
陈老老老板1 小时前
2026 Web Scraping 教程:用 Codex + Bright Data 构建 Agent 原生数据采集流程
后端