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

发布于:2024-08-08 ⋅ 阅读:(192) ⋅ 点赞:(0)

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

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

安装gg

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

go get -u github.com/fogleman/gg

代码示例

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

package main

import (
	"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 string
		value float64
	}{
		{"身份证", 15},
		{"电话号码", 2000},
		{"地址信息", 2500},
		{"银行卡号", 3000},
		{"财务数据", 3500},
		{"基础信息", 4000},
		{"户籍信息", 4500},
	}

	// 计算数据中的最大值
	var maxValue float64
	for _, 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 / magnitude
	if 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包绘制柱状图。你可以根据需要调整数据和图表样式,生成各种自定义的柱状图。希望本文对你有所帮助,祝你编程愉快!

效果图

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到