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

效果

相关推荐
姑苏洛言3 分钟前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
光而不耀@lgy18 分钟前
C++初登门槛
linux·开发语言·网络·c++·后端
lkbhua莱克瓦2423 分钟前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
Mr__Miss27 分钟前
面试踩过的坑
java·开发语言
啊丢_29 分钟前
C++——Lambda表达式
开发语言·c++
方圆想当图灵37 分钟前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
毅航1 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
Chh07151 小时前
《R语言SCI期刊论文绘图专题计划》大纲
开发语言·r语言
Yeats_Liao1 小时前
Go 语言 TCP 端口扫描器实现与 Goroutine 池原理
开发语言·tcp/ip·golang
我的golang之路果然有问题1 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database