Golangで積み上げ棒グラフを描く
Goで積み上げ棒グラフを描こうと思ったのですが,日本語による参照情報が見つからなかったので,英語で調べて分かったことをまとめます.
Overview
完成図
コード全体
積み上げ棒グラフの生成でポイントとなるのは,StackOn関数です.
この関数を利用すれば,棒グラフを「上に乗せる」ことができます.
func (b *BarChart) StackOn(on *BarChart)
package main
import (
"log"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/plotutil"
"gonum.org/v1/plot/vg"
)
func main() {
// サンプルデータを生成します
groupA := plotter.Values{1500, 1500, 1400, 2100, 1100}
groupB := plotter.Values{2800, 2600, 1600, 2100, 800}
groupC := plotter.Values{1800, 2100, 1500, 1300, 900}
groupD := plotter.Values{1600, 3500, 2600, 1700, 600}
p, err := plot.New()
if err != nil {
log.Panic(err)
}
p.Title.Text = "utility cost"
p.Y.Label.Text = "cost"
// 棒の横幅を設定します
w := vg.Points(30)
// barsA がグラフの一番下になります
barsA, err := plotter.NewBarChart(groupA, w)
if err != nil {
log.Panic(err)
}
// グラフの色を設定します
barsA.Color = plotutil.Color(0)
// グラフ自体を囲む枠線を設定します 0にすると,黒の枠線がなくなります
barsA.LineStyle.Width = vg.Length(0)
barsB, err := plotter.NewBarChart(groupB, w)
if err != nil {
log.Panic(err)
}
barsB.Color = plotutil.Color(1)
// barsB を barsA の上に乗せます
barsB.StackOn(barsA)
barsC, err := plotter.NewBarChart(groupC, w)
if err != nil {
log.Panic(err)
}
barsC.Color = plotutil.Color(2)
// barsC を barsB の上に乗せます
barsC.StackOn(barsB)
barsD, err := plotter.NewBarChart(groupD, w)
if err != nil {
log.Panic(err)
}
barsA.Color = plotutil.Color(3)
// barsD を barsC の上に乗せます
barsD.StackOn(barsC)
p.Add(barsA, barsB, barsC, barsD)
p.Legend.Add("Electric bill", barsA)
p.Legend.Add("Water bill", barsB)
p.Legend.Add("Gas fee", barsC)
p.Legend.Add("Telephone fee", barsD)
p.Legend.Top = true
p.Legend.Left = false
p.NominalX("January", "February", "March", "April", "May")
err = p.Save(5*vg.Inch, 5*vg.Inch, "stackedBarChart.png")
if err != nil {
log.Panic(err)
}
}