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

news2024/9/22 0:28:33

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

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

安装gg

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

go get -u github.com/fogleman/gg

代码示例

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

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,然后在命令行运行以下命令:

go run main.go

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

结论

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

效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端的学习-CSS(七)

一:定位(position) 1:为什么使用定位。 有一些固定的盒子,并且压在其他盒子上面,一些网页,会有固定的窗口,这些是标准流和浮动无法解决的,比如下面的例子。旁边的红色边框的效果是不会随着页面的…

汇昌联信数字做拼多多运营怎么入行?

拼多多作为中国领先的电商平台之一,近年来在数字运营领域展现出了强大的生命力和创新能力。汇昌联信数字作为一个潜在的新入行者,如何进入拼多多的运营领域,成为业界关注的焦点。本文旨在探讨汇昌联信数字如何通过有效的策略和方法&#xff0…

hal库回调函数机制

1. 第一行就是标准库函数的 在 nvic那个中断向量表里面的函数 以前写的都是 在中断向量表里面把这个中断处理函数重写 2. 第二行 第三行 的 hal库就是 通过中断向量表里面的这个函数 ,再一次调用hal自己的中断回调函数,就是相当于多封装了两层 这个图更…

局部整体(二)利用python绘制维恩图

局部整体(二)利用python绘制维恩图 维恩图( Venn Diagram)简介 维恩图显示集与集之间所有可能存在的逻辑关系,每个集通常以一个圆圈表示,每个集都是一组具有共同之处的物件或数据。当多个圆圈(…

【Material-UI】File Upload Button 组件详解

文章目录 一、基础实现1. component"label"2. 隐藏的输入元素 二、样式和交互增强1. 自定义按钮样式2. 交互提示 三、支持多文件上传四、无障碍性(Accessibility)1. 提供 aria-label 或 aria-labelledby2. 支持键盘导航 五、高级用法和集成1. …

leetcode-215. 数组中的第K个最大元素

题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5…

STM32-低功耗模式详解

一、概述 低功耗模式(Low Power Mode)是为了减少电子设备的能耗而设计的操作模式,广泛应用于依赖电池供电的设备中,旨在延长电池寿命或减少能源消耗。在用户需要设备长时间工作或在电量极为有限的情况下非常实用,虽然牺…

如何在IDEA上使用JDBC编程【保姆级教程】

目录 前言 什么是JDBC编程 本质 使用JDBC编程的优势 JDBC流程 如何在IEDA上使用JDBC JDBC编程 1.创建并初始化数据源 2.与数据库服务器建立连接 3.创建PreparedStatement对象编写sql语句 4.执行SQL语句并处理结果集 executeUpdate executeQuery 5.释放资源 前言 在…

yandex 不定长旋转验证码PPOCR识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某yandex 不定长旋转验证码如下: 可以看到,此种验证码非常变态,旋转角度不固定,干扰背景不固定,字符长度不固定,弯曲形变都是不固定的,在人眼都很难分辨验证…

『 C++ 』异常

文章目录 异常概念及使用自定义类型的异常C 标准库的异常体系异常的重新抛出异常安全异常规范异常的优缺点 异常概念及使用 C语言常见的错误处理机制如下: 返回值约定 通过定义一些列的返回值以及其对应的错误信息表述,通过不同的返回值来查看当前函数是否与调用成功; 通常情…

锂电池生产工艺数字化的业务架构.pptx

搜索《方案驿站》公众号进行下载。

【系统架构设计】数据库系统(五)

数据库系统(五) 数据库模式与范式数据库设计备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 备份与恢复 分布式数据库系统 数据仓库 数据挖掘 对数据挖掘技术进行支持的三种基础技术已经发展成熟&#xff0c…

【设计模式】六大原则-上

首先什么是设计模式? 相信刚上大学的你和我一样,在学习这门课的时候根本不了解这些设计原则和模式有什么用处,反而不如隔壁的C更有意思,至少还能弹出一个小黑框,给我个hello world。 如何你和我一样也是这么想&#xf…

2-56 基于matlab的图像融合增强技术

基于matlab的图像融合增强技术。通过原始图像——傅里叶变换——频率域滤波处理——傅里叶变换——增强后的图像。傅立叶变换以及傅立叶反变换.过程就是将空间的信息分解为在频率上的表示,通过傅立叶正反变换的处理,才使得频率域上的处理可以用于图像的增强。程序已调通&#x…

联想QuickFix工具中心,一款综合性电脑维护和管理工具

联想QuickFix工具中心是联想公司推出的一款综合性电脑维护和管理工具,它集成了众多实用的电脑维护工具,如系统优化、硬盘清理、网络优化、硬件诊断等,旨在为用户提供一个便捷的平台来解决电脑日常使用中遇到的各种问题。该工具中心适用于Wind…

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘. 已解决

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…

【Linux---07】Shell脚本

文章目录 1. 前置说明1.1 创建shell脚本1.2 执行shell脚本1.3 调试shell脚本1.4 字符冲突 2. 变量2.1 创建&使用变量2.2 位置变量2.3 引号规则2.4 数值变量运算 3. 数组3.1 创建数组3.2 使用数组 4. 运算符4.1 比较运算符4.1.1 数字比较4.1.2 字符串比较 4.2 逻辑运算符4.3…

国内首个可调用API的视频模型,CogVideoX有多能打?

近期,智谱AI在其Maas开放平台(bigmodel.cn)发布了视频生成大模型CogVideoX,它提供了国内首个通过API来使用的文生视频和图生视频服务! 话不多说,我们直接来看一下通过CogVideoX生成的一部短片。 技术原理 CogVideoX融合了文本、…

CSP-J复赛-模拟题4

1.区间覆盖问题: 题目描述 给定一个长度为n的序列1,2,...,a1​,a2​,...,an​。你可以对该序列执行区间覆盖操作,即将区间[l,r]中的数字,1,...,al​,al1​,...,ar​全部修改成同一个数字。 现在有T次操作,每次操作由l,r,p,k四个值组成&am…

未授权访问漏洞系列详解⑦!

VNC未授权访问漏洞 VNC 是虚拟网络控制台 Virtual Network Console 的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、590…