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

news2024/9/23 23:22:06

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

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

安装gg

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

go get -u github.com/fogleman/gg

代码示例

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

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. 导入必要的包:代码导入了fmtloggithub.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,然后在命令行运行以下命令:

go run main.go

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

结论

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

效果

在这里插入图片描述

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

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

相关文章

⌈ 传知代码 ⌋ 改进表情识别

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Unity入门2——编辑器常用功能

点击文件夹&#xff0c;右键&#xff0c;选择showInExplorer可以在文件管理器中打开 选中多个图片素材&#xff0c;在Inspector里将Texture Type设置为Sprite(2D and UI)即可将图片素材用于UI 右键Hierachy面板的空白区&#xff0c;点击UI->Panel可以创建UI面板&#xf…

GPT-SoVITS-文本转语音(你的声音不再是唯一)

本文将要介绍GPT-SoVITS的安装和使用方法 首先感谢花儿不哭大佬带来的RVC声音克隆 花儿不哭&#xff1a; 花儿不哭的个人空间-花儿不哭个人主页-哔哩哔哩视频 (bilibili.com) GPT-SoVITS下载地址 GitHub - RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a …

网络药理学:分子对接之pocasa/proteins.plus/Deepsite网站预测蛋白口袋

前言 配体的结合需要疏水作用&#xff0c;通常来说&#xff0c;疏水性空腔&#xff08;开口小、肚子大、能容纳一定体积的分子结构&#xff09;更有可能成为口袋。当我们复现网络药理学文章时可能经过前面的筛选&#xff0c;依旧有数个乃至数十个蛋白需要做分子对接验证。此时如…

算法——动态规划:基础

文章目录 一、基本介绍二、案例——斐波那契数列1. 基本介绍2. 递归实现3. 动态规划3.1 重叠子问题3.2 最优子结构3.3 无后效性3.4 性质的总结 4. 使用 动态规划 的思想实现4.1 自顶向下 的 递归4.2 自底向上 的 递推4.3 两种思路的简单比较 三、总结 一、基本介绍 动态规划&a…

python语言day4 函数 生成器yield、next关键字 装饰器

一、 函数 定义&#xff1a; def info(): print("执行info()函数") 直接调用方法和封装一个函数&#xff1a; 使用信息发送的功能为例 登录163网易免费邮-你的专业电子邮局 1&#xff09;开启POP3/SMTP服务&#xff0c;会得到对应的授权码&#xff0c;也就是登陆…

2024年旗舰骨传导耳机大对比:南卡、韶音和墨觉,哪款最值得购买?

作为专注于数码产品的博主&#xff0c;我对骨传导耳机的迅猛发展深有感触。这类耳机以其与众不同的技术和设计风格&#xff0c;成功捕捉了消费者的兴趣。它们独特的工作原理不仅保留了使用者对周围环境的感知&#xff0c;还能提供清晰的音乐播放和通话体验&#xff0c;特别适合…

第三方软件检测机构服务类型

在信息技术飞速发展的今天&#xff0c;软件产品的质量已成为企业竞争力的重要组成部分。卓码软件测评这家第三方软件检测机构致力于提供一流的软件测试服务&#xff0c;帮助企业确保其软件产品的可靠性和安全性。 一、项目验收测试&#xff1a;确保交付质量   项目验收测试是…

力扣-240.搜索二维矩阵(2)

刷力扣热题–第二十七天:240.搜索二维矩阵(2) 新手第二十七天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目简介 2.题目解答 这道题的想法就是,整体遍历,在遇到比target还大的,就停止这行的遍历,然后转过去继续遍历下一行,如果有一行的开头大于target,直接返回…

嘉盛平台的代理返佣机制:一份详细的说明书

在金融市场合作模式的多样性中&#xff0c;嘉盛平台的代理返佣机制无疑是一个引人注目的亮点。想了解更多关于嘉盛平台的代理返佣机制吗&#xff1f;本文将为您详细解答。嘉盛开户MT4平台开户链接 &#xff1a;https://application.jszhanghao.com/cn-meta/step/1?ibcodeFXAMM…

