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

news2024/9/20 1:03:36

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

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

安装gg

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

go get -u github.com/fogleman/gg

代码示例

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

package main

import (
	"bytes"
	"fmt"
	"image/color"
	"os"

	"github.com/fogleman/gg"
)

type Data struct {
	Label string
	Value 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     = 600
		height    = 200
		barHeight = 20
		padding   = 10
	)

	dc := gg.NewContext(width, height)
	dc.SetColor(color.White)
	dc.Clear()

	// Calculate total height of the bars
	totalBarHeight := float64(len(data))*(barHeight+padding) - padding

	// Calculate starting Y coordinate to center the bars vertically
	startY := (height - totalBarHeight) / 2

	// Draw bars and text
	for i, d := range data {
		y := startY + float64(i)*(barHeight+padding)

		// Draw circle with number
		dc.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 label
		dc.SetColor(color.Black)
		dc.DrawStringAnchored(d.Label, 50, y+barHeight/2, 0, 0.5)

		// Draw bar
		barWidth := d.Value * 5 // Scale value to fit the width
		dc.SetColor(colors[i])
		dc.DrawRectangle(150, y, barWidth, barHeight)
		dc.Fill()

		// Draw value
		dc.SetColor(color.Black)
		dc.DrawStringAnchored(fmt.Sprintf("%.1f GB", d.Value), 150+barWidth+10, y+barHeight/2, 0, 0.5)
	}

	// Save to buffer
	var buf bytes.Buffer
	dc.EncodePNG(&buf)

	// Optionally save to file
	if 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.coloradmin.cn/o/1985121.html

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

相关文章

远程抄表,构建智能水电管理

选自成都纵横智控官网-https://www.iotrouter.com/news/1320.html 众所周知,传统的人工抄表方式需要耗费大量人力资源,同时存在抄表难、监管难、收费难、缴费难等一系列问题。在万物互联时代下,物联网技术迅速发展,智能水电联控云…

Laya3.0 调用第三方js的方法

1.新建一个js文件,例如:SuanShi.js // 暴露类到全局作用域 ; window.SuanShi window.suan {}; (function (suan) {class JiSuan {constructor() {}static computeExpression(a, b) {return this.jia(a, b);}static jia(a, b) {return a b;}}suan.JiS…

TiDB v7.5.3 发版,听说升级后又可以躺平两年

众所周知 TiDB 运维很稳、升级丝滑,8 月 5 日,TiDB v7.5.3 发版,作为 TiDB v7 系列的最新长期支持版本,有升级需求的小伙伴可以安排起来了。 TiDB 7.5.3 发版说明 兼容性:新增系统表 INFORMATION_SCHEMA.KEYWORDS 用来…

打造成功的知识付费平台:从技术到内容的全面解析

在现代Web开发中,RESTful API是一种常用的接口设计风格。它使用HTTP协议,允许客户端与服务器之间进行数据交互。本文将通过一个简单的例子,介绍如何使用Python和Flask框架构建一个RESTful API。 一、准备工作 首先,我们需要安装…

Github 2024-08-06 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次关注人数…

代码随想录算法训练营day35:动态规划03:背包问题:0-1背包;416. 分割等和子集

背包问题理论 主要需要掌握: 物品个数上不同!!! 0-1背包:n种物品 每种物品只有一个——只考虑每个物品放与不放 完全背包:n种物品 每种物品有无数个 多重背包:n种物品 每种物品个数各不相同…

Arch Linux-0-电脑安装Arch Linux系统-原Windows转Arch Linux

文章目录 一、使用U盘制作安装镜像1.1 下载并验证iso文件1.1.1 方案一:使用.torrent下载iso文件(1)下载.torrent文件(2)选取可以用的工具qbittorrent 1.1.2 方案二:国内镜像站下载(推荐&#xf…

轻闪PDF v2.14.9 解锁版下载与安装教程 (全能PDF转换器)

前言 轻闪PDF(原傲软PDF编辑软件)是一款操作简单的全能PDF转换器,轻松实现PDF转换为Word,Excel或其他格式,以及PDF压缩,合并和图片文字识别OCR等功能.这款pdf编辑转换软件几乎支持所有常见文档格式,一键完成PDF与其他文档互相转换,并含有PDF合并,压缩,图片文字识别OCR等增值功…

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

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

如何有效开展产业链招商?

产业链招商是一种以产业大数据为依托、以产业链图谱为基础、以产业链分析为核心、以完善产业链结构为目标的招商引资方式。相比于传统招商模式,产业链招商比拼的并不是土地、政策优惠,而是以产业链分析为核心,诊断区域产业链结构及长短板&…

springboot书店销售管理系统-计算机毕业设计源码09304

摘要 随着互联网的普及和发展,线上书店越来越受到人们的欢迎。为了更好地管理书店的销售活动,提高用户体验,开发一个基于Springboot的书店销售管理系统是至关重要的。这种系统可以帮助书店管理员更高效地管理书籍、订单和用户信息&#xff0c…

SpringBoot基础 第一天

SpringBoot配置的文件名是固定的:application.yml application.properties YAML:以数据为中心 比Json xml更适合做配置文件 YAML语法: 1 字面量:普通值(字符串 布尔值 数字) (1) k: v (2) " "不会转义 会转义 2 对象,map(属性和值) (1)…

kettle从入门到精通 第八十四课 ETL之kettle kettle中Get data from XML使用实战教程

场景:解析xml文件或者内容解析出其中某些字段。 本来想着这个步骤使用起来比较简单,就没有梳理成文,结果群里的小伙伴为了使用这个步骤折腾了一下午。故有了此文。 在开始学习之前我们一起来学习下xml命名空间的相关知识,为下文展…

rem适配与vw适配

rem适配与vw适配 1.rem适配1.1原理1.2步骤1.3.1技术方案一1.3.2技术方案二 2.vw适配2.1原理2.2计算 3.rem适配与vw适配的优缺点 1.rem适配 1.1原理 rem(根em)是基于根元素(即HTML元素)的字体大小的长度单位。当根元素的字体大小…

【数据结构与算法】链栈(恋战)

链栈 一.链栈的原理二.结构三.初始化四.是否为空或满1.空2.满 五.入栈六.遍历栈七.出栈八.获取栈顶元素 一.链栈的原理 我们上节课用的数组来实现,现在我们用链式存储来实现,其实跟链队列基本一样,只不过是出栈的位置不一样而已. 二.结构 用一个头来当栈,每个节点作为链子. …

独角数卡支付后显示待支付问题

我这边碰到的是因为上线前测试未修改,看图片: 希望对你有帮助

Github零成本部署网站

网站的意义 网站是互联网上的信息平台,用于发布和交流内容。它们提供了从教育资料到商业服务等各种信息和服务。对企业和个人而言,网站是展示形象、沟通用户的重要渠道,有助于提升品牌认知度和促进业务发展。随着移动技术的进步,…

Linux 系统控制器助力包装灌装旋盖机实现智能控制

在包装行业中,灌装旋盖机是一种重要的设备,用于完成液体或粉体的灌装和旋盖操作。随着工业自动化和智能化的发展,对包装灌装旋盖机的智能控制要求越来越高。ARMxy 工业计算机作为一种高性能、高可靠性的嵌入式计算平台,为包装灌装…

Gradle出现Re-download dependencies and sync project (requires network)

distributionUrlhttps\://services.gradle.org/distributions/gradle-7.5-bin.zip改为 distributionUrlhttps://services.gradle.org/distributions/gradle-7.5-bin.zip 然后把目录下已生成的文件夹删掉,此例为下图的gradle-7.5-bin删除,然后sync就可以…

PXE安装部署教程

打开rhel-7.9的虚拟机 关闭虚拟机DHCP服务 yum group install "server with GUI" init 5开启图形界面 安装并部署kickstart 下载生成kickstart工具:yum install system-config-kickstart -y 启动图形制作工具:system-config-kickstart [ro…