hep: go-hep.org/x/hep/hplot

## package hplot

import "go-hep.org/x/hep/hplot"

Package hplot is a package to plot histograms, n-tuples and functions

Code:


const npoints = 10000

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = Gaussian distribution: $f(x) = \frac{e^{-(x - \mu)^{2}/(2\sigma^{2}) }} {\sigma\sqrt{2\pi}}$
p.Y.Label.Text = $f(x)$
p.X.Label.Text = $x$

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist)
h.LineStyle.Color = color.RGBA{R: 255, A: 255}
h.FillColor = nil
h.Infos.Style = hplot.HInfoSummary

const (
width  = 15 * vg.Centimeter
height = width / math.Phi
)

fig := hplot.Figure(p, hplot.WithBorder(hplot.Border{
Left:   5,
Right:  5,
Top:    5,
Bottom: 5,
}))

err := hplot.Save(fig, width, height, "testdata/latex_plot.tex")
if err != nil {
log.Fatalf("could not save LaTeX plot: %+v\n", err)
}


An example of a plot + sub-plot

Code:

const npoints = 10000

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

// Draw some random values from the standard
// normal distribution.
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// normalize histo
area := 0.0
for _, bin := range hist.Binning.Bins {
area += bin.SumW() * bin.XWidth()
}
hist.Scale(1 / area)

// Make a plot and set its title.
p1 := hplot.New()
p1.Title.Text = "Histogram"
p1.X.Label.Text = "X"
p1.Y.Label.Text = "Y"

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist)

// The normal distribution function
norm := hplot.NewFunction(dist.Prob)
norm.Color = color.RGBA{R: 255, A: 255}
norm.Width = vg.Points(2)

// draw a grid

// make a second plot which will be diplayed in the upper-right
// of the previous one
p2 := hplot.New()
p2.Title.Text = "Sub plot"

const (
width  = 15 * vg.Centimeter
height = width / math.Phi
)

c := vgimg.PngCanvas{Canvas: vgimg.New(width, height)}
dc := draw.New(c)
p1.Draw(dc)
sub := draw.Canvas{
Canvas: dc,
Rectangle: vg.Rectangle{
Min: vg.Point{X: 0.70 * width, Y: 0.50 * height},
Max: vg.Point{X: 1.00 * width, Y: 1.00 * height},
},
}
p2.Draw(sub)

f, err := os.Create("testdata/sub_plot.png")
if err != nil {
log.Fatalf("error: %v\n", err)
}
defer f.Close()
_, err = c.WriteTo(f)
if err != nil {
log.Fatal(err)
}
err = f.Close()
if err != nil {
log.Fatal(err)
}



### func Dims¶Uses

func Dims(width, height vg.Length) (w, h vg.Length)

### func NewGrid¶Uses

func NewGrid() *plotter.Grid

NewGrid returns a new grid with both vertical and horizontal lines using the default grid line style.

### func NewLine¶Uses

func NewLine(xys plotter.XYer) (*plotter.Line, error)

NewLine returns a Line that uses the default line style and does not draw glyphs.

### func NewScatter¶Uses

func NewScatter(xys plotter.XYer) (*plotter.Scatter, error)

NewScatter returns a Scatter that uses the default glyph style.

### func Save¶Uses

func Save(p Drawer, w, h vg.Length, fnames ...string) (err error)

Save saves the plot to an image file. The file format is determined by the extension.

Supported extensions are:

.eps, .jpg, .jpeg, .pdf, .png, .svg, .tex, .tif and .tiff.


If w or h are <= 0, the value is chosen such that it follows the Golden Ratio. If w and h are <= 0, the values are chosen such that they follow the Golden Ratio (the width is defaulted to vgimg.DefaultWidth).

Code:

p := hplot.New()
p.Title.Text = "my title"
p.X.Label.Text = "x"
p.Y.Label.Text = "y"

const (
width  = -1 // automatically choose a nice plot width
height = -1 // automatically choose a nice plot height
)

err := hplot.Save(
p,
width, height,
"testdata/plot_save.eps",
"testdata/plot_save.jpg",
"testdata/plot_save.pdf",
"testdata/plot_save.png",
"testdata/plot_save.svg",
"testdata/plot_save.tex",
"testdata/plot_save.tif",
)

if err != nil {
log.Fatalf("could not save plot: %+v", err)
}


### func Show¶Uses

func Show(p Drawer, w, h vg.Length, format string) ([]byte, error)

Show displays the plot according to format, returning the raw bytes and an error, if any.

If format is the empty string, then "png" is selected. The list of accepted format strings is the same one than from the gonum.org/v1/plot/vg/draw.NewFormattedCanvas function.

### func WriterTo¶Uses

func WriterTo(p Drawer, w, h vg.Length, format string) (io.WriterTo, error)

WriterTo returns an io.WriterTo that will write the plots as the specified image format.

#### Supported formats are the same ones than hplot.Plot.WriterTo ¶

If w or h are <= 0, the value is chosen such that it follows the Golden Ratio. If w and h are <= 0, the values are chosen such that they follow the Golden Ratio (the width is defaulted to vgimg.DefaultWidth).

### func ZipXY¶Uses

func ZipXY(x, y []float64) plotter.XYer

ZipXY zips together 2 slices x and y in such a way to implement the plotter.XYer interface.

ZipXY panics if the slices are not of the same length.

### type Band¶Uses

type Band struct {

// LineStyle is the style of the line contouring the band.
// Use zero width to disable.
draw.LineStyle

// FillColor is the color to fill the area between
// the top and bottom data points.
// Use nil to disable the filling.
FillColor color.Color
// contains filtered or unexported fields
}

Band implements the plot.Plotter interface, drawing a colored band made of two lines.

An example of making a colored band plot

Code:

const (
npoints = 100
xmax    = 10
)

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

topData := make(plotter.XYs, npoints)
botData := make(plotter.XYs, npoints)

// Draw some random values from the standard
// normal distribution.
for i := 0; i < npoints; i++ {
x := float64(i+1) / xmax

v1 := dist.Rand()
v2 := dist.Rand()

topData[i].X = x
topData[i].Y = 1/x + v1 + 10

botData[i].X = x
botData[i].Y = math.Log(x) + v2
}

top, err := hplot.NewLine(topData)
if err != nil {
log.Fatalf("error: %+v", err)
}
top.LineStyle.Color = color.RGBA{R: 255, A: 255}

bot, err := hplot.NewLine(botData)
if err != nil {
log.Fatalf("error: %+v", err)
}
bot.LineStyle.Color = color.RGBA{B: 255, A: 255}

tp := hplot.NewTiledPlot(draw.Tiles{Cols: 1, Rows: 2})

tp.Plots[0].Title.Text = "Band"
top,
bot,
hplot.NewBand(color.Gray{200}, topData, botData),
)

tp.Plots[1].Title.Text = "Band"
var (
blue = color.RGBA{B: 255, A: 255}
grey = color.Gray{200}
band = hplot.NewBand(grey, topData, botData)
)
band.LineStyle = plotter.DefaultLineStyle
band.LineStyle.Color = blue

err = tp.Save(10*vg.Centimeter, -1, "testdata/band.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


#### func NewBand¶Uses

func NewBand(fill color.Color, top, bottom plotter.XYer) *Band

#### func (*Band) DataRange¶Uses

func (band *Band) DataRange() (xmin, xmax, ymin, ymax float64)

DataRange returns the minimum and maximum x and y values, implementing the plot.DataRanger interface.

#### func (*Band) Plot¶Uses

func (band *Band) Plot(c draw.Canvas, plt *plot.Plot)

### type BinnedErrBand¶Uses

type BinnedErrBand struct {

// Data for every bins.
Counts []hbook.Count

// LineStyle is the style of the line
// contouring the band.
// Use zero width to disable.
draw.LineStyle

// FillColor is the color to fill the area
// between the top and bottom data points.
// Use nil to disable the filling.
FillColor color.Color

// LogY allows rendering with a log-scaled Y axis.
// When enabled, bins with negative or zero minimal value (val-err)
// will be discarded from the error band.
// The lowest Y value for the DataRange will be corrected to leave an
// arbitrary amount of height for the smallest bin entry so it is visible
// on the final plot.
LogY bool
}

BinnedErrBand implements the plot.Plotter interface, drawing a colored band for the error on any binned quantity.

An example of making a colored binned error band from scratch.

Code:


// Number bins
nBins := 10

// Creation of a slice of hbook.Count.
counts := make([]hbook.Count, nBins)
for i, xrange := range newBinning(nBins, 0, 10) {
y := float64(i + 1)
counts[i].XRange = xrange
counts[i].Val = y
counts[i].Err.Low = 0.1 * (y - 5) * (y - 5)
counts[i].Err.High = 0.1 * (y - 5) * (y - 5)
}

// Set error of the 5th bin to zero
counts[4].Err.Low, counts[4].Err.High = 0, 0

// Binned error band
b := &hplot.BinnedErrBand{Counts: counts}
b.FillColor = color.NRGBA{B: 180, A: 200}
b.LineStyle.Color = color.NRGBA{R: 180, A: 200}
b.LineStyle.Width = 2

// Create a new plot and add b
p := hplot.New()
p.Title.Text = "Binned Error Band"
p.X.Label.Text = "Binned X"
p.Y.Label.Text = "Y"

// Save the result
err := p.Save(10*vg.Centimeter, -1, "testdata/binnederrband.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


Code:


// Histogram
h := hbook.NewH1D(20, -5, 5)
for i := 0; i < 1000; i++ {
x := gauss.Rand()
if 0 < x && x < 0.5 {
continue
}
h.Fill(x, 1)
}

hp := hplot.NewH1D(h)
hp.LineStyle.Width = 0
hp.FillColor = color.NRGBA{R: 180, G: 180, B: 180, A: 200}

// Binned error band from the histo counts.
b := hplot.NewBinnedErrBand(h.Counts())
b.FillColor = color.NRGBA{B: 180, A: 100}
b.LineStyle.Color = color.NRGBA{B: 100, A: 200}
b.LineStyle.Width = 1

// Create a new plot and add the histo and the band.
p := hplot.New()
p.Title.Text = "Binned Error Band from H1D"
p.X.Label.Text = "Binned X"
p.Y.Label.Text = "Y"

// Save the result
err := p.Save(10*vg.Centimeter, -1, "testdata/binnederrband_fromh1d.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


#### func NewBinnedErrBand¶Uses

func NewBinnedErrBand(cs []hbook.Count) *BinnedErrBand

NewBinnedErrBand creates a binned error band from a slice of count.

#### func (*BinnedErrBand) DataRange¶Uses

func (b *BinnedErrBand) DataRange() (xmin, xmax, ymin, ymax float64)

DataRange returns the minimum and maximum x and y values, implementing the plot.DataRanger interface.

#### func (*BinnedErrBand) Plot¶Uses

func (b *BinnedErrBand) Plot(c draw.Canvas, plt *plot.Plot)

Plot implements the Plotter interface, drawing a colored box defined by width of bins (x-axis) and error (y-axis).

### type Border¶Uses

type Border struct {
Left   vg.Length
Right  vg.Length
Bottom vg.Length
Top    vg.Length
}

Border specifies the borders' sizes, the space between the end of the plot image (PDF, PNG, ...) and the actual plot.

### type Drawer¶Uses

type Drawer interface {
Draw(draw.Canvas)
}

Drawer is the interface that wraps the Draw method.

### type Fig¶Uses

type Fig struct {
// Plot is a gonum/plot.Plot like value.
Plot Drawer

// Border specifies the borders' sizes, the space between the
// end of the plot image (PDF, PNG, ...) and the actual plot.
Border Border

// Latex handles the generation of PDFs from .tex files.
// The default is to use htex.NoopHandler (a no-op).
// To enable the automatic generation of PDFs, use DefaultHandler:
//  p := hplot.Wrap(plt)
//  p.Latex = htex.DefaultHandler
Latex htex.Handler

// DPI is the dot-per-inch for PNG,JPEG,... plots.
DPI float64
}

Fig is a figure, holding a plot and figure-level customizations.

#### func Figure¶Uses

func Figure(p Drawer, opts ...FigOption) *Fig

Figure creates a new figure from a plot and options. Figure returns a value implementing the Drawer interface.

#### func (*Fig) Draw¶Uses

func (fig *Fig) Draw(dc draw.Canvas)

### type FigOption¶Uses

type FigOption func(fig *Fig)

FigOption allows to customize the creation of figures.

#### func WithBorder¶Uses

func WithBorder(b Border) FigOption

WithBorder allows to specify the borders' sizes, the space between the end of the plot image (PDF, PNG, ...) and the actual plot.

#### func WithDPI¶Uses

func WithDPI(dpi float64) FigOption

WithDPI allows to modify the default DPI of a plot.

#### func WithLatexHandler¶Uses

func WithLatexHandler(h htex.Handler) FigOption

WithLatexHandler allows to enable the automatic generation of PDFs from .tex files. To enable the automatic generation of PDFs, use DefaultHandler:

WithLatexHandler(htex.DefaultHandler)


### type FreqTicks¶Uses

type FreqTicks struct {
N    int // number of ticks
Freq int // frequency of labeled ticks
}

FreqTicks implements a simple plot.Ticker scheme. FreqTicks will generate N ticks where 1 every Freq tick will be labeled.

#### func (FreqTicks) Ticks¶Uses

func (ft FreqTicks) Ticks(min, max float64) []plot.Tick

Ticks returns Ticks in a specified range

### type Function¶Uses

type Function struct {
F   func(x float64) (y float64)

// XMin and XMax specify the range
// of x values to pass to F.
XMin, XMax float64

Samples int

draw.LineStyle

// LogY allows rendering with a log-scaled Y axis.
// When enabled, function values returning 0 will be discarded from
// the final plot.
LogY bool
}

Function implements the Plotter interface, drawing a line for the given function.

ExampleFunction draws some functions.

Code:

quad := hplot.NewFunction(func(x float64) float64 { return x * x })
quad.Color = color.RGBA{B: 255, A: 255}

exp := hplot.NewFunction(func(x float64) float64 { return math.Pow(2, x) })
exp.Dashes = []vg.Length{vg.Points(2), vg.Points(2)}
exp.Width = vg.Points(2)
exp.Color = color.RGBA{G: 255, A: 255}

sin := hplot.NewFunction(func(x float64) float64 { return 10*math.Sin(x) + 50 })
sin.Dashes = []vg.Length{vg.Points(4), vg.Points(5)}
sin.Width = vg.Points(4)
sin.Color = color.RGBA{R: 255, A: 255}

p := hplot.New()
p.Title.Text = "Functions"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

p.Legend.ThumbnailWidth = 0.5 * vg.Inch

p.X.Min = 0
p.X.Max = 10
p.Y.Min = 0
p.Y.Max = 100

err := p.Save(200, 200, "testdata/functions.png")
if err != nil {
log.Panic(err)
}


ExampleFunction_logY draws a function with a Log-Y axis.

Code:

quad := hplot.NewFunction(func(x float64) float64 { return x * x })
quad.Color = color.RGBA{B: 255, A: 255}

fun := hplot.NewFunction(func(x float64) float64 {
switch {
case x < 6:
return 20
case 6 <= x && x < 7:
return 0
case 7 <= x && x < 7.5:
return 30
case 7.5 <= x && x < 9:
return 0
case 9 <= x:
return 40
}
return 50
})
fun.LogY = true
fun.Color = color.RGBA{R: 255, A: 255}

p := hplot.New()
p.Title.Text = "Functions - Log-Y scale"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

p.Y.Scale = plot.LogScale{}
p.Y.Tick.Marker = plot.LogTicks{}

p.Legend.ThumbnailWidth = 0.5 * vg.Inch

p.X.Min = 5
p.X.Max = 10
p.Y.Min = 10
p.Y.Max = 100

err := p.Save(200, 200, "testdata/functions_logy.png")
if err != nil {
log.Panic(err)
}


#### func NewFunction¶Uses

func NewFunction(f func(float64) float64) *Function

NewFunction returns a Function that plots F using the default line style with 50 samples.

#### func (*Function) Plot¶Uses

func (f *Function) Plot(c draw.Canvas, p *plot.Plot)

Plot implements the Plotter interface, drawing a line that connects each point in the Line.

#### func (Function) Thumbnail¶Uses

func (f Function) Thumbnail(c *draw.Canvas)

Thumbnail draws a line in the given style down the center of a DrawArea as a thumbnail representation of the LineStyle of the function.

### type H1D¶Uses

type H1D struct {
// Hist is the histogramming data
Hist *hbook.H1D

// FillColor is the color used to fill each
// bar of the histogram.  If the color is nil
// then the bars are not filled.
FillColor color.Color

// LineStyle is the style of the outline of each
// bar of the histogram.
draw.LineStyle

// GlyphStyle is the style of the glyphs drawn
// at the top of each histogram bar.
GlyphStyle draw.GlyphStyle

// LogY allows rendering with a log-scaled Y axis.
// When enabled, histogram bins with no entries will be discarded from
// the histogram's DataRange.
// The lowest Y value for the DataRange will be corrected to leave an
// arbitrary amount of height for the smallest bin entry so it is visible
// on the final plot.
LogY bool

// InfoStyle is the style of infos displayed for
// the histogram (entries, mean, rms).
Infos HInfos

// YErrs is the y error bars plotter.
YErrs *plotter.YErrorBars

// Band displays a colored band between the y-min and y-max error bars.
// The band is shown in the legend thumbnail only if there is no filling.
Band *BinnedErrBand
}

H1D implements the plotter.Plotter interface, drawing a histogram of the data.

An example of making a 1D-histogram.

Code:

const npoints = 10000

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

// Draw some random values from the standard
// normal distribution.
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// normalize histogram
area := 0.0
for _, bin := range hist.Binning.Bins {
area += bin.SumW() * bin.XWidth()
}
hist.Scale(1 / area)

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = "Histogram"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist)
h.Infos.Style = hplot.HInfoSummary

// The normal distribution function
norm := hplot.NewFunction(dist.Prob)
norm.Color = color.RGBA{R: 255, A: 255}
norm.Width = vg.Points(2)

// draw a grid

// Save the plot to a PNG file.
if err := p.Save(6*vg.Inch, -1, "testdata/h1d_plot.png"); err != nil {
log.Fatalf("error saving plot: %v\n", err)
}


An example showing legend with different style

Code:


const npoints = 500

// Create a few normal distributions.
var hists [5]*hbook.H1D
for id := range [5]int{0, 1, 2, 3, 4} {
mu := -2. + float64(id)*2
sigma := 0.3

dist := distuv.Normal{
Mu:    mu,
Sigma: sigma,
Src:   rand.New(rand.NewSource(uint64(id))),
}

// Draw some random values from the standard
// normal distribution.
hists[id] = hbook.NewH1D(15, mu-4*sigma, mu+4*sigma)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hists[id].Fill(v, 1)
}
}

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = "Histograms"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
p.X.Min = -3
p.X.Max = 15

// Legend style tunning
p.Legend.Top = true
p.Legend.ThumbnailWidth = 0.5 * vg.Inch
p.Legend.TextStyle.Font.Size = 11

// Histogram with line and markers
hmarker := hplot.NewH1D(hists[0],
hplot.WithYErrBars(true),
hplot.WithGlyphStyle(draw.GlyphStyle{
Color:  color.Black,
Shape:  draw.CircleGlyph{},
}),
)
hmarker.LineStyle.Color = color.NRGBA{R: 200, G: 30, A: 255}
hmarker.LineStyle.Width = 1
hmarker.LineStyle.Dashes = plotutil.Dashes(2)

// Histogram with fill and line
hfill := hplot.NewH1D(hists[1])
hfill.FillColor = color.NRGBA{R: 200, A: 130}
hfill.LineStyle.Color = color.NRGBA{R: 200, G: 30, A: 255}
hfill.LineStyle.Width = 1.3

// Histogram with error band
hband := hplot.NewH1D(hists[2], hplot.WithBand(true))
hband.LineStyle.Width = 1.0

// Histogram with fill, line and band
hfillband := hplot.NewH1D(hists[3],
hplot.WithBand(true),
)
hfillband.FillColor = color.NRGBA{B: 200, A: 180}
hfillband.LineStyle.Color = color.NRGBA{B: 200, G: 30, A: 255}
hfillband.LineStyle.Width = 1.3
hfillband.Band.FillColor = color.NRGBA{R: 180, G: 180, B: 180, A: 180}

// Histogram with fill, line, markers and band
hall := hplot.NewH1D(hists[4],
hplot.WithBand(true),
hplot.WithYErrBars(true),
hplot.WithGlyphStyle(draw.GlyphStyle{
Color:  color.Black,
Shape:  draw.CircleGlyph{},
}),
)
hall.FillColor = color.NRGBA{G: 160, A: 180}
hall.LineStyle.Color = color.NRGBA{G: 250, B: 60, R: 20, A: 255}
hall.LineStyle.Width = 1.3
p.Legend.Add("fill, marker, line & band", hall)

// Create a figure
fig := hplot.Figure(p, hplot.WithDPI(192.))
fig.Border.Right = 15
fig.Border.Left = 10
fig.Border.Top = 10
fig.Border.Bottom = 10

// Save the figure to a PNG file.
if err := hplot.Save(fig, 6*vg.Inch, -1, "testdata/h1d_legend.png"); err != nil {
log.Fatalf("error saving plot: %v\n", err)
}


Code:

p := hplot.New()
p.Title.Text = "Histogram in log-y"
p.Y.Scale = plot.LogScale{}
p.Y.Tick.Marker = plot.LogTicks{}
p.Y.Label.Text = "Y"
p.X.Label.Text = "X"

h1 := hbook.NewH1D(10, -5, +5)
for _, v := range []float64{
-2, -2,
-1,
+3, +3, +3, +3,
+1, +1, +1, +1, +1, +1, +1, +1, +1, +1,
+1, +1, +1, +1, +1, +1, +1, +1, +1, +1,
} {
h1.Fill(v, 1)
}
p1 := hplot.NewH1D(h1)
p1.LogY = true
p1.FillColor = color.RGBA{255, 0, 0, 255}

h2 := hbook.NewH1D(10, -5, +5)
for _, v := range []float64{
-3, -3, -3,
+2, +2, +2, +2, +2,
} {
h2.Fill(v, 1)
}
p2 := hplot.NewH1D(h2,
hplot.WithYErrBars(true),
hplot.WithLogY(true),
hplot.WithGlyphStyle(draw.GlyphStyle{
Color:  color.Black,
Shape:  draw.CircleGlyph{},
}),
)
p2.FillColor = color.RGBA{0, 0, 255, 255}

err := p.Save(6*vg.Inch, -1, "testdata/h1d_logy.png")
if err != nil {
log.Fatal(err)
}


An example of making a 1D-histogram and saving to a PDF

Code:

const npoints = 10000

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

// Draw some random values from the standard
// normal distribution.
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// normalize histogram
area := 0.0
for _, bin := range hist.Binning.Bins {
area += bin.SumW() * bin.XWidth()
}
hist.Scale(1 / area)

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = "Histogram"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist)
h.Infos.Style = hplot.HInfoSummary

// The normal distribution function
norm := hplot.NewFunction(dist.Prob)
norm.Color = color.RGBA{R: 255, A: 255}
norm.Width = vg.Points(2)

// draw a grid

// Save the plot to a PNG file.
if err := p.Save(6*vg.Inch, -1, "testdata/h1d_plot.pdf"); err != nil {
log.Fatalf("error saving plot: %v\n", err)
}


An example of making a 1D-histogram.

Code:

const npoints = 10000

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

// Draw some random values from the standard
// normal distribution.
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// normalize histogram
area := 0.0
for _, bin := range hist.Binning.Bins {
area += bin.SumW() * bin.XWidth()
}
hist.Scale(1 / area)

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = "Histogram"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist)
h.Infos.Style = hplot.HInfoSummary

// The normal distribution function
norm := hplot.NewFunction(dist.Prob)
norm.Color = color.RGBA{R: 255, A: 255}
norm.Width = vg.Points(2)

// draw a grid

fig := hplot.Figure(p,
hplot.WithDPI(96),
hplot.WithBorder(hplot.Border{
Right:  25,
Left:   20,
Top:    25,
Bottom: 20,
}),
)

// Save the plot to a PNG file.
if err := hplot.Save(fig, 6*vg.Inch, -1, "testdata/h1d_borders.png"); err != nil {
log.Fatalf("error saving plot: %v\n", err)
}


