diff --git a/chart.go b/chart.go index 61b75af..7c3b06e 100644 --- a/chart.go +++ b/chart.go @@ -106,10 +106,16 @@ func (c Chart) calculateFinalLabelWidth(r Renderer) int { if !c.FinalValueLabel.Show { return 0 } + var finalLabelText string for _, s := range c.Series { _, lv := s.GetValue(s.Len() - 1) - ll := s.GetYFormatter()(lv) + var ll string + if c.YRange.Formatter != nil { + ll = c.YRange.Formatter(lv) + } else { + ll = s.GetYFormatter()(lv) + } if len(finalLabelText) < len(ll) { finalLabelText = ll } @@ -178,6 +184,9 @@ func (c Chart) initRanges(canvasBox Box) (xrange Range, yrange Range) { xrange.Min = c.XRange.Min xrange.Max = c.XRange.Max } + if c.XRange.Formatter != nil { + xrange.Formatter = c.XRange.Formatter + } xrange.Domain = canvasBox.Width if c.YRange.IsZero() { @@ -187,6 +196,9 @@ func (c Chart) initRanges(canvasBox Box) (xrange Range, yrange Range) { yrange.Min = c.YRange.Min yrange.Max = c.YRange.Max } + if c.YRange.Formatter != nil { + yrange.Formatter = c.YRange.Formatter + } yrange.Domain = canvasBox.Height return @@ -330,7 +342,7 @@ func (c Chart) drawSeries(r Renderer, canvasBox Box, index int, s Series, xrange func (c Chart) drawFinalValueLabel(r Renderer, canvasBox Box, index int, s Series, yrange Range) { if c.FinalValueLabel.Show { _, lv := s.GetValue(s.Len() - 1) - ll := s.GetYFormatter()(lv) + ll := yrange.Format(lv) py := canvasBox.Top ly := yrange.Translate(lv) + py diff --git a/testserver/main.go b/testserver/main.go index bb2748b..f5a54ab 100644 --- a/testserver/main.go +++ b/testserver/main.go @@ -1,9 +1,10 @@ package main import ( - "bytes" + "fmt" "log" + "github.com/blendlabs/go-util" "github.com/wcharczuk/go-chart" "github.com/wcharczuk/go-web" ) @@ -13,7 +14,7 @@ func main() { app.SetName("Chart Test Server") app.SetLogger(web.NewStandardOutputLogger()) app.GET("/", func(rc *web.RequestContext) web.ControllerResult { - rc.Response.Header().Set("Content-Type", "image/svg+xml") + rc.Response.Header().Set("Content-Type", "image/png") c := chart.Chart{ Title: "A Test Chart", TitleStyle: chart.Style{ @@ -28,6 +29,12 @@ func main() { YRange: chart.Range{ Min: 0.0, Max: 7.0, + Formatter: func(v interface{}) string { + if typed, isTyped := v.(float64); isTyped { + return fmt.Sprintf("%.4f", typed) + } + return util.StringEmpty + }, }, FinalValueLabel: chart.Style{ Show: true, @@ -46,12 +53,11 @@ func main() { }, } - buffer := bytes.NewBuffer([]byte{}) - err := c.Render(chart.SVG, buffer) + err := c.Render(chart.PNG, rc.Response) if err != nil { return rc.API().InternalError(err) } - return rc.Raw(buffer.Bytes()) + return nil }) log.Fatal(app.Start()) }