Add stacked bar chart value labels (#60)
This commit is contained in:
parent
3a7bc55431
commit
21b831a1b1
3 changed files with 265 additions and 0 deletions
221
_examples/stacked_bar_labels/main.go
Normal file
221
_examples/stacked_bar_labels/main.go
Normal file
|
@ -0,0 +1,221 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"github.com/wcharczuk/go-chart"
|
||||
"github.com/wcharczuk/go-chart/drawing"
|
||||
)
|
||||
|
||||
func main() {
|
||||
chart.DefaultBackgroundColor = chart.ColorTransparent
|
||||
chart.DefaultCanvasColor = chart.ColorTransparent
|
||||
|
||||
barWidth := 120
|
||||
|
||||
var (
|
||||
colorWhite = drawing.Color{R: 241, G: 241, B: 241, A: 255}
|
||||
colorMariner = drawing.Color{R: 60, G: 100, B: 148, A: 255}
|
||||
colorLightSteelBlue = drawing.Color{R: 182, G: 195, B: 220, A: 255}
|
||||
colorPoloBlue = drawing.Color{R: 126, G: 155, B: 200, A: 255}
|
||||
colorSteelBlue = drawing.Color{R: 73, G: 120, B: 177, A: 255}
|
||||
)
|
||||
|
||||
stackedBarChart := chart.StackedBarChart{
|
||||
Title: "Quarterly Sales",
|
||||
TitleStyle: chart.StyleShow(),
|
||||
Background: chart.Style{
|
||||
Padding: chart.Box{
|
||||
Top: 100,
|
||||
},
|
||||
},
|
||||
Width: 810,
|
||||
Height: 500,
|
||||
XAxis: chart.StyleShow(),
|
||||
YAxis: chart.StyleShow(),
|
||||
BarSpacing: 50,
|
||||
Bars: []chart.StackedBar{
|
||||
{
|
||||
Name: "Q1",
|
||||
Width: barWidth,
|
||||
Values: []chart.Value{
|
||||
{
|
||||
Label: "32K",
|
||||
Value: 32,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorMariner,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "46K",
|
||||
Value: 46,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorLightSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "48K",
|
||||
Value: 48,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorPoloBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "42K",
|
||||
Value: 42,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Q2",
|
||||
Width: barWidth,
|
||||
Values: []chart.Value{
|
||||
{
|
||||
Label: "45K",
|
||||
Value: 45,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorMariner,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "60K",
|
||||
Value: 60,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorLightSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "62K",
|
||||
Value: 62,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorPoloBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "53K",
|
||||
Value: 53,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Q3",
|
||||
Width: barWidth,
|
||||
Values: []chart.Value{
|
||||
{
|
||||
Label: "54K",
|
||||
Value: 54,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorMariner,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "58K",
|
||||
Value: 58,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorLightSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "55K",
|
||||
Value: 55,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorPoloBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "47K",
|
||||
Value: 47,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "Q4",
|
||||
Width: barWidth,
|
||||
Values: []chart.Value{
|
||||
{
|
||||
Label: "46K",
|
||||
Value: 46,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorMariner,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "70K",
|
||||
Value: 70,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorLightSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "74K",
|
||||
Value: 74,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorPoloBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
{
|
||||
Label: "60K",
|
||||
Value: 60,
|
||||
Style: chart.Style{
|
||||
StrokeWidth: .01,
|
||||
FillColor: colorSteelBlue,
|
||||
FontColor: colorWhite,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
pngFile, err := os.Create("output.png")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := stackedBarChart.Render(chart.PNG, pngFile); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := pngFile.Close(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
BIN
_examples/stacked_bar_labels/output.png
Normal file
BIN
_examples/stacked_bar_labels/output.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
|
@ -158,6 +158,33 @@ func (sbc StackedBarChart) drawBar(r Renderer, canvasBox Box, xoffset int, bar S
|
|||
yoffset += barHeight
|
||||
}
|
||||
|
||||
// draw the labels
|
||||
yoffset = canvasBox.Top
|
||||
var lx, ly int
|
||||
for index, bv := range normalizedBarComponents {
|
||||
barHeight := int(math.Ceil(bv.Value * float64(canvasBox.Height())))
|
||||
|
||||
if len(bv.Label) > 0 {
|
||||
lx = bxl + ((bxr - bxl) / 2)
|
||||
ly = yoffset + (barHeight / 2)
|
||||
|
||||
bv.Style.InheritFrom(sbc.styleDefaultsStackedBarValue(index)).WriteToRenderer(r)
|
||||
tb := r.MeasureText(bv.Label)
|
||||
lx = lx - (tb.Width() >> 1)
|
||||
ly = ly + (tb.Height() >> 1)
|
||||
|
||||
if lx < 0 {
|
||||
lx = 0
|
||||
}
|
||||
if ly < 0 {
|
||||
lx = 0
|
||||
}
|
||||
|
||||
r.Text(bv.Label, lx, ly)
|
||||
}
|
||||
yoffset += barHeight
|
||||
}
|
||||
|
||||
return bxr
|
||||
}
|
||||
|
||||
|
@ -329,6 +356,9 @@ func (sbc StackedBarChart) styleDefaultsStackedBarValue(index int) Style {
|
|||
StrokeColor: sbc.GetColorPalette().GetSeriesColor(index),
|
||||
StrokeWidth: 3.0,
|
||||
FillColor: sbc.GetColorPalette().GetSeriesColor(index),
|
||||
FontSize: sbc.getScaledFontSize(),
|
||||
FontColor: sbc.GetColorPalette().TextColor(),
|
||||
Font: sbc.GetFont(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -343,6 +373,20 @@ func (sbc StackedBarChart) styleDefaultsTitle() Style {
|
|||
})
|
||||
}
|
||||
|
||||
func (sbc StackedBarChart) getScaledFontSize() float64 {
|
||||
effectiveDimension := util.Math.MinInt(sbc.GetWidth(), sbc.GetHeight())
|
||||
if effectiveDimension >= 2048 {
|
||||
return 48.0
|
||||
} else if effectiveDimension >= 1024 {
|
||||
return 24.0
|
||||
} else if effectiveDimension > 512 {
|
||||
return 18.0
|
||||
} else if effectiveDimension > 256 {
|
||||
return 12.0
|
||||
}
|
||||
return 10.0
|
||||
}
|
||||
|
||||
func (sbc StackedBarChart) getTitleFontSize() float64 {
|
||||
effectiveDimension := MinInt(sbc.GetWidth(), sbc.GetHeight())
|
||||
if effectiveDimension >= 2048 {
|
||||
|
|
Loading…
Reference in a new issue