Windows--WSL2--Ubuntuon--Docker

编写目的&#xff1a; 在Windows上安装Docker&#xff0c;用Docker安装Gitlab、Jenkins等软件。 文章记录一下Windows上安装Docker的过程。 参考文档&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 下面用"参考文档"代替 目录 第一步&#xff1a;启…

RK3568平台开发系列讲解(文件系统篇)FLASH 均衡擦写(UBI)

🚀返回专栏总目录 文章目录 一、UBI均衡二、日志打印三、常见打印四、erase_worker四、ensure_wear_leveling五、wear_leveling_worker上层应用通过逻辑地址来访问存储设备,FTL把不同的逻辑地址映射到Nand Flash中的不同位置。 一、UBI均衡 Ubi擦写均衡在ubi驱动中c 处理,u…

66 函数精彩案例

1 编写函数&#xff0c;接收任意多个实数&#xff0c;返回一个元组&#xff0c;其中第一个元素为所有参数的平均值&#xff0c;其他元素为所有参数中大于平均值的实数。 def func(*parameter):avg sum(parameter) / len(parameter) # 平均值g [i for i in parameter if i &…

哈萨克语驾考学习软件求推荐?

哈语驾考APP专门为哈萨克族考驾照的学员提供了科目一科目四题库在线练习和模拟考试&#xff0c;是一款哈汉双语版本的驾考学习APP。软件内可同时切换哈萨克语题库和语言文字&#xff0c;有多种学习模式。题库同步车管所考题&#xff0c;通过率高。包含了科一、科四模拟考试、路…

PP 8 创建工艺路线

事务代码&#xff1a;CA01(注&#xff1a;定额工艺路线&#xff1a;CA21(重复制造)) 组和组计数器确定唯一工艺路线 创建一个组 把组分配给物料 物料有多个工艺路线 可以把组分给多个物料 如果打上删除标识&#xff0c;工艺路线无效

前端(四):前后端分离开发(YAPI的使用)

一、引入 1、前后端混合开发&#xff08;早期&#xff09;&#xff1a;将前端、后端、数据库混杂在一起写&#xff0c;前后前全部在一个工程中。沟通成本高、分工不明确、不便于管理、不便于维护和扩展。 2、前后端分离开发&#xff1a;前端工程和后端工程&#xff0c;为了前…

设计模式之拦截器模式

目录 1.概述 2.结构 3.java实现示例 4.常见实现框架 5.C实现拦截器模式 6.拦截器和过滤器的异同 7.应用场景 8.优缺点 9.总结 1.概述 拦截器模式&#xff08;Interceptor Pattern&#xff09;是一种在请求被处理之前或之后自动执行代码的设计模式。它允许开发者在方法…

【自动驾驶】ubuntu20.04安装完整ROS的Noetic版本

目录 安装过程换源及安装注意&#xff1a;三级目录 安装过程 1.配置ubuntu的软件和更新 配置ubuntu的软件和更新&#xff0c;允许安装不经认证的软件。 首先打开“软件和更新”对话框&#xff0c;在设置菜单中的&#xff0c;关于&#xff0c;软件更新。 打开后按照下图进行配…

字符串左旋(c语言)

1.字符串左旋 //实现一个函数&#xff0c;可以左旋字符串的k个字符 例如&#xff1a;ABCD左旋字符串的1个字符BCDA ABCD左旋字符串的2个字符CDAB 2.第一步我们先输入k&#xff08;scanf&#xff09;,将第一位进行储存&#xff0c;然后其他位先前走一位&#xff0c;然后将第一…

分布式事务一站式解决方案-Seata

分布式事务一站式解决方案- 分布式事务一站式解决方案分布式事务产生背景三个概念Seata下载和安装实际业务模拟演示不加 GlobalTransactional 注解&#xff0c;正常操作下单不加 GlobalTransactional 注解&#xff0c;下单过程出异常或者超时了加 GlobalTransactional 注解&…