简介
本文介绍 Go 语言的一个非常强大、好用的绘图库——plot
。plot
内置了很多常用的组件,基本满足日常需求。同时,它也提供了定制化的接口,可以实现我们的个性化需求。plot
主要用于将数据可视化,便于我们观察、比较。
快速使用
先安装:
$ go get gonum.org/v1/plot/...
后使用:
package main
import (
"log"
"math/rand"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/plotutil"
"gonum.org/v1/plot/vg"
)
func main() {
rand.Seed(int64(0))
p, err := plot.New()
if err != nil {
log.Fatal(err)
}
p.Title.Text = "Get Started"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
err = plotutil.AddLinePoints(p,
"First", randomPoints(15),
"Second", randomPoints(15),
"Third", randomPoints(15))
if err != nil {
log.Fatal(err)
}
if err = p.Save(4*vg.Inch, 4*vg.Inch, "points.png"); err != nil {
log.Fatal(err)
}
}
func randomPoints(n int) plotter.XYs {
points := make(plotter.XYs, n)
for i := range points {
if i == 0 {
points[i].X = rand.Float64()
} else {
points[i].X = points[i-1].X + rand.Float64()
}
points[i].Y = points[i].X + 10 * rand.Float64()
}
return points
}
程序运行输出points.png
图片文件:
plot
的使用比较直观。首先,调用plot.New()
创建一个“画布”,画布结构如下:
// Plot is the basic type representing a plot.
type Plot struct {
Title struct {
Text string
Padding vg.Length
draw.TextStyle
}
BackgroundColor color.Color
X, Y Axis
Legend Legend
plotters []Plotter
}
然后,通过直接给画布结构字段赋值,设置图像的属性。例如p.Title.Text = "Get Started
设置图像标题内容;p.X.Label.Text = "X"
,p.Y.Label.Text = "Y"
设置图像的 X 和 Y 轴的标签名。
再然后,使用plotutil
或者其他子包的方法在画布上绘制,上面代码中调用AddLinePoints()
绘制了 3 条折线。
最后保存图像,上面代码中调用p.Save()
方法将图像保存到文件中。
更多图形
gonum/plot
将不同层次的接口封装到特定的子包中:
plot
:提供了布局和绘图的简单接口;plotter
:使用plot
提供的接口实现了一组标准的绘图器,例如散点图、条形图、箱状图等。可以使用plotter
提供的接口实现自己的绘图器;plotutil
:为绘制常见图形提供简便的方法;vg
:封装各种后端,并提供了一个通用矢量图形 API。
条形图
条形图通过相同宽度条形的高度或长短来表示数据的大小关系。将相同类型的数据放在一起比较能非常直观地看出不同,我们经常在比较几个库的性能时使用条形图。下面我们采用json-iter/go
的 GitHub 仓库中用来比较jsoniter
、easyjson
、std
三个 JSON 库性能的数据来绘制条形图:
package main
import (
"log"
"go