Add data label to bar chart

pull/11140/head
Kent Iso 2021-04-24 03:22:08 +09:00
parent 288eb00810
commit a6fdc2f8ea
2 changed files with 163 additions and 2 deletions

View File

@ -20,6 +20,7 @@ import (
"encoding/csv"
"fmt"
"log"
"math"
"os"
"runtime"
"strconv"
@ -31,6 +32,16 @@ import (
"gonum.org/v1/plot/vg"
)
type integerTicks struct{}
func (integerTicks) Ticks(min, max float64) []plot.Tick {
var t []plot.Tick
for i := math.Trunc(min); i <= max; i += 50 {
t = append(t, plot.Tick{Value: i, Label: fmt.Sprint(i)})
}
return t
}
func main() {
if err := execute(); err != nil {
fmt.Println(err)
@ -106,8 +117,45 @@ func execute() error {
} else if runtime.GOOS == "linux" {
p.NominalX("OS idle", "minikube kvm2", "minikube virtualbox", "minikube docker", "minikube docker auto-pause", "Docker idle", "k3d", "kind")
}
p.X.Label.Text = "Tools"
// output bar graph
// Set data label to each bar
var cpuLabels []string
for i := range results {
cLabel := strconv.FormatFloat(results[i], 'f', -1, 64)
cpuLabels = append(cpuLabels, cLabel)
}
var xysCPU []plotter.XY
for i := range results {
rxPos := float64(i)-0.13
ryPos := results[i]+0.1
cXY := plotter.XY{X: rxPos, Y: ryPos}
xysCPU = append(xysCPU, cXY)
}
// CPU Busy% data label
cl, err := plotter.NewLabels(plotter.XYLabels{
XYs: xysCPU,
Labels: cpuLabels,
},
)
if err != nil {
log.Fatalf("could not creates labels plotter: %+v", err)
}
//for i := range rl.TextStyle {
// rl.TextStyle[i].Color = color.RGBA{R: 255, A: 255}
//}
var t []plot.Tick
for i := math.Trunc(0); i <= 300; i += 50 {
t = append(t, plot.Tick{Value: i, Label: fmt.Sprint(i)})
}
// define max cpu busy% to 30%
p.Y.Max = 30
p.Y.Tick.Marker = integerTicks{}
// Add CPU Busy% label to plot
p.Add(cl)
// Output bar graph
if runtime.GOOS == "darwin" {
if err := p.Save(13*vg.Inch, 8*vg.Inch, "./site/static/images/benchmarks/cpuUsage/mac.png"); err != nil {
return errors.Wrap(err, "Failed to create bar graph png")
@ -120,4 +168,4 @@ func execute() error {
log.Printf("Generated graph png to 'site/static/images/benchmarks/cpuUsage/linux.png'")
}
return nil
}
}

View File

@ -0,0 +1,113 @@
package main
import (
"fmt"
"image/color"
"log"
"math"
"strconv"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
)
type integerTicks struct{}
func (integerTicks) Ticks(min, max float64) []plot.Tick {
var t []plot.Tick
for i := math.Trunc(min); i <= max; i += 50 {
t = append(t, plot.Tick{Value: i, Label: fmt.Sprint(i)})
}
return t
}
func main() {
red := plotter.Values{213, 206, 256, 256, 16, 122, 291}
black := plotter.Values{16, 86, 109, 290, 42, 257, 9}
days := []string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}
p := plot.New()
redC := color.RGBA{R: 255, A: 255}
blackC := color.RGBA{R: 196, G: 196, A: 255}
w := vg.Points(8)
redBars, err := plotter.NewBarChart(red, w)
if err != nil {
panic(err)
}
redBars.Color = redC
redBars.Offset = -w
blackBars, err := plotter.NewBarChart(black, w)
if err != nil {
panic(err)
}
blackBars.Color = blackC
blackBars.Offset = w
p.Add(blackBars, redBars)
p.NominalX(days...)
var redLabels []string
var blackLabels []string
for i := range red {
rLabel := strconv.FormatFloat(red[i], 'f', -1, 64)
bLabel := strconv.FormatFloat(black[i], 'f', -1, 64)
redLabels = append(redLabels, rLabel)
blackLabels = append(blackLabels, bLabel)
}
var xysR, xysB []plotter.XY
for i := range red {
rxPos, bxPos := float64(i)-0.5, float64(i)+0.1
ryPos, byPos := red[i]+5, black[i]+5
rXY := plotter.XY{X: rxPos, Y: ryPos}
bXY := plotter.XY{X: bxPos, Y: byPos}
xysR = append(xysR, rXY)
xysB = append(xysB, bXY)
}
rl, err := plotter.NewLabels(plotter.XYLabels{
XYs: xysR,
Labels: redLabels,
},
)
if err != nil {
log.Fatalf("could not creates labels plotter: %+v", err)
}
for i := range rl.TextStyle {
rl.TextStyle[i].Color = color.RGBA{R: 255, A: 255}
//fmt.Println(r, i)
}
bl, err := plotter.NewLabels(plotter.XYLabels{
XYs: xysB,
Labels: blackLabels,
},
)
if err != nil {
log.Fatalf("could not creates labels plotter: %+v", err)
}
var t []plot.Tick
for i := math.Trunc(0); i <= 300; i += 50 {
t = append(t, plot.Tick{Value: i, Label: fmt.Sprint(i)})
}
p.Y.Max = 310
p.Y.Tick.Marker = integerTicks{}
p.Add(rl, bl)
if err := p.Save(4*vg.Inch, 4*vg.Inch, "points.png"); err != nil {
panic(err)
}
}