From b719c1c512cf45db19fa3d3a838f24a699d810a4 Mon Sep 17 00:00:00 2001 From: Alexey Kirpichnikov Date: Thu, 23 May 2019 13:06:39 +0500 Subject: [PATCH] Add an example of pretty ticks on Y axis --- _examples/pretty_ticks/main.go | 58 ++++++++++++++++++++++++++++++ _examples/pretty_ticks/output.png | Bin 0 -> 18880 bytes 2 files changed, 58 insertions(+) create mode 100644 _examples/pretty_ticks/main.go create mode 100644 _examples/pretty_ticks/output.png diff --git a/_examples/pretty_ticks/main.go b/_examples/pretty_ticks/main.go new file mode 100644 index 0000000..32a7545 --- /dev/null +++ b/_examples/pretty_ticks/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" + + "github.com/wcharczuk/go-chart" +) + +func drawChart(res http.ResponseWriter, req *http.Request) { + sbc := chart.BarChart{ + Title: "Test Bar Chart", + TitleStyle: chart.StyleShow(), + Background: chart.Style{ + Padding: chart.Box{ + Top: 40, + }, + }, + Height: 512, + BarWidth: 60, + XAxis: chart.StyleShow(), + YAxis: chart.YAxis{ + Style: chart.StyleShow(), + EnablePrettyTicks: true, + }, + Bars: []chart.Value{ + {Value: 5.25, Label: "Blue"}, + {Value: 4.88, Label: "Green"}, + {Value: 4.74, Label: "Gray"}, + {Value: 3.22, Label: "Orange"}, + {Value: 3, Label: "Test"}, + {Value: 2.27, Label: "??"}, + {Value: 1, Label: "!!"}, + }, + } + + 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/pretty_ticks/output.png b/_examples/pretty_ticks/output.png new file mode 100644 index 0000000000000000000000000000000000000000..af69bee5dff55aa8c48e634adf9221c6e745bf0d GIT binary patch literal 18880 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