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

news/2024/11/13 5:17:21/

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

在本教程中,我们将学习如何使用Go语言及gg包绘制水平柱状图,并将图表保存为PNG格式的图片。水平柱状图适用于展示多个类别的数据,且便于标签的排列和阅读。

安装gg

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

go get -u github.com/fogleman/gg

代码示例

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

package mainimport ("bytes""fmt""image/color""os""github.com/fogleman/gg"
)type Data struct {Label stringValue float64
}func main() {data := []Data{{"192.168.129.13", 60.1},{"192.168.129.73", 59.3},{"192.168.129.24", 38.2},{"192.168.129.19", 22.7},{"192.168.129.16", 16.7},}colors := []color.RGBA{{255, 99, 71, 255},   // 红色{255, 165, 0, 255},   // 橙色{30, 144, 255, 255},  // 蓝色{169, 169, 169, 255}, // 灰色{169, 169, 169, 255}, // 灰色}const (width     = 600height    = 200barHeight = 20padding   = 10)dc := gg.NewContext(width, height)dc.SetColor(color.White)dc.Clear()// Calculate total height of the barstotalBarHeight := float64(len(data))*(barHeight+padding) - padding// Calculate starting Y coordinate to center the bars verticallystartY := (height - totalBarHeight) / 2// Draw bars and textfor i, d := range data {y := startY + float64(i)*(barHeight+padding)// Draw circle with numberdc.SetColor(colors[i])dc.DrawCircle(20, y+barHeight/2, 10)dc.Fill()dc.SetColor(color.White)dc.DrawStringAnchored(fmt.Sprintf("%d", i+1), 20, y+barHeight/2, 0.5, 0.5)// Draw labeldc.SetColor(color.Black)dc.DrawStringAnchored(d.Label, 50, y+barHeight/2, 0, 0.5)// Draw barbarWidth := d.Value * 5 // Scale value to fit the widthdc.SetColor(colors[i])dc.DrawRectangle(150, y, barWidth, barHeight)dc.Fill()// Draw valuedc.SetColor(color.Black)dc.DrawStringAnchored(fmt.Sprintf("%.1f GB", d.Value), 150+barWidth+10, y+barHeight/2, 0, 0.5)}// Save to buffervar buf bytes.Bufferdc.EncodePNG(&buf)// Optionally save to fileif err := os.WriteFile("bar_chart.png", buf.Bytes(), 0644); err != nil {fmt.Println("Error saving file:", err)}
}

代码解析

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

  2. 定义数据结构:定义了一个Data结构体,其中包含标签和数值。

  3. 初始化数据:创建了一组包含IP地址和对应数值的数据。

  4. 定义颜色:定义了几种颜色用于绘制柱子。

  5. 定义画布大小和柱状图参数:画布的宽度为600像素,高度为200像素,柱子的高度为20像素,柱子之间的间隔为10像素。

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

  7. 计算柱子的总高度:计算所有柱子的总高度,以便将柱子垂直居中。

  8. 绘制柱子和文本:遍历数据,计算每个柱子的y轴位置,绘制圆形编号、标签、柱子和数值。

  9. 保存图像到缓冲区:将图像编码为PNG格式并保存到缓冲区。

  10. 保存图像到文件:将缓冲区中的图像保存到文件bar_chart.png

运行代码

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

go run main.go

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

结论

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

效果

在这里插入图片描述


http://www.ppmy.cn/news/1505652.html

相关文章

Linux服务器SSH远程密钥免密登录

说明 业务场景中经常需要进行跨服务器的操作,即从一台服务器上登录到另外一台服务器,默认情况下,SSH远程登录时需要输入远程服务器密码。当需要在可信任的服务器之间进行频繁或自动化的操作时,输入密码就会带来不便。 本文介绍如…

第六章 网络互连与互联网(二)

二、广域网互连 (1)广域网的互连一般采用在网络层进行协议转换的办法实现 。这里使用的互连设备叫作网关,更确切地说,是路由器。 (2)ISO 标准化了的两种网络互连方法,即面向连接的互连方式和无…

嵌入式MCU面试题汇总及参考答案(2万字长文)

目录 什么是MCU?它有哪些主要组成部分? 请解释MCU的时钟系统是如何工作的。 MCU的存储器结构是怎样的?包括哪些类型? 如何理解MCU的中断优先级和中断响应过程? 请简述MCU的功耗管理策略。 MCU的引脚配置有哪些注意事项? 什么是I/O端口?如何配置和管理? 请解释M…

翻译: 梯度下降 深度学习神经网络如何学习一

在上一节影片里我讲解了神经网络的结构 首先我们来快速回顾一下 在本节影片里,我们有两个目标 首介绍梯度下降的概念 它不仅是神经网络工作的基础 也是很多其他机器学习方法的基础 然后我们会研究一下这个特别的网络是如何工作的 以及这些隐藏的神经元层究竟在寻找什…

搭建PXE实现服务器自动部署

PXE(Preboot Execution Environment)是一种计算机启动技术,它允许计算机从网络上的服务器而不是从本地硬盘或光盘等存储介质上启动。这种技术主要应用在无盘工作站、网络安装操作系统、远程维护等方面。 环境:一台rhel7.9作为PXE…

前端开发:创建可拖动的固定位置 `<div>` 和自动隐藏悬浮按钮

在前端开发中&#xff0c;实现一个可拖动的固定位置 <div>&#xff0c;并且根据拖动的状态控制其显示和隐藏&#xff0c;同时在特定条件下显示悬浮按钮&#xff0c;涉及以下技术和原理&#xff1a; 技术细节和实现步骤&#xff1a; 1. HTML 结构&#xff1a; <!DOC…

OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

《OpenShift / RHEL / DevSecOps 汇总目录》 本文适合 OpenShift 4.11 及其以上版本。 文章目录 在离线环境中用 OpenShift 准备 Mirror Registry环境说明向隔离环境复制镜像准备节点环境bastion 节点操作support 节点操作 网络完全隔离环境-复制镜像bastion 节点操作support …

C语言实现UDP广播

UDP 广播发送方 1.创建套接字&#xff1a;使用socket()函数创建一个UDP套接字。 2.设置套接字选项&#xff1a;使用setsockopt()函数设置SO_BROADCAST选项以允许广播。 3.发送数据&#xff1a;使用sendto()函数将数据发送到特定的广播地址和端口。 #include <stdio.h> …