// DrawGlyphBoxes draws red outlines around the plot's // GlyphBoxes. This is intended for debugging. func (p *Plot) DrawGlyphBoxes(c *draw.Canvas) { c.SetColor(color.RGBA{R: 255, A: 255}) for _, b := range p.GlyphBoxes(p) { b.Rectangle.Min.X += c.X(b.X) b.Rectangle.Min.Y += c.Y(b.Y) c.Stroke(b.Rectangle.Path()) } }
func (g GlyphBoxes) Plot(c draw.Canvas, plt *plot.Plot) { for _, b := range plt.GlyphBoxes(plt) { x := c.X(b.X) + b.Rectangle.Min.X y := c.Y(b.Y) + b.Rectangle.Min.Y c.StrokeLines(g.LineStyle, []draw.Point{ {x, y}, {x + b.Rectangle.Size().X, y}, {x + b.Rectangle.Size().X, y + b.Rectangle.Size().Y}, {x, y + b.Rectangle.Size().Y}, {x, y}, }) } }
// leftMost returns the left-most GlyphBox. func leftMost(c *draw.Canvas, boxes []GlyphBox) GlyphBox { minx := c.Min.X l := GlyphBox{} for _, b := range boxes { if b.Size().X <= 0 { continue } if x := c.X(b.X) + b.Min.X; x < minx && b.X >= 0 { minx = x l = b } } return l }
// rightMost returns the right-most GlyphBox. func rightMost(c *draw.Canvas, boxes []GlyphBox) GlyphBox { maxx := c.Max.X r := GlyphBox{X: 1} for _, b := range boxes { if b.Size().X <= 0 { continue } if x := c.X(b.X) + b.Min.X + b.Size().X; x > maxx && b.X <= 1 { maxx = x r = b } } return r }
// draw draws the axis along the lower edge of a draw.Canvas. func (a *horizontalAxis) draw(c draw.Canvas) { y := c.Min.Y if a.Label.Text != "" { y -= a.Label.Font.Extents().Descent c.FillText(a.Label.TextStyle, c.Center().X, y, -0.5, 0, a.Label.Text) y += a.Label.Height(a.Label.Text) } marks := a.Tick.Marker.Ticks(a.Min, a.Max) for _, t := range marks { x := c.X(a.Norm(t.Value)) if !c.ContainsX(x) || t.IsMinor() { continue } c.FillText(a.Tick.Label, x, y, -0.5, 0, t.Label) } if len(marks) > 0 { y += tickLabelHeight(a.Tick.Label, marks) } else { y += a.Width / 2 } if len(marks) > 0 && a.drawTicks() { len := a.Tick.Length for _, t := range marks { x := c.X(a.Norm(t.Value)) if !c.ContainsX(x) { continue } start := t.lengthOffset(len) c.StrokeLine2(a.Tick.LineStyle, x, y+start, x, y+len) } y += len } c.StrokeLine2(a.LineStyle, c.Min.X, y, c.Max.X, y) }
// Transforms returns functions to transfrom // from the x and y data coordinate system to // the draw coordinate system of the given // draw area. func (p *Plot) Transforms(c *draw.Canvas) (x, y func(float64) vg.Length) { x = func(x float64) vg.Length { return c.X(p.X.Norm(x)) } y = func(y float64) vg.Length { return c.Y(p.Y.Norm(y)) } return }