// DataCanvas returns a new draw.Canvas that // is the subset of the given draw area into which // the plot data will be drawn. func (p *Plot) DataCanvas(da draw.Canvas) draw.Canvas { if p.Title.Text != "" { da.Max.Y -= p.Title.Height(p.Title.Text) - p.Title.Font.Extents().Descent da.Max.Y -= p.Title.Padding } p.X.sanitizeRange() x := horizontalAxis{p.X} p.Y.sanitizeRange() y := verticalAxis{p.Y} return padY(p, padX(p, da.Crop(y.size(), x.size(), 0, 0))) }
// Draw draws a plot to a draw.Canvas. // // Plotters are drawn in the order in which they were // added to the plot. Plotters that implement the // GlyphBoxer interface will have their GlyphBoxes // taken into account when padding the plot so that // none of their glyphs are clipped. func (p *Plot) Draw(c draw.Canvas) { if p.BackgroundColor != nil { c.SetColor(p.BackgroundColor) c.Fill(c.Rectangle.Path()) } if p.Title.Text != "" { c.FillText(p.Title.TextStyle, c.Center().X, c.Max.Y, -0.5, -1, p.Title.Text) c.Max.Y -= p.Title.Height(p.Title.Text) - p.Title.Font.Extents().Descent c.Max.Y -= p.Title.Padding } p.X.sanitizeRange() x := horizontalAxis{p.X} p.Y.sanitizeRange() y := verticalAxis{p.Y} ywidth := y.size() x.draw(padX(p, c.Crop(ywidth, 0, 0, 0))) xheight := x.size() y.draw(padY(p, c.Crop(0, xheight, 0, 0))) dataC := padY(p, padX(p, c.Crop(ywidth, xheight, 0, 0))) for _, data := range p.plotters { data.Plot(dataC, p) } p.Legend.draw(c.Crop(ywidth, 0, 0, 0).Crop(0, xheight, 0, 0)) }