Add possibility to render charts to image.Image
Add interface Imager for ToImage method. Implement ToImage in rasterRenderer. Implement ToImage in Chart, BarChart and PieChart.
This commit is contained in:
parent
102f7a8aa3
commit
b0cccfa7c7
5 changed files with 170 additions and 0 deletions
67
chart.go
67
chart.go
|
|
@ -2,6 +2,7 @@ package chart
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"image"
|
||||
"io"
|
||||
"math"
|
||||
|
||||
|
|
@ -132,6 +133,72 @@ func (c Chart) Render(rp RendererProvider, w io.Writer) error {
|
|||
return r.Save(w)
|
||||
}
|
||||
|
||||
// ToImage renders the chart with the given renderer to the given io.Writer.
|
||||
func (c Chart) ToImage(r Renderer) (image.Image, error) {
|
||||
imager, ok := r.(Imager)
|
||||
if !ok {
|
||||
return nil, errors.New("Renderer does not support ToImage")
|
||||
}
|
||||
|
||||
if len(c.Series) == 0 {
|
||||
return nil, errors.New("Please provide at least one series")
|
||||
}
|
||||
c.YAxisSecondary.AxisType = YAxisSecondary
|
||||
|
||||
if c.Font == nil {
|
||||
defaultFont, err := GetDefaultFont()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.defaultFont = defaultFont
|
||||
}
|
||||
r.SetDPI(c.GetDPI(DefaultDPI))
|
||||
|
||||
c.drawBackground(r)
|
||||
|
||||
var xt, yt, yta []Tick
|
||||
xr, yr, yra := c.getRanges()
|
||||
canvasBox := c.getDefaultCanvasBox()
|
||||
xf, yf, yfa := c.getValueFormatters()
|
||||
xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra)
|
||||
|
||||
err := c.checkRanges(xr, yr, yra)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if c.hasAxes() {
|
||||
xt, yt, yta = c.getAxesTicks(r, xr, yr, yra, xf, yf, yfa)
|
||||
canvasBox = c.getAxisAdjustedCanvasBox(r, canvasBox, xr, yr, yra, xt, yt, yta)
|
||||
xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra)
|
||||
|
||||
// do a second pass in case things haven't settled yet.
|
||||
xt, yt, yta = c.getAxesTicks(r, xr, yr, yra, xf, yf, yfa)
|
||||
canvasBox = c.getAxisAdjustedCanvasBox(r, canvasBox, xr, yr, yra, xt, yt, yta)
|
||||
xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra)
|
||||
}
|
||||
|
||||
if c.hasAnnotationSeries() {
|
||||
canvasBox = c.getAnnotationAdjustedCanvasBox(r, canvasBox, xr, yr, yra, xf, yf, yfa)
|
||||
xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra)
|
||||
xt, yt, yta = c.getAxesTicks(r, xr, yr, yra, xf, yf, yfa)
|
||||
}
|
||||
|
||||
c.drawCanvas(r, canvasBox)
|
||||
c.drawAxes(r, canvasBox, xr, yr, yra, xt, yt, yta)
|
||||
for index, series := range c.Series {
|
||||
c.drawSeries(r, canvasBox, xr, yr, yra, series, index)
|
||||
}
|
||||
|
||||
c.drawTitle(r)
|
||||
|
||||
for _, a := range c.Elements {
|
||||
a(r, canvasBox, c.styleDefaultsElements())
|
||||
}
|
||||
|
||||
return imager.ToImage(), nil
|
||||
}
|
||||
|
||||
func (c Chart) getRanges() (xrange, yrange, yrangeAlt Range) {
|
||||
var minx, maxx float64 = math.MaxFloat64, -math.MaxFloat64
|
||||
var miny, maxy float64 = math.MaxFloat64, -math.MaxFloat64
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue