gonum / plot

A repository for plotting and visualizing data
BSD 3-Clause "New" or "Revised" License
2.72k stars 202 forks source link

plot/vg: Unable to add or visualize an Arc from vg.Path #778

Open JerPatton opened 4 months ago

JerPatton commented 4 months ago

What are you trying to do?

I am trying to draw arcs on a plot and here as an example I specifically try to display an arc with center (0,0) and radius of 1 from the angle 0 to pi and save that to a .png file.

What did you do?

Here is a minimal working example of the code I used:


package main

import (
    "math"

    "gonum.org/v1/plot"
    "gonum.org/v1/plot/vg"
    "gonum.org/v1/plot/vg/draw"
    "gonum.org/v1/plot/vg/vgimg"
)

func main() {
    p := plot.New()
    p.Title.Text = "Arc Plot Example"
    p.X.Label.Text = "X"
    p.Y.Label.Text = "Y"

        // Create Canvas
    cnvs := vgimg.PngCanvas{
        Canvas: vgimg.New(5*vg.Centimeter, 5*vg.Centimeter),
    }

    // Draw arc
    centerX := 0.0      // X-coordinate of the center of the circle
    centerY := 0.0      // Y-coordinate of the center of the circle
    radius := 1.0       // Radius of the circle
    startAngle := 0.0   // Start angle of the arc (in radians)
    endAngle := math.Pi // End angle of the arc (in radians)

    path := vg.Path{}
    path.Arc(vg.Point{X: vg.Length(centerX), Y: vg.Length(centerY)}, vg.Length(radius), startAngle, endAngle) // Add the arc to the path
    cnvs.Stroke(path)

        // Add the canvas and the Arc to the plot
    p.Draw(draw.New(cnvs))

    // Save plot and also try to save canvas to file directly

    // Save the plot to a PNG file.
    if err := p.Save(5*vg.Centimeter, 5*vg.Centimeter, "figures/arc1.png"); err != nil {
        panic(err)
    }

    // Save the canvas directly to a PNG file.
    w, err := os.Create("figures/arc2.png")
    if err != nil {
        panic(err)
    }
    defer w.Close()
    if _, err := cnvs.WriteTo(w); err != nil {
        panic(err)
    }

    // pic.ShowImage(cnvs.Image())
}

I tried to use the go playground and pic.ShowImage(img) as suggested but it won't compile. Still, find the link below if it can work for you... https://go.dev/play/p/KMPRsOUcO-0

What did you expect to happen?

It should draw the arc (line) as described above, i.e. we should see half a circle spanning from -1 to 1 with a radius of 1 on the side of the positive y-axis values.

What actually happened?

Nothing is drawn to the image except the axes and title.

arc1

What version of Go and Gonum/plot are you using?

go 1.20 gonum.org/v1/plot v0.13.0

kortschak commented 4 months ago

Try setting the line style. See https://pkg.go.dev/gonum.org/v1/plot/vg/draw#Canvas.SetLineStyle.

JerPatton commented 4 months ago

Unfortunately the arc is still not there.

Am I missing something in the process or is it indeed a bug? Could you maybe point me towards a working example using an Arc or a Path? So that I can test further.

Thanks in advance

kortschak commented 4 months ago

The rings package makes extensive use of arcs, so maybe try looking there (example).