An example of making a 1D-histogram with y-error bars.

Code:

const npoints = 100

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

// Draw some random values from the standard
// normal distribution.
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// normalize histogram
area := 0.0
for _, bin := range hist.Binning.Bins {
area += bin.SumW() * bin.XWidth()
}
hist.Scale(1 / area)

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = "Histogram"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist,
hplot.WithHInfo(hplot.HInfoSummary),
hplot.WithYErrBars(true),
)
h.YErrs.LineStyle.Color = color.RGBA{R: 255, A: 255}

// The normal distribution function
norm := hplot.NewFunction(dist.Prob)
norm.Color = color.RGBA{R: 255, A: 255}
norm.Width = vg.Points(2)

// draw a grid

// Save the plot to a PNG file.
if err := p.Save(6*vg.Inch, -1, "testdata/h1d_yerrs.png"); err != nil {
log.Fatalf("error saving plot: %v\n", err)
}


An example of making a 1D-histogram with y-error bars and no histogram rectangle.

Code:

const npoints = 100

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

// Draw some random values from the standard
// normal distribution.
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

// normalize histogram
area := 0.0
for _, bin := range hist.Binning.Bins {
area += bin.SumW() * bin.XWidth()
}
hist.Scale(1 / area)

// Make a plot and set its title.
p := hplot.New()
p.Title.Text = "Histogram"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

p.Legend.Top = true
p.Legend.Left = true

// Create a histogram of our values drawn
// from the standard normal.
h := hplot.NewH1D(hist,
hplot.WithHInfo(hplot.HInfoSummary),
hplot.WithYErrBars(true),
hplot.WithGlyphStyle(draw.GlyphStyle{
Shape:  draw.CrossGlyph{},
Color:  color.Black,
}),
)
h.GlyphStyle.Shape = draw.CircleGlyph{}
h.YErrs.LineStyle.Color = color.Black
h.LineStyle.Width = 0 // disable histogram lines

// The normal distribution function
norm := hplot.NewFunction(dist.Prob)
norm.Color = color.RGBA{R: 255, A: 255}
norm.Width = vg.Points(2)

// draw a grid

// Save the plot to a PNG file.
if err := p.Save(6*vg.Inch, -1, "testdata/h1d_glyphs.png"); err != nil {
log.Fatalf("error saving plot: %v\n", err)
}


#### func NewH1D¶Uses

func NewH1D(h *hbook.H1D, opts ...Options) *H1D

NewH1D returns a new histogram, as in NewH1DFromXYer, except that it accepts a hbook.H1D instead of a plotter.XYer

#### func NewH1FromValuer¶Uses

func NewH1FromValuer(vs plotter.Valuer, n int, opts ...Options) *H1D

NewH1FromValuer returns a new histogram, as in NewH1FromXYer, except that it accepts a plotter.Valuer instead of an XYer.

#### func NewH1FromXYer¶Uses

func NewH1FromXYer(xy plotter.XYer, n int, opts ...Options) *H1D

NewH1FromXYer returns a new histogram that represents the distribution of values using the given number of bins.

Each y value is assumed to be the frequency count for the corresponding x.

It panics if the number of bins is non-positive.

#### func (*H1D) DataRange¶Uses

func (h *H1D) DataRange() (xmin, xmax, ymin, ymax float64)

DataRange returns the minimum and maximum X and Y values

#### func (*H1D) GlyphBoxes¶Uses

func (h *H1D) GlyphBoxes(p *plot.Plot) []plot.GlyphBox

GlyphBoxes returns a slice of GlyphBoxes, one for each of the bins, implementing the plot.GlyphBoxer interface.

#### func (*H1D) Plot¶Uses

func (h *H1D) Plot(c draw.Canvas, p *plot.Plot)

Plot implements the Plotter interface, drawing a line that connects each point in the Line.

#### func (*H1D) Thumbnail¶Uses

func (h *H1D) Thumbnail(c *draw.Canvas)

Thumbnail draws a rectangle in the given style of the histogram.

### type H2D¶Uses

type H2D struct {
// H is the histogramming data
H   *hbook.H2D

// InfoStyle is the style of infos displayed for
// the histogram (entries, mean, rms)
Infos HInfos

// HeatMap implements the Plotter interface, drawing
// a heat map of the values in the 2-d histogram.
HeatMap *plotter.HeatMap
}

H2D implements the plotter.Plotter interface, drawing a 2-dim histogram of the data.

Code:

h := hbook.NewH2D(100, -10, 10, 100, -10, 10)

const npoints = 10000

dist, ok := distmv.NewNormal(
[]float64{0, 1},
mat.NewSymDense(2, []float64{4, 0, 0, 2}),
rand.New(rand.NewSource(1234)),
)
if !ok {
log.Fatalf("error creating distmv.Normal")
}

v := make([]float64, 2)
// Draw some random values from the standard
// normal distribution.
for i := 0; i < npoints; i++ {
v = dist.Rand(v)
h.Fill(v[0], v[1], 1)
}

p := hplot.New()
p.Title.Text = "Hist-2D"
p.X.Label.Text = "x"
p.Y.Label.Text = "y"

err := p.Save(10*vg.Centimeter, 10*vg.Centimeter, "testdata/h2d_plot.png")
if err != nil {
log.Fatal(err)
}


#### func NewH2D¶Uses

func NewH2D(h *hbook.H2D, p palette.Palette) *H2D

NewH2D returns a new 2-dim histogram from a hbook.H2D.

#### func (*H2D) DataRange¶Uses

func (h *H2D) DataRange() (xmin, xmax, ymin, ymax float64)

DataRange implements the DataRange method of the plot.DataRanger interface.

#### func (*H2D) GlyphBoxes¶Uses

func (h *H2D) GlyphBoxes(p *plot.Plot) []plot.GlyphBox

GlyphBoxes returns a slice of GlyphBoxes, one for each of the bins, implementing the plot.GlyphBoxer interface.

#### func (*H2D) Plot¶Uses

func (h *H2D) Plot(c draw.Canvas, p *plot.Plot)

Plot implements the Plotter interface, drawing a line that connects each point in the Line.

### type HInfoStyle¶Uses

type HInfoStyle uint32
const (
HInfoNone    HInfoStyle = 0
HInfoEntries HInfoStyle = 1 << iota
HInfoMean
HInfoRMS
HInfoStdDev
HInfoSummary HInfoStyle = HInfoEntries | HInfoMean | HInfoStdDev
)

### type HInfos¶Uses

type HInfos struct {
Style HInfoStyle
}

### type HStack¶Uses

type HStack struct {

// LogY allows rendering with a log-scaled Y axis.
// When enabled, histogram bins with no entries will be discarded from
// the histogram's DataRange.
// The lowest Y value for the DataRange will be corrected to leave an
// arbitrary amount of height for the smallest bin entry so it is visible
// on the final plot.
LogY bool

// Stack specifies how histograms are displayed.
// Default is to display histograms stacked on top of each other.
// If not stacked, individual histogram uncertainty bands will be
// displayed when defined.
// If stacked, individual uncertainty bands will not be diplayed
// but the total band can be displayed with the hplot.WithBand(true)
// option.
Stack HStackKind

// Band displays a colored band between the y-min and y-max error bars.
// Error bars are computed as the bin-by-bin quadratic sum of individual
// histogram uncertainties.
Band *BinnedErrBand
// contains filtered or unexported fields
}

HStack implements the plot.Plotter interface, drawing a stack of histograms.

Code:

h1 := hbook.NewH1D(100, -10, 10)
h2 := hbook.NewH1D(100, -10, 10)
h3 := hbook.NewH1D(100, -10, 10)

const seed = 1234
fillH1(h1, 10000, -2, 1, seed)
fillH1(h2, 10000, +3, 3, seed)
fillH1(h3, 10000, +4, 1, seed)

colors := []color.Color{
color.NRGBA{122, 195, 106, 150},
color.NRGBA{90, 155, 212, 150},
color.NRGBA{250, 167, 91, 150},
}

hh1 := hplot.NewH1D(h1)
hh1.FillColor = colors[0]
hh1.LineStyle.Color = color.Black

hh2 := hplot.NewH1D(h2)
hh2.FillColor = colors[1]
hh2.LineStyle.Width = 0

hh3 := hplot.NewH1D(h3)
hh3.FillColor = colors[2]
hh3.LineStyle.Color = color.Black

hs := []*hplot.H1D{hh1, hh2, hh3}

tp := hplot.NewTiledPlot(draw.Tiles{Cols: 1, Rows: 3})
tp.Align = true

{
p := tp.Plots[0]
p.Title.Text = "Histograms"
p.Y.Label.Text = "Y"
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(1, 0)
p.Title.Text = "HStack - stack: OFF"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hs)
hstack.Stack = hplot.HStackOff
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(2, 0)
p.Title.Text = "Hstack - stack: ON"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hs, hplot.WithLogY(false))
p.Legend.Top = true
p.Legend.Left = true
}

err := tp.Save(15*vg.Centimeter, 15*vg.Centimeter, "testdata/hstack.png")
if err != nil {
log.Fatalf("error: %+v", err)
}



Code:

h1 := hbook.NewH1D(50, -8, 12)
h2 := hbook.NewH1D(50, -8, 12)
h3 := hbook.NewH1D(50, -8, 12)

const seed = 1234
fillH1(h1, 2000, -2, 1, seed)
fillH1(h2, 2000, +3, 3, seed)
fillH1(h3, 2000, +4, 1, seed)

colors := []color.Color{
color.NRGBA{122, 195, 106, 150},
color.NRGBA{90, 155, 212, 150},
color.NRGBA{250, 167, 91, 150},
}

hh1 := hplot.NewH1D(h1, hplot.WithBand(true))
hh1.FillColor = colors[0]
hh1.LineStyle.Color = color.Black
hh1.Band.FillColor = color.NRGBA{G: 210, A: 200}

hh2 := hplot.NewH1D(h2, hplot.WithBand(false))
hh2.FillColor = colors[1]
hh2.LineStyle.Width = 0

hh3 := hplot.NewH1D(h3, hplot.WithBand(true))
hh3.FillColor = colors[2]
hh3.LineStyle.Color = color.Black
hh3.Band.FillColor = color.NRGBA{R: 220, A: 200}

hs := []*hplot.H1D{hh1, hh2, hh3}

hh4 := hplot.NewH1D(h1)
hh4.FillColor = colors[0]
hh4.LineStyle.Color = color.Black

hh5 := hplot.NewH1D(h2)
hh5.FillColor = colors[1]
hh5.LineStyle.Width = 0

hh6 := hplot.NewH1D(h3)
hh6.FillColor = colors[2]
hh6.LineStyle.Color = color.Black

hsHistoNoBand := []*hplot.H1D{hh4, hh5, hh6}

tp := hplot.NewTiledPlot(draw.Tiles{Cols: 2, Rows: 2})
tp.Align = true

{
p := tp.Plot(0, 0)
p.Title.Text = "Histos With or Without Band, Stack: OFF"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hs, hplot.WithBand(true))
hstack.Stack = hplot.HStackOff
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(0, 1)
p.Title.Text = "Histos Without Band, Stack: OFF"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hsHistoNoBand, hplot.WithBand(true))
hstack.Stack = hplot.HStackOff
hstack.Band.FillColor = color.NRGBA{R: 100, G: 100, B: 100, A: 200}
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(1, 0)
p.Title.Text = "Histos With or Without Band, Stack: ON"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hs, hplot.WithBand(true))
hstack.Band.FillColor = color.NRGBA{R: 100, G: 100, B: 100, A: 200}
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(1, 1)
p.Title.Text = "Histos Without Band, Stack: ON"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hsHistoNoBand, hplot.WithBand(true))
hstack.Band.FillColor = color.NRGBA{R: 100, G: 100, B: 100, A: 200}
p.Legend.Top = true
p.Legend.Left = true
}

err := tp.Save(25*vg.Centimeter, 15*vg.Centimeter, "testdata/hstack_band.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


Code:

h1 := hbook.NewH1D(50, -8, 12)
h2 := hbook.NewH1D(50, -8, 12)
h3 := hbook.NewH1D(50, -8, 12)

const seed = 1234
fillH1(h1, 2000, -2, 1, seed)
fillH1(h2, 2000, +3, 3, seed)
fillH1(h3, 2000, +4, 1, seed)

colors := []color.Color{
color.NRGBA{122, 195, 106, 150},
color.NRGBA{90, 155, 212, 150},
color.NRGBA{250, 167, 91, 150},
}
logy := hplot.WithLogY(true)

hh1 := hplot.NewH1D(h1, hplot.WithBand(true), logy)
hh1.FillColor = colors[0]
hh1.LineStyle.Color = color.Black
hh1.Band.FillColor = color.NRGBA{G: 210, A: 200}

hh2 := hplot.NewH1D(h2, hplot.WithBand(false), logy)
hh2.FillColor = colors[1]
hh2.LineStyle.Width = 0

hh3 := hplot.NewH1D(h3, hplot.WithBand(true), logy)
hh3.FillColor = colors[2]
hh3.LineStyle.Color = color.Black
hh3.Band.FillColor = color.NRGBA{R: 220, A: 200}

hs := []*hplot.H1D{hh1, hh2, hh3}

hh4 := hplot.NewH1D(h1, logy)
hh4.FillColor = colors[0]
hh4.LineStyle.Color = color.Black

hh5 := hplot.NewH1D(h2, logy)
hh5.FillColor = colors[1]
hh5.LineStyle.Width = 0

hh6 := hplot.NewH1D(h3, logy)
hh6.FillColor = colors[2]
hh6.LineStyle.Color = color.Black

hsHistoNoBand := []*hplot.H1D{hh4, hh5, hh6}

tp := hplot.NewTiledPlot(draw.Tiles{Cols: 2, Rows: 2})
tp.Align = true

{
p := tp.Plot(0, 0)
p.Title.Text = "Histos With or Without Band, Stack: OFF"
p.Y.Scale = plot.LogScale{}
p.Y.Tick.Marker = plot.LogTicks{}
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hs, hplot.WithBand(true), logy)
hstack.Stack = hplot.HStackOff
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(0, 1)
p.Title.Text = "Histos Without Band, Stack: OFF"
p.Y.Scale = plot.LogScale{}
p.Y.Tick.Marker = plot.LogTicks{}
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hsHistoNoBand, hplot.WithBand(true), logy)
hstack.Stack = hplot.HStackOff
hstack.Band.FillColor = color.NRGBA{R: 100, G: 100, B: 100, A: 200}
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(1, 0)
p.Title.Text = "Histos With or Without Band, Stack: ON"
p.Y.Scale = plot.LogScale{}
p.Y.Tick.Marker = plot.LogTicks{}
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hs, hplot.WithBand(true), logy)
hstack.Band.FillColor = color.NRGBA{R: 100, G: 100, B: 100, A: 200}
p.Legend.Top = true
p.Legend.Left = true
}

