...

Source file src/gonum.org/v1/plot/plotter/barchart_example_test.go

Documentation: gonum.org/v1/plot/plotter

     1  // Copyright ©2015 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package plotter_test
     6  
     7  import (
     8  	"image/color"
     9  	"log"
    10  
    11  	"golang.org/x/exp/rand"
    12  
    13  	"gonum.org/v1/plot"
    14  	"gonum.org/v1/plot/plotter"
    15  	"gonum.org/v1/plot/vg"
    16  )
    17  
    18  func ExampleBarChart() {
    19  	// Create the plot values and labels.
    20  	values := plotter.Values{0.5, 10, 20, 30}
    21  	verticalLabels := []string{"A", "B", "C", "D"}
    22  	horizontalLabels := []string{"Label A", "Label B", "Label C", "Label D"}
    23  
    24  	// Create a vertical BarChart
    25  	p1 := plot.New()
    26  	verticalBarChart, err := plotter.NewBarChart(values, 0.5*vg.Centimeter)
    27  	if err != nil {
    28  		log.Panic(err)
    29  	}
    30  	p1.Add(verticalBarChart)
    31  	p1.NominalX(verticalLabels...)
    32  	err = p1.Save(100, 100, "testdata/verticalBarChart.png")
    33  	if err != nil {
    34  		log.Panic(err)
    35  	}
    36  
    37  	// Create a horizontal BarChart
    38  	p2 := plot.New()
    39  	horizontalBarChart, err := plotter.NewBarChart(values, 0.5*vg.Centimeter)
    40  	horizontalBarChart.Horizontal = true // Specify a horizontal BarChart.
    41  	if err != nil {
    42  		log.Panic(err)
    43  	}
    44  	p2.Add(horizontalBarChart)
    45  	p2.NominalY(horizontalLabels...)
    46  	err = p2.Save(100, 100, "testdata/horizontalBarChart.png")
    47  	if err != nil {
    48  		log.Panic(err)
    49  	}
    50  
    51  	// Now, make a different type of BarChart.
    52  	groupA := plotter.Values{20, 35, 30, 35, 27}
    53  	groupB := plotter.Values{25, 32, 34, 20, 25}
    54  	groupC := plotter.Values{12, 28, 15, 21, 8}
    55  	groupD := plotter.Values{30, 42, 6, 9, 12}
    56  
    57  	p := plot.New()
    58  	p.Title.Text = "Bar chart"
    59  	p.Y.Label.Text = "Heights"
    60  
    61  	w := vg.Points(8)
    62  
    63  	barsA, err := plotter.NewBarChart(groupA, w)
    64  	if err != nil {
    65  		log.Panic(err)
    66  	}
    67  	barsA.Color = color.RGBA{R: 255, A: 255}
    68  	barsA.Offset = -w / 2
    69  
    70  	barsB, err := plotter.NewBarChart(groupB, w)
    71  	if err != nil {
    72  		log.Panic(err)
    73  	}
    74  	barsB.Color = color.RGBA{R: 196, G: 196, A: 255}
    75  	barsB.Offset = w / 2
    76  
    77  	barsC, err := plotter.NewBarChart(groupC, w)
    78  	if err != nil {
    79  		log.Panic(err)
    80  	}
    81  	barsC.XMin = 6
    82  	barsC.Color = color.RGBA{B: 255, A: 255}
    83  	barsC.Offset = -w / 2
    84  
    85  	barsD, err := plotter.NewBarChart(groupD, w)
    86  	if err != nil {
    87  		log.Panic(err)
    88  	}
    89  	barsD.Color = color.RGBA{B: 255, R: 255, A: 255}
    90  	barsD.XMin = 6
    91  	barsD.Offset = w / 2
    92  
    93  	p.Add(barsA, barsB, barsC, barsD)
    94  	p.Legend.Add("A", barsA)
    95  	p.Legend.Add("B", barsB)
    96  	p.Legend.Add("C", barsC)
    97  	p.Legend.Add("D", barsD)
    98  	p.Legend.Top = true
    99  	p.NominalX("Zero", "One", "Two", "Three", "Four", "",
   100  		"Six", "Seven", "Eight", "Nine", "Ten")
   101  
   102  	p.Add(plotter.NewGlyphBoxes())
   103  	err = p.Save(300, 250, "testdata/barChart2.png")
   104  	if err != nil {
   105  		log.Panic(err)
   106  	}
   107  
   108  	// Now, make a stacked BarChart.
   109  	p = plot.New()
   110  	p.Title.Text = "Bar chart"
   111  	p.Y.Label.Text = "Heights"
   112  
   113  	w = vg.Points(15)
   114  
   115  	barsA, err = plotter.NewBarChart(groupA, w)
   116  	if err != nil {
   117  		log.Panic(err)
   118  	}
   119  	barsA.Color = color.RGBA{R: 255, A: 255}
   120  	barsA.Offset = -w / 2
   121  
   122  	barsB, err = plotter.NewBarChart(groupB, w)
   123  	if err != nil {
   124  		log.Panic(err)
   125  	}
   126  	barsB.Color = color.RGBA{R: 196, G: 196, A: 255}
   127  	barsB.StackOn(barsA)
   128  
   129  	barsC, err = plotter.NewBarChart(groupC, w)
   130  	if err != nil {
   131  		log.Panic(err)
   132  	}
   133  	barsC.Offset = w / 2
   134  	barsC.Color = color.RGBA{B: 255, A: 255}
   135  
   136  	barsD, err = plotter.NewBarChart(groupD, w)
   137  	if err != nil {
   138  		log.Panic(err)
   139  	}
   140  	barsD.StackOn(barsC)
   141  	barsD.Color = color.RGBA{B: 255, R: 255, A: 255}
   142  
   143  	p.Add(barsA, barsB, barsC, barsD)
   144  	p.Legend.Add("A", barsA)
   145  	p.Legend.Add("B", barsB)
   146  	p.Legend.Add("C", barsC)
   147  	p.Legend.Add("D", barsD)
   148  	p.Legend.Top = true
   149  	p.NominalX("Zero", "One", "Two", "Three", "Four")
   150  
   151  	p.Add(plotter.NewGlyphBoxes())
   152  	err = p.Save(250, 250, "testdata/stackedBarChart.png")
   153  	if err != nil {
   154  		log.Panic(err)
   155  	}
   156  }
   157  
   158  // This example shows a bar chart with both positive and negative values.
   159  func ExampleBarChart_positiveNegative() {
   160  	rnd := rand.New(rand.NewSource(1))
   161  
   162  	// Create random data points between -1 and 1.
   163  	const n = 6
   164  	data1 := make(plotter.Values, n)
   165  	data2 := make(plotter.Values, n)
   166  	net := make(plotter.XYs, n) // net = data1 + data2
   167  	for i := 0; i < n; i++ {
   168  		data1[i] = rnd.Float64()*2 - 1
   169  		data2[i] = rnd.Float64()*2 - 1
   170  		net[i].X = data1[i] + data2[i]
   171  		net[i].Y = float64(i)
   172  	}
   173  
   174  	// splitBySign splits an array into two arrays containing the positive and
   175  	// negative values, respectively, from the original array.
   176  	splitBySign := func(d plotter.Values) (pos, neg plotter.Values) {
   177  		pos = make(plotter.Values, len(d))
   178  		neg = make(plotter.Values, len(d))
   179  		for i, v := range d {
   180  			if v > 0 {
   181  				pos[i] = v
   182  			} else {
   183  				neg[i] = v
   184  			}
   185  		}
   186  		return
   187  	}
   188  
   189  	data1Pos, data1Neg := splitBySign(data1)
   190  	data2Pos, data2Neg := splitBySign(data2)
   191  
   192  	const barWidth = 0.3 * vg.Centimeter
   193  	pos1, err := plotter.NewBarChart(data1Pos, barWidth)
   194  	if err != nil {
   195  		log.Panic(err)
   196  	}
   197  	pos2, err := plotter.NewBarChart(data2Pos, barWidth)
   198  	if err != nil {
   199  		log.Panic(err)
   200  	}
   201  	neg1, err := plotter.NewBarChart(data1Neg, barWidth)
   202  	if err != nil {
   203  		log.Panic(err)
   204  	}
   205  	neg2, err := plotter.NewBarChart(data2Neg, barWidth)
   206  	if err != nil {
   207  		log.Panic(err)
   208  	}
   209  
   210  	netDots, err := plotter.NewScatter(net)
   211  	if err != nil {
   212  		log.Panic(err)
   213  	}
   214  	netDots.Radius = vg.Points(1.25)
   215  
   216  	pos2.StackOn(pos1) // Specify that pos2 goes on top of pos1.
   217  	neg2.StackOn(neg1) // Specify that neg2 goes on top of neg1.
   218  
   219  	color1 := color.NRGBA{R: 112, G: 22, B: 0, A: 255}
   220  	color2 := color.NRGBA{R: 91, G: 194, B: 54, A: 100}
   221  
   222  	pos1.Color, neg1.Color = color1, color1
   223  	pos2.Color, neg2.Color = color2, color2
   224  
   225  	// Specify that we want a horizontal bar chart.
   226  	pos1.Horizontal, pos2.Horizontal, neg1.Horizontal, neg2.Horizontal = true, true, true, true
   227  
   228  	// Create a line at zero.
   229  	zero, err := plotter.NewLine(plotter.XYs{{0, 0}, {0, 5}})
   230  	if err != nil {
   231  		log.Panic(err)
   232  	}
   233  
   234  	p := plot.New()
   235  	p.Add(zero, pos1, pos2, neg1, neg2, netDots)
   236  	p.NominalY("Alpha", "Bravo", "Charlie", "Echo", "Foxtrot", "Golf")
   237  
   238  	p.Legend.Add("1", pos1)
   239  	p.Legend.Add("2", pos2)
   240  	p.Legend.Add("Sum", netDots)
   241  	p.Legend.Top = true
   242  	p.Legend.ThumbnailWidth = 2 * vg.Millimeter
   243  	p.Legend.TextStyle.Font.Size = 2 * vg.Millimeter
   244  
   245  	err = p.Save(100, 100, "testdata/barChart_positiveNegative.png")
   246  	if err != nil {
   247  		log.Panic(err)
   248  	}
   249  }
   250  

View as plain text