From 2aa38220222681c28c181908a333f8049948fbb7 Mon Sep 17 00:00:00 2001 From: david <d.mis09@gmail.com> Date: Fri, 13 Jul 2018 20:44:09 -0500 Subject: [PATCH] Added BaseValue funtionality to bar chart --- _examples/bar_chart_base_value/main.go | 88 ++++++++++++++++++++++ _examples/bar_chart_base_value/output.png | Bin 0 -> 18491 bytes bar_chart.go | 22 ++++-- 3 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 _examples/bar_chart_base_value/main.go create mode 100644 _examples/bar_chart_base_value/output.png diff --git a/_examples/bar_chart_base_value/main.go b/_examples/bar_chart_base_value/main.go new file mode 100644 index 0000000..1874f0b --- /dev/null +++ b/_examples/bar_chart_base_value/main.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" + + "github.com/wcharczuk/go-chart" + "github.com/wcharczuk/go-chart/drawing" +) + +func drawChart(res http.ResponseWriter, req *http.Request) { + profitStyle := chart.Style{ + Show: true, + FillColor: drawing.ColorFromHex("13c158"), + StrokeColor: drawing.ColorFromHex("13c158"), + StrokeWidth: 0, + } + + lossStyle := chart.Style{ + Show: true, + FillColor: drawing.ColorFromHex("c11313"), + StrokeColor: drawing.ColorFromHex("c11313"), + StrokeWidth: 0, + } + + sbc := chart.BarChart{ + Title: "Bar Chart Using BaseValue", + TitleStyle: chart.StyleShow(), + Background: chart.Style{ + Padding: chart.Box{ + Top: 40, + }, + }, + Height: 512, + BarWidth: 60, + XAxis: chart.Style{ + Show: true, + }, + YAxis: chart.YAxis{ + Style: chart.Style{ + Show: true, + }, + Ticks: []chart.Tick{ + {-4.0, "-4"}, + {-2.0, "-2"}, + {0, "0"}, + {2.0, "2"}, + {4.0, "4"}, + {6.0, "6"}, + {8.0, "8"}, + {10.0, "10"}, + {12.0, "12"}, + }, + }, + UseBaseValue: true, + BaseValue: 0.0, + Bars: []chart.Value{ + {Value: 10.0, Style: profitStyle, Label: "Profit"}, + {Value: 12.0, Style: profitStyle, Label: "More Profit"}, + {Value: 8.0, Style: profitStyle, Label: "Still Profit"}, + {Value: -4.0, Style: lossStyle, Label: "Loss!"}, + {Value: 3.0, Style: profitStyle, Label: "Phew Ok"}, + {Value: -2.0, Style: lossStyle, Label: "Oh No!"}, + }, + } + + res.Header().Set("Content-Type", "image/png") + err := sbc.Render(chart.PNG, res) + if err != nil { + fmt.Printf("Error rendering chart: %v\n", err) + } +} + +func port() string { + if len(os.Getenv("PORT")) > 0 { + return os.Getenv("PORT") + } + return "8080" +} + +func main() { + listenPort := fmt.Sprintf(":%s", port()) + fmt.Printf("Listening on %s\n", listenPort) + http.HandleFunc("/", drawChart) + log.Fatal(http.ListenAndServe(listenPort, nil)) +} diff --git a/_examples/bar_chart_base_value/output.png b/_examples/bar_chart_base_value/output.png new file mode 100644 index 0000000000000000000000000000000000000000..94231c8515f1e847e9fd3afe7a2271189cf82d00 GIT binary patch literal 18491 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 literal 0 HcmV?d00001 diff --git a/bar_chart.go b/bar_chart.go index 0c24d92..45ddcc7 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -31,6 +31,9 @@ type BarChart struct { BarSpacing int + UseBaseValue bool + BaseValue float64 + Font *truetype.Font defaultFont *truetype.Font @@ -199,11 +202,20 @@ func (bc BarChart) drawBars(r Renderer, canvasBox Box, yr Range) { by = canvasBox.Bottom - yr.Translate(bar.Value) - barBox = Box{ - Top: by, - Left: bxl, - Right: bxr, - Bottom: canvasBox.Bottom, + if bc.UseBaseValue { + barBox = Box{ + Top: by, + Left: bxl, + Right: bxr, + Bottom: canvasBox.Bottom - yr.Translate(bc.BaseValue), + } + } else { + barBox = Box{ + Top: by, + Left: bxl, + Right: bxr, + Bottom: canvasBox.Bottom, + } } Draw.Box(r, barBox, bar.Style.InheritFrom(bc.styleDefaultsBar(index)))