{
p := tp.Plot(1, 1)
p.Title.Text = "Histos Without Band, Stack: ON"
p.Y.Scale = plot.LogScale{}
p.Y.Tick.Marker = plot.LogTicks{}
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"
hstack := hplot.NewHStack(hsHistoNoBand, hplot.WithBand(true), logy)
hstack.Band.FillColor = color.NRGBA{R: 100, G: 100, B: 100, A: 200}
p.Legend.Top = true
p.Legend.Left = true
}

err := tp.Save(25*vg.Centimeter, 15*vg.Centimeter, "testdata/hstack_logy.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


#### func NewHStack¶Uses

func NewHStack(histos []*H1D, opts ...Options) *HStack

NewHStack creates a new histogram stack from the provided list of histograms. NewHStack panicks if the list of histograms is empty. NewHStack panicks if the histograms have different binning.

#### func (*HStack) DataRange¶Uses

func (hstack *HStack) DataRange() (xmin, xmax, ymin, ymax float64)

DataRange returns the minimum and maximum X and Y values

#### func (*HStack) Plot¶Uses

func (hstack *HStack) Plot(c draw.Canvas, p *plot.Plot)

Plot implements the Plotter interface, drawing a line that connects each point in the Line.

### type HStackKind¶Uses

type HStackKind int

HStackKind customizes how a HStack should behave.

const (
// HStackOn instructs HStack to display histograms
// stacked on top of each other.
HStackOn HStackKind = iota
// HStackOff instructs HStack to display histograms
// with the stack disabled.
HStackOff
)

### type HorizLine¶Uses

type HorizLine struct {
Y      float64
Line   draw.LineStyle
Top    color.Color
Bottom color.Color
}

HorizLine draws a horizontal line at Y and colors the top and bottom portions of the plot with the provided colors.

#### func HLine¶Uses

func HLine(y float64, top, bottom color.Color) *HorizLine

HLine creates a horizontal line at y with the default line style.

An example of making a horizontal-line plot

Code:

p := hplot.New()
p.Title.Text = "hlines"
p.X.Min = 0
p.X.Max = 10
p.Y.Min = 0
p.Y.Max = 10

var (
top    = color.RGBA{B: 255, A: 255}
bottom = color.RGBA{R: 255, A: 255}
)

hplot.HLine(2.5, nil, bottom),
hplot.HLine(5, nil, nil),
hplot.HLine(7.5, top, nil),
)

err := p.Save(10*vg.Centimeter, -1, "testdata/hline.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


#### func (*HorizLine) Plot¶Uses

func (hline *HorizLine) Plot(c draw.Canvas, plt *plot.Plot)

#### func (*HorizLine) Thumbnail¶Uses

func (hline *HorizLine) Thumbnail(c *draw.Canvas)

Thumbnail returns the thumbnail for the VertLine, implementing the plot.Thumbnailer interface.

### type NoTicks¶Uses

type NoTicks struct{}

NoTicks implements plot.Ticker but does not display any tick.

#### func (NoTicks) Ticks¶Uses

func (NoTicks) Ticks(min, max float64) []plot.Tick

Ticks returns Ticks in a specified range

### type Options¶Uses

type Options func(cfg *config)

Options encodes various options to pass to a plot.

#### func WithBand¶Uses

func WithBand(v bool) Options

WithBand enables or disables the display of a colored band between Y-error bars.

#### func WithGlyphStyle¶Uses

func WithGlyphStyle(sty draw.GlyphStyle) Options

WithGlyphStyle sets the glyph style of a plotter.

#### func WithHInfo¶Uses

func WithHInfo(v HInfoStyle) Options

WithHInfo sets a given histogram info style.

#### func WithLogY¶Uses

func WithLogY(v bool) Options

WithLogY sets whether the plotter in Y should handle log-scale.

#### func WithStepsKind¶Uses

func WithStepsKind(s StepsKind) Options

WithStepsKind sets the style of the connecting line (NoSteps, HiSteps, etc...)

#### func WithXErrBars¶Uses

func WithXErrBars(v bool) Options

WithXErrBars enables or disables the display of X-error bars.

#### func WithYErrBars¶Uses

func WithYErrBars(v bool) Options

WithYErrBars enables or disables the display of Y-error bars.

### type Plot¶Uses

type Plot struct {
*plot.Plot
Style Style
}

Plot is the basic type representing a plot.

#### func New¶Uses

func New() *Plot

New returns a new plot with some reasonable default settings.

func (p *Plot) Add(ps ...plot.Plotter)

If the plotters implements DataRanger then the minimum and maximum values of the X and Y axes are changed if necessary to fit the range of the data.

When drawing the plot, Plotters are drawn in the order in which they were added to the plot.

#### func (*Plot) Draw¶Uses

func (p *Plot) Draw(dc draw.Canvas)

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 (*Plot) Save¶Uses

func (p *Plot) Save(w, h vg.Length, file string) error

Save saves the plot to an image file. The file format is determined by the extension.

Supported extensions are:

.eps, .jpg, .jpeg, .pdf, .png, .svg, .tex, .tif and .tiff.


If w or h are <= 0, the value is chosen such that it follows the Golden Ratio. If w and h are <= 0, the values are chosen such that they follow the Golden Ratio (the width is defaulted to vgimg.DefaultWidth).

#### func (*Plot) WriterTo¶Uses

func (p *Plot) WriterTo(w, h vg.Length, format string) (io.WriterTo, error)

WriterTo returns an io.WriterTo that will write the plot as the specified image format.

Supported formats are:

eps, jpg|jpeg, pdf, png, svg, tex and tif|tiff.


### type RatioPlot¶Uses

type RatioPlot struct {
Top    *Plot
Bottom *Plot

// Tiles controls the layout of the 2x1 ratio-plot grid.
// Tiles can be used to customize the padding between plots.
Tiles draw.Tiles

// Ratio controls how the vertical space is partioned between
// the top and bottom plots.
// The top plot will take (1-ratio)*height.
// Default is 0.3.
Ratio float64
}

Code:


const npoints = 10000

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

hist1 := hbook.NewH1D(20, -4, +4)
hist2 := hbook.NewH1D(20, -4, +4)

for i := 0; i < npoints; i++ {
v1 := dist.Rand() - 0.5
v2 := dist.Rand() + 0.5
hist1.Fill(v1, 1)
hist2.Fill(v2, 1)
}

rp := hplot.NewRatioPlot()
rp.Ratio = 0.3

// Make a plot and set its title.
rp.Top.Title.Text = "Histos"
rp.Top.Y.Label.Text = "Y"

// Create a histogram of our values drawn
// from the standard normal.
h1 := hplot.NewH1D(hist1)
h1.FillColor = color.NRGBA{R: 255, A: 100}

h2 := hplot.NewH1D(hist2)
h2.FillColor = color.NRGBA{B: 255, A: 100}

hist3 := hbook.NewH1D(20, -4, +4)
for i := 0; i < hist3.Len(); i++ {
v1 := hist1.Value(i)
v2 := hist2.Value(i)
x1, _ := hist1.XY(i)
hist3.Fill(x1, v1-v2)
}

hdiff := hplot.NewH1D(hist3)

rp.Bottom.X.Label.Text = "X"
rp.Bottom.Y.Label.Text = "Delta-Y"

const (
width  = 15 * vg.Centimeter
height = width / math.Phi
)

err := hplot.Save(rp, width, height, "testdata/diff_plot.png")
if err != nil {
log.Fatalf("error: %v\n", err)
}


#### func NewRatioPlot¶Uses

func NewRatioPlot() *RatioPlot

#### func (*RatioPlot) Draw¶Uses

func (rp *RatioPlot) Draw(dc draw.Canvas)

Draw draws a ratio 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.

### type S2D¶Uses

type S2D struct {
Data plotter.XYer

// GlyphStyle is the style of the glyphs drawn
// at each point.
draw.GlyphStyle

// LineStyle is the style of the line drawn
// connecting each point.
// Use zero width to disable.
LineStyle draw.LineStyle

// XErrs is the x error bars plotter.
XErrs *plotter.XErrorBars

// YErrs is the y error bars plotter.
YErrs *plotter.YErrorBars

// Band displays a colored band between the y-min and y-max error bars.
Band *Band

// Steps controls the style of the connecting
// line (NoSteps, HiSteps, etc...)
Steps StepsKind
}

S2D plots a set of 2-dim points with error bars.

ExampleS2D draws some scatter points.

Code:

const npoints = 1000

dist, ok := distmv.NewNormal(
[]float64{0, 1},
mat.NewSymDense(2, []float64{4, 0, 0, 2}),
rand.New(rand.NewSource(1234)),
)
if !ok {
log.Fatalf("error creating distmv.Normal")
}

s2d := hbook.NewS2D()

v := make([]float64, 2)
// Draw some random values from the standard
// normal distribution.
for i := 0; i < npoints; i++ {
v = dist.Rand(v)
s2d.Fill(hbook.Point2D{X: v[0], Y: v[1]})
}

p := hplot.New()
p.Title.Text = "Scatter-2D"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

s := hplot.NewS2D(s2d)
s.GlyphStyle.Color = color.RGBA{R: 255, A: 255}

err := p.Save(10*vg.Centimeter, 10*vg.Centimeter, "testdata/s2d.png")
if err != nil {
log.Fatal(err)
}


ExampleS2D_withBand draws some scatter points with their error bars and a band

Code:

pts := []hbook.Point2D{
{X: 1, Y: 1, ErrY: hbook.Range{Min: 2, Max: 3}},
{X: 2, Y: 2, ErrY: hbook.Range{Min: 5, Max: 2}},
{X: 3, Y: 3, ErrY: hbook.Range{Min: 2, Max: 2}},
{X: 4, Y: 4, ErrY: hbook.Range{Min: 1.2, Max: 2}},
}
s2d := hbook.NewS2D(pts...)

p := hplot.New()
p.Title.Text = "Scatter-2D (with band)"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

s := hplot.NewS2D(s2d, hplot.WithBand(true), hplot.WithYErrBars(true))
s.GlyphStyle.Color = color.Black
s.LineStyle.Width = 1
s.LineStyle.Dashes = plotutil.Dashes(2)

err := p.Save(10*vg.Centimeter, 10*vg.Centimeter, "testdata/s2d_band.png")
if err != nil {
log.Fatal(err)
}


ExampleS2D_withErrorBars draws some scatter points with their error bars.

Code:

pts := []hbook.Point2D{
{X: 1, Y: 1, ErrX: hbook.Range{Min: 0.5, Max: 0.5}, ErrY: hbook.Range{Min: 2, Max: 3}},
{X: 2, Y: 2, ErrX: hbook.Range{Min: 0.5, Max: 1.5}, ErrY: hbook.Range{Min: 5, Max: 2}},
}
s2d := hbook.NewS2D(pts...)

p := hplot.New()
p.Title.Text = "Scatter-2D (with error bars)"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

s := hplot.NewS2D(s2d,
hplot.WithXErrBars(true),
hplot.WithYErrBars(true),
hplot.WithGlyphStyle(draw.GlyphStyle{
Color:  color.RGBA{R: 255, A: 255},
Shape:  draw.CrossGlyph{},
}),
)

err := p.Save(10*vg.Centimeter, 10*vg.Centimeter, "testdata/s2d_errbars.png")
if err != nil {
log.Fatal(err)
}


ExampleS2D_withStepsKind draws some scatter points with their error bars, using a step-like style

Code:

pts := []hbook.Point2D{
{X: 1, ErrX: hbook.Range{Min: 0.5, Max: 0.5}, Y: 1, ErrY: hbook.Range{Min: 2, Max: 3}},
{X: 2, ErrX: hbook.Range{Min: 0.5, Max: 0.5}, Y: 2, ErrY: hbook.Range{Min: 5, Max: 2}},
{X: 3, ErrX: hbook.Range{Min: 0.5, Max: 0.5}, Y: 3, ErrY: hbook.Range{Min: 2, Max: 2}},
{X: 4, ErrX: hbook.Range{Min: 0.5, Max: 0.5}, Y: 4, ErrY: hbook.Range{Min: 1.2, Max: 2}},
}
s2d := hbook.NewS2D(pts...)

p := hplot.New()
p.Title.Text = "Scatter-2D (with steps)"
p.X.Label.Text = "X"
p.Y.Label.Text = "Y"

s := hplot.NewS2D(s2d, hplot.WithStepsKind(hplot.HiSteps), hplot.WithYErrBars(true))
s.GlyphStyle.Color = color.Black
s.LineStyle.Width = 1
s.LineStyle.Dashes = plotutil.Dashes(2)

err := p.Save(10*vg.Centimeter, 10*vg.Centimeter, "testdata/s2d_steps.png")
if err != nil {
log.Fatal(err)
}


#### func NewS2D¶Uses

func NewS2D(data plotter.XYer, opts ...Options) *S2D

NewS2D creates a 2-dim scatter plot from a XYer.

#### func (*S2D) DataRange¶Uses

func (pts *S2D) DataRange() (xmin, xmax, ymin, ymax float64)

DataRange returns the minimum and maximum x and y values, implementing the plot.DataRanger interface.

#### func (*S2D) GlyphBoxes¶Uses

func (pts *S2D) GlyphBoxes(plt *plot.Plot) []plot.GlyphBox

GlyphBoxes returns a slice of plot.GlyphBoxes, implementing the plot.GlyphBoxer interface.

#### func (*S2D) Plot¶Uses

func (pts *S2D) Plot(c draw.Canvas, plt *plot.Plot)

Plot draws the Scatter, implementing the plot.Plotter interface.

#### func (*S2D) Thumbnail¶Uses

func (pts *S2D) Thumbnail(c *draw.Canvas)

Thumbnail the thumbnail for the Scatter, implementing the plot.Thumbnailer interface.

### type StepsKind¶Uses

type StepsKind byte

Step kind

const (
NoSteps StepsKind = iota
HiSteps
)

### type Style¶Uses

type Style struct {
Fonts struct {
Name   string  // font name of this style
Title  vg.Font // font used for the plot title
Label  vg.Font // font used for the plot labels
Legend vg.Font // font used for the plot legend
Tick   vg.Font // font used for the plot's axes' ticks
}
}

Style stores a given plot style.

var (
// DefaultStyle is the default style used for hplot plots.
DefaultStyle Style
)

#### func NewStyle¶Uses

func NewStyle(name string, ft *truetype.Font) (Style, error)

NewStyle creates a new style with the given truetype font.

#### func (*Style) Apply¶Uses

func (s *Style) Apply(p *Plot)

Apply setups the plot p with the current style.

### type Ticks¶Uses

type Ticks struct {
N   int // N is the suggested number of major ticks to display.

// Format is an optional major-tick formatter.
// If empty, a format will be automatically chosen.
Format string
}

Ticks implements plot.Ticker. Ticks allows to specify the maximum number of major ticks to display. The zero value of Ticks display a maximum number of 3 major ticks.

Code:

tp := hplot.NewTiledPlot(draw.Tiles{Cols: 2, Rows: 8})
tp.Align = true

for i := 0; i < tp.Tiles.Rows; i++ {
for j := 0; j < tp.Tiles.Cols; j++ {
p := tp.Plot(i, j)
switch i {
case 0:
p.X.Min = 0
p.X.Max = 1
switch j {
case 0:
p.Title.Text = "hplot.Ticks"
default:
p.Title.Text = "plot.Ticks"
}
case 1:
p.X.Min = 0
p.X.Max = 10
case 2:
p.X.Min = 0
p.X.Max = 100
case 3:
p.X.Min = 0
p.X.Max = 1000
case 4:
p.X.Min = 0
p.X.Max = 10000
case 5:
p.X.Min = 0
p.X.Max = 10000
case 6:
p.X.Min = 0
p.X.Max = 1.2
case 7:
p.X.Min = 0
p.X.Max = 120
}
if j == 0 {
var (
n    = 10
xfmt = ""
)
switch i {
case 4:
n = 5
case 5:
n = 5
xfmt = "%g"
}
p.X.Tick.Marker = hplot.Ticks{N: n, Format: xfmt}
}
}
}

const sz = 20 * vg.Centimeter
err := tp.Save(sz, sz, "testdata/ticks.png")
if err != nil {
log.Fatalf("error: %+v\n", err)
}


#### func (Ticks) Ticks¶Uses

func (tck Ticks) Ticks(min, max float64) []plot.Tick

### type TiledPlot¶Uses

type TiledPlot struct {
Plots []*Plot
Tiles draw.Tiles
Align bool // whether to align all tiles axes
}

TiledPlot is a regularly spaced set of plots, aranged as tiles.

An example of making a tile-plot

Code:

tp := hplot.NewTiledPlot(draw.Tiles{Cols: 3, Rows: 2})

// Create a normal distribution.
dist := distuv.Normal{
Mu:    0,
Sigma: 1,
Src:   rand.New(rand.NewSource(0)),
}

newHist := func(p *hplot.Plot) {
const npoints = 10000
hist := hbook.NewH1D(20, -4, +4)
for i := 0; i < npoints; i++ {
v := dist.Rand()
hist.Fill(v, 1)
}

h := hplot.NewH1D(hist)
}

for i := 0; i < tp.Tiles.Rows; i++ {
for j := 0; j < tp.Tiles.Cols; j++ {
p := tp.Plot(i, j)
p.X.Min = -5
p.X.Max = +5
newHist(p)
p.Title.Text = fmt.Sprintf("hist - (%02d, %02d)", i, j)
}
}

// remove plot at (0,1)
tp.Plots[1] = nil

err := tp.Save(15*vg.Centimeter, -1, "testdata/tiled_plot_histogram.png")
if err != nil {
log.Fatalf("error: %+v\n", err)
}


An example of making aligned tile-plots

Code:

tp := hplot.NewTiledPlot(draw.Tiles{
Cols: 3, Rows: 3,
})
tp.Align = true

points := func(i, j int) []hbook.Point2D {
n := i*tp.Tiles.Cols + j + 1
i += 1
j = int(math.Pow(10, float64(n)))

var pts []hbook.Point2D
for ii := 0; ii < 10; ii++ {
pts = append(pts, hbook.Point2D{
X:  float64(i + ii),
Y:  float64(j + ii + 1),
})
}
return pts

}

for i := 0; i < tp.Tiles.Rows; i++ {
for j := 0; j < tp.Tiles.Cols; j++ {
p := tp.Plot(i, j)
p.X.Min = -5
p.X.Max = +5
s := hplot.NewS2D(hbook.NewS2D(points(i, j)...))
s.GlyphStyle.Color = color.RGBA{R: 255, A: 255}

p.Title.Text = fmt.Sprintf("hist - (%02d, %02d)", i, j)
}
}

// remove plot at (1,1)
tp.Plots[4] = nil

err := tp.Save(15*vg.Centimeter, -1, "testdata/tiled_plot_aligned_histogram.png")
if err != nil {
log.Fatalf("error: %+v\n", err)
}


#### func NewTiledPlot¶Uses

func NewTiledPlot(tiles draw.Tiles) *TiledPlot

NewTiledPlot creates a new set of plots aranged as tiles. By default, NewTiledPlot will put a 1 vg.Length space between each plot.

#### func (*TiledPlot) Draw¶Uses

func (tp *TiledPlot) Draw(c draw.Canvas)

Draw draws the tiled plot to a draw.Canvas.

Each non-nil plot.Plot in the aranged set of tiled plots is drawn inside its dedicated sub-canvas, using hplot.Plot.Draw.

#### func (*TiledPlot) Plot¶Uses

func (tp *TiledPlot) Plot(i, j int) *Plot

Plot returns the plot at the i-th column and j-th row in the set of tiles. (0,0) is at the top-left of the set of tiles.

#### func (*TiledPlot) Save¶Uses

func (tp *TiledPlot) Save(w, h vg.Length, file string) error

Save saves the plots to an image file. The file format is determined by the extension.

Supported extensions are the same ones than hplot.Plot.Save.

If w or h are <= 0, the value is chosen such that it follows the Golden Ratio. If w and h are <= 0, the values are chosen such that they follow the Golden Ratio (the width is defaulted to vgimg.DefaultWidth).

### type VertLine¶Uses

type VertLine struct {
X     float64
Line  draw.LineStyle
Left  color.Color
Right color.Color
}

VertLine draws a vertical line at X and colors the left and right portions of the plot with the provided colors.

#### func VLine¶Uses

func VLine(x float64, left, right color.Color) *VertLine

VLine creates a vertical line at x with the default line style.

An example of making a vertical-line plot

Code:

p := hplot.New()
p.Title.Text = "vlines"
p.X.Min = 0
p.X.Max = 10
p.Y.Min = 0
p.Y.Max = 10

var (
left  = color.RGBA{B: 255, A: 255}
right = color.RGBA{R: 255, A: 255}
)

hplot.VLine(2.5, left, nil),
hplot.VLine(5, nil, nil),
hplot.VLine(7.5, nil, right),
)

err := p.Save(10*vg.Centimeter, -1, "testdata/vline.png")
if err != nil {
log.Fatalf("error: %+v", err)
}


#### func (*VertLine) Plot¶Uses

func (vline *VertLine) Plot(c draw.Canvas, plt *plot.Plot)

#### func (*VertLine) Thumbnail¶Uses

func (vline *VertLine) Thumbnail(c *draw.Canvas)

Thumbnail returns the thumbnail for the VertLine, implementing the plot.Thumbnailer interface.

### Directories ¶

PathSynopsis
cmd/hplothplot is a simple gnuplot-like command to create plots
cmd/iplot
htex
internal/talbot

Package hplot imports 27 packages (graph) and is imported by 32 packages. Updated 2020-11-07. Refresh now. Tools for package owners.