使用Go语言绘制柱状图教程

使用Go语言绘制柱状图教程

本文将介绍如何使用Go语言及gg包绘制柱状图,并将图表保存为PNG格式的图片。gg包是一个功能强大的2D图形库,适合用于绘制各种图表。

安装gg

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

go get -u github.com/fogleman/gg

代码示例

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

package mainimport ("fmt""log""math""github.com/fogleman/gg"
)func main() {// 定义柱状图文件路径barChartFile := "bar_chart.png"// 创建柱状图if err := createBarChart(barChartFile); err != nil {log.Fatalf("创建柱状图时出错: %v", err)}fmt.Println("柱状图生成成功")
}// 创建柱状图并保存为图片
func createBarChart(filename string) error {const (width      = 900  // 画布宽度height     = 700  // 画布高度barWidth   = 60   // 柱子的固定宽度barSpacing = 60.0 // 柱子之间的间隔margin     = 50   // 边距)// 数据data := []struct {label stringvalue float64}{{"身份证", 15},{"电话号码", 2000},{"地址信息", 2500},{"银行卡号", 3000},{"财务数据", 3500},{"基础信息", 4000},{"户籍信息", 4500},}// 计算数据中的最大值var maxValue float64for _, d := range data {if d.value > maxValue {maxValue = d.value}}// 设置纵坐标最大值,稍微高于数据中的最大值,保证柱子不贴顶maxValue *= 1.1// 创建画布dc := gg.NewContext(width, height)dc.SetRGB(1, 1, 1) // 背景色为白色dc.Clear()// 定义颜色colors := []struct{ R, G, B float64 }{{0.8, 0.2, 0.2}, // 红色{0.2, 0.8, 0.2}, // 绿色{0.2, 0.2, 0.8}, // 蓝色{0.8, 0.8, 0.2}, // 黄色{0.8, 0.2, 0.8}, // 紫色{0.2, 0.8, 0.8}, // 青色{0.8, 0.8, 0.8}, // 灰色}// 加载自定义字体if err := dc.LoadFontFace("_examples/word-template/msyh.ttf", 12); err != nil {return fmt.Errorf("无法加载字体: %v", err)}// 绘制柱状图for i, d := range data {x := margin + float64(i)*(barWidth+barSpacing)                    // x轴起始位置y := height - margin - (d.value / maxValue * (height - 2*margin)) // y轴起始位置减去柱子的高度color := colors[i%len(colors)]                                    // 循环使用颜色dc.SetRGB(color.R, color.G, color.B)dc.DrawRectangle(x, y, barWidth, (d.value / maxValue * (height - 2*margin)))dc.Fill()}// 绘制坐标轴dc.SetRGB(0, 0, 0)                                              // 黑色dc.DrawLine(margin, height-margin, width-margin, height-margin) // X轴dc.DrawLine(margin, height-margin, margin, margin)              // Y轴dc.Stroke()// 计算纵坐标标签间隔interval := calculateInterval(maxValue, 10)// 添加横坐标标签for i, d := range data {dc.DrawStringAnchored(d.label, margin+float64(i)*(barWidth+barSpacing)+barWidth/2, height-margin+20, 0.5, 1)}// 添加纵坐标标签for i := 0.0; i <= maxValue; i += interval {y := height - margin - (i / maxValue * (height - 2*margin))dc.DrawStringAnchored(fmt.Sprintf("%.0f", i), margin-10, y, 1, 0.5)}// 保存图像为PNG文件return dc.SavePNG(filename)
}// 计算适当的标签间隔
func calculateInterval(maxValue float64, maxLabels int) float64 {interval := maxValue / float64(maxLabels)// 向上取整到最近的10的倍数magnitude := math.Pow(10, math.Floor(math.Log10(interval)))normalized := interval / magnitudeif normalized > 5 {interval = 10 * magnitude} else if normalized > 2 {interval = 5 * magnitude} else {interval = 2 * magnitude}return interval
}

代码解析

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

  2. 定义画布大小和柱状图参数:画布的宽度为900像素,高度为700像素,柱子的宽度为60像素,柱子之间的间隔为60像素,边距为50像素。

  3. 数据定义:定义了一组数据,每个数据项包括一个标签和一个值。

  4. 计算最大值:遍历数据以确定最大值,并将最大值稍微增加10%以便在图表中显示完整。

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

  6. 定义颜色:定义了七种颜色用于绘制柱子。

  7. 加载自定义字体:使用dc.LoadFontFace方法加载自定义字体(这里假设字体文件路径为_examples/word-template/msyh.ttf)。

  8. 绘制柱子:遍历数据,计算每个柱子的x轴和y轴位置,并绘制矩形表示柱子。

  9. 绘制坐标轴:使用dc.DrawLine方法绘制X轴和Y轴。

  10. 计算纵坐标标签间隔:调用calculateInterval函数计算适当的纵坐标标签间隔。

  11. 添加横坐标和纵坐标标签:在适当的位置绘制横坐标和纵坐标标签。

  12. 保存图像:使用dc.SavePNG方法将图表保存为PNG文件。

运行代码

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

go run main.go

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

结论

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

效果图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安当产品应用案例100集】005-安当ASP实现Exchange双因素登录认证

Exchange双因素登录通过增加额外的安全验证层&#xff0c;可以有效提高企业邮箱系统的安全性&#xff0c;减少了数据泄露和账号被盗的风险&#xff0c;同时也符合了日益严格的安全合规要求。 其必要性主要体现在以下几个方面&#xff1a; 提高安全性&#xff1a;传统的用户名…

1.MySQL面试题之innodb如何解决幻读

1. 写在前面 在数据库系统中&#xff0c;幻读&#xff08;Phantom Read&#xff09;是指在一个事务中&#xff0c;两次读取同一范围的数据集时&#xff0c;由于其他事务的插入操作&#xff0c;导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎&#xff…

【期货】收盘点评。昨天说的,p2409棕榈油在今天或者周一会走出行情

收盘点评 昨天说的&#xff0c;p2409棕榈油在今天或者周一会走出行情。事实就是如此。震荡了几天了&#xff0c;波幅不大的来回震荡&#xff0c;其实主力是不想震荡的&#xff0c;但是不震荡自己的货和行情走不出来。所以我昨天就说&#xff0c;应该就是这一两天会走出一波小行…

Linux中的无人值守安装脚本Kickstart

目录 一.kickstart自动安装脚本的作用 在企业中安装多台操作系统时面临的问题 如何解决以上问题&#xff1f; 二.实验环境 三.kickstart自动安装脚本的制作 通过模板生成kickstart文件 1.安装图形化生成kickstart自动安装脚本的工具 2.图形化工具配置流程 3.配置文件详…

力扣热题100_二叉树_94_二叉树的中序遍历

文章目录 题目链接解题思路解题代码 题目链接 94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输…

C#中重写tospring方法

在C#中&#xff0c;重写ToString方法允许你自定义对象的字符串表示形式。当你想要打印对象或者在调试时查看对象的状态时&#xff0c;重写ToString方法非常有用。 默认情况下&#xff0c;ToString方法返回对象的类型名称。通过重写这个方法&#xff0c;你可以返回一个更有意义…

sqli 1- 10

sql靶场 第一关 首先我们需要判断是否存在sql注入点&#xff0c;前端界面提示我使用ID作为参数,在url地址栏输入?id1 通过输入不同的id值查询数据库相对应的内容&#xff0c;之后判断为数字型还是字符型 根据查询内容判断为字符型且有注入点&#xff0c;再通过联合查询&…

#71结构体案例2(三国游戏,冒泡排序)

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <string> using namespace std;//英雄结构体 struct Hero {string name;int age;string gender; };//冒泡排序 void bubbleSort(struct Hero hArray[],int len) {for(int i0;i<len-1;i){for(i…

首届中文NL2SQL挑战赛亚军比赛攻略_BugCreater

关联比赛: 首届中文NL2SQL挑战赛 1. 任务描述 本次比赛的任务&#xff1a;根据Question、表格信息&#xff08;包含列名、列类型、内容&#xff09;&#xff0c;预测对应的SQL语句&#xff08;下图黄色部分&#xff09;。比赛只涉及单表查询&#xff0c;需要预测的有4部分&a…

什么是DDoS攻击?怎么防御DDoS攻击?

在网络安全领域&#xff0c;DDoS 攻击一直是热门话题&#xff0c;随着网络技术的不断发展和网络环境的复杂化演变&#xff0c;DDoS 攻击变得愈加频繁、更具破坏性。根据 2023 年网络安全态势研判分析年度综合报告&#xff0c;全年全网网络层的 DDoS 攻击次数达 2.51 亿次&#…

【Kubernetes】k8s集群的pod基础

目录 一.Pod概述 1.什么是pod 2.k8s中pod的两种使用方式 3.pod容器的常规使用流程 4.创建pod的3种方式 二.Pod中容器概述 1.容器分类 2.Pod容器的3种镜像拉取策略 3.Pod容器的3种重启策略 4.pod的dns策略 一.Pod概述 1.什么是pod Pod是kubernetes中最小的资源管理组…

MySQL深分页和浅分页

前言 最近有面试过也遇到了问关于深分页问题&#xff0c;在这里简单从MySQL、ES等方面分享一下自己对该问题认识和总结。 一、深分页定义 可以从ES定义上来划分浅分页和深分页的边界&#xff0c;即页数超过10000页为深分页&#xff0c;少于10000页为浅分页。 二、MySQL深分…

初学Ubuntu及遇到的问题

初学Ubuntu及遇到的问题 Ubuntu的安装 1.安装VMware Workstation Pro&#xff08;网上有很多资料&#xff0c;本文就不细说啦~~~&#xff09; 2.在Ubuntu官网下载iso文件>https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/ iso文件随便放在哪个位置&#xff…

内网穿透原理,免费内网穿透(简单使用),公网主动访问内网。

内网穿透的本质就是流量转发&#xff0c;把一个电脑的网卡上的流量数据&#xff0c;转发到另一个网卡的流量数据。 实现原理 网络协议分层就是&#xff0c;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;应用层。我简单解释一下这些分层协议…

消灭星星游戏程序设计【连载十】——小星星的残影轨迹

消灭星星游戏程序设计【连载十】——小星星的残影轨迹 大家每次都可以在页面中下载本节内容的实现代码&#xff0c;一步一步从简单开始&#xff0c;逐步完成游戏的各种功能&#xff0c;如果大家有任何问题也欢迎留言交流。 游戏整体效果展示&#xff1a; 1、本节要达到的效果 …

MyBatis快速学习

目录 前言 MyBatis的具体使用 一些小工具&#xff1a;MyBatisX 常见问题&#xff1a; 1.表中字段名和实体属性名不一致 2.按条件查询&#xff08;单条件&#xff09;时的&#xff0c;查询条件怎么编写 3.按条件查询&#xff08;多条件&#xff09; 4.多条件查询时&…

pywinauto:Windows桌面应用自动化测试(七)

前言 上一篇文章地址&#xff1a; pywinauto&#xff1a;Windows桌面应用自动化测试&#xff08;六&#xff09;-CSDN博客 下一篇文章地址&#xff1a; 暂无 一、实战常用方法 1、通过Desktop快速获取窗口 通过之前章节我们了解到控制应用的方法为Application&#xff0…

10、springboot3 vue3开发平台-前端-elementplus, axios配置及封装使用, 包含token 存储

1. 准备工作 1.1 清除项目自带页面 删除views和components目录下所有东西&#xff1a; 1.2 修改App.vue <script setup lang"ts"></script><template><router-view></router-view> </template><style scoped></st…

基于R语言绘制GGE双标图2

参考资料&#xff1a; 严威凯等: 双标图分析在农作物品种多点试验中的应用【作物学报】 https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、如何判断双标图是否充分体现数据中的规律 在对双标图的解释中&#xff0c;有一个隐含的假设&#xff0c;就是所…

COFFEE AI PARTNER -- 神奇的AI工具,相当我雇佣了一个AI员工,淘汰你的是会使用AI的人

COFFEE AI PARTNER介绍 COFFEE AI PARTNER是由 AI JAVA开发的一款生成式人工智能工具&#xff08;又名AI助手&#xff09;&#xff0c;尝试一下。 首先域名似乎正在备案中&#xff0c;企业邮箱似乎正在采购&#xff0c;目前服务地址是&#xff1a;COFFEE AI PARTNER-官网 官网…