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

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

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

安装gg

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

sh 复制代码
go get -u github.com/fogleman/gg

代码示例

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

go 复制代码
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,然后在命令行运行以下命令:

sh 复制代码
go run main.go

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

结论

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

效果

相关推荐
易只轻松熊10 分钟前
C++(21):fstream的读取和写入
开发语言·c++
重生之后端学习13 分钟前
02-前端Web开发(JS+Vue+Ajax)
java·开发语言·前端·javascript·vue.js
zimoyin14 分钟前
kotlin Android AccessibilityService 无障碍入门
android·开发语言·kotlin
繁依Fanyi1 小时前
用 CodeBuddy 实现「IdeaSpark 每日灵感卡」:一场 UI 与灵感的极简之旅
开发语言·前端·游戏·ui·编辑器·codebuddy首席试玩官
duapple5 小时前
Golang基于反射的ioctl实现
开发语言·后端·golang
Dxy12393102165 小时前
Python 条件语句详解
开发语言·python
prinrf('千寻)7 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
m0_555762907 小时前
Qt缓动曲线详解
开发语言·qt
my_styles8 小时前
docker-compose部署项目(springboot服务)以及基础环境(mysql、redis等)ruoyi-ry
spring boot·redis·后端·mysql·spring cloud·docker·容器
飞川撸码8 小时前
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
算法·leetcode·golang