使用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包绘制饼图。你可以根据需要调整数据和图表样式,生成各种自定义的饼图。希望本文对你有所帮助,祝你编程愉快!

效果

相关推荐
脑袋大大的8 分钟前
判断当前是否为钉钉环境
开发语言·前端·javascript·钉钉·企业应用开发
毕设源码_钟学姐9 分钟前
计算机毕业设计springboot宿舍管理信息系统 基于Spring Boot的高校宿舍管理平台设计与实现 Spring Boot框架下的宿舍管理系统开发
spring boot·后端·课程设计
Wy. Lsy35 分钟前
Kotlin基础学习记录
开发语言·学习·kotlin
方圆想当图灵1 小时前
ScheduledFutureTask 踩坑实录
后端
二楼后座。1 小时前
Golang操作MySQL json字段优雅写法
mysql·golang·json
全栈凯哥1 小时前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A11 小时前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
Tanecious.1 小时前
C++--红黑树
开发语言·c++
Top`1 小时前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket