Fanning Software Consulting

Creating a Bar Plot

QUESTION: I've been trying to use the Bar_Plot routine in IDL, but it seems even older than most of the IDL routines. Do you have something similar for producing bar plots in the Coyote Graphics library?

ANSWER: Yes, indeed. You can use the cgBarPlot program from the Coyote Library to produce a bar plot in IDL. Keywords to the program allow you to produce various kinds of bar plots. To illustrate, let's create some data to display.

   seed = -5L
   data1 = RandomU(seed, 5) * 10.0
   data2 = RandomU(seed, 5) * 7.5
   data3 = RandomU(seed, 5) * 7.5
   data4 = RandomU(seed, 5) * 10.0

Simple individual bar plots can be created either using the colors in the current color table, or by specifying the bar colors yourself.

   cgDisplay, 750, 375, WID=3
   !P.Multi = [0,2,1]
   labels = ['Exp 1', 'Exp 2', 'Exp 3', 'Exp 4', 'Exp 5']
   cgLoadct, 33, Clip=[10,245]
   cgBarPlot, data1, BarNames=labels
   colors = ['cornflower blue','sea green','orange red','goldenrod','dark orchid']
   cgBarPlot, data2, BarNames=labels, Colors=colors
   !P.Multi = 0

You see the result in the figure below.

Bar colors can be chosen directly or by loading a color table.
Bar colors can be chosen directly or by loading a color table.
 

More complicated bar plots can be produced, too. The first plot we create is just a plot with all four data sets displayed.

   cgDisplay, 650, 450, WID=0
   !P.Multi = [0,2,2]
   cgBarPlot, data1, YRange=[0,12], Colors='red', XTitle='Class 1'
   cgBarPlot, data2, YRange=[0,12], Colors='blue', XTitle='Class 2'
   cgBarPlot, data3, YRange=[0,12], Colors='gold', XTitle='Class 3'
   cgBarPlot, data4, YRange=[0,12], Colors='dark green', XTitle='Class 4'
   !P.Multi = 0

You see the result in the figure below.

The four data sets displayed as 
           individual bar plots.
The four data sets displayed as individual bar plots.
 

Next, we make a stacked bar plot, in which the four data sets are stacked on top of each other. The legend is placed on the plot using the NASA Astronomy Library routine, AL_Legend.

   cgDisplay, 650, 450, WID=1
   labels = ['Exp 1', 'Exp 2', 'Exp 3', 'Exp 4', 'Exp 5']
   cgBarPlot, data1, YRange=[0,35], Colors='red', BarNames=labels
   cgBarPlot, data2, Colors='blue', /Overplot, BaseLines=data1
   cgBarPlot, data3, Colors='gold', /Overplot, BaseLines=data1+data2
   cgBarPlot, data4, Colors='dark green', /Overplot, BaseLines=data1+data2+data3
   items = ['Class 1', 'Class 2', 'Class 3', 'Class 4']
   colors = ['red', 'blue', 'gold', 'dark green']
   AL_Legend, items, Colors=colors, PSym=Replicate(15,4), SymSize=Replicate(1.75,4), $
       Charsize=cgDefCharsize(), Position=[0.20, 0.92], /Normal
 

You see the results in the figure below.

The four data sets displayed as a
           stacked bar plot.
The four data sets displayed as a stacked bar plot.
 

We can also see the four data sets displayed side by side in a bar plot.

   cgDisplay, 650, 450, WID=2
   cgBarPlot, data1, YRange=[0,12], Colors='red', BaseRange=0.2, BarOffset=2.5
   cgBarPlot, data2, Colors='blue', /Overplot, BaseRange=0.2, BarOffset=9.5
   cgBarPlot, data3, Colors='gold', /Overplot, BaseRange=0.2, BarOffset=17.0
   cgBarPlot, data4, Colors='dark green', /Overplot, BaseRange=0.2, BarOffset=24.5
   items = ['Class 1', 'Class 2', 'Class 3', 'Class 4']
   colors = ['red', 'blue', 'gold', 'dark green']
   AL_Legend, items, Colors=colors, PSym=Replicate(15,4), SymSize=Replicate(1.75,4), $
       Charsize=cgDefCharsize(), Position=[0.45, 0.92], /Normal
 

You see the results in the figure below.

The four data sets displayed side-by-side.
The four data sets displayed side-by-side.
 

Finally, we can see each "experiment" displayed side-by-side in the bar plot.

   cgDisplay, WID=3
   barnames = ['Exp 1', 'Exp 2', 'Exp 3', 'Exp 4', 'Exp 5']
   cgBarPlot, data1, YRange=[0, 12], BarOffset=1.25, BarSpace= 0.8, BarWidth=0.175, Colors='red'
   cgBarplot, data2, /Overplot, BarOffset=2.25, BarSpace= 0.8, BarWidth=0.175, Colors='blue', BARNAMES=barnames
   cgBarplot, data3, /Overplot, BarOffset=3.25, BarSpace= 0.8, BarWidth=0.175, Colors='gold'
   cgBarplot, data4, /Overplot, BarOffset=4.25, BarSpace= 0.8, BarWidth=0.175, Colors='dark green'
   colors = ['red', 'blue', 'gold', 'dark green']
   items = ['Class 1', 'Class 2', 'Class 3', 'Class 4']
   Al_Legend, items, /Fill, PSym=Replicate(15,4), Colors=colors, SymSize=Replicate(1.75,4), $
      Position=[0.20, 0.92], /Normal, Charsize=cgDefCharSize()
The four data sets displayed side-by-side by experiment.
The four data sets displayed side-by-side by experiment.
 

It is easy to add error bars to the bar plot. To do so, you need to get the locations of the bars from the program itself. This is done with the BarCoords keyword, like this. You use the Coyote Graphics routine cgPlot to add the error bars.

   data = RandomU(-45L, 5) * 10.0
   labels = ['Exp 1', 'Exp 2', 'Exp 3', 'Exp 4', 'Exp 5']
   cgLoadct, 33, Clip=[10,245]
   colors = ['cornflower blue','sea green','orange red','goldenrod','dark orchid']
   cgBarPlot, data, BarNames=labels, Colors=colors, BarCoords=xlocs
   lowErrs = RandomU(seed, 5)*0.75
   highErrs = RandomU(seed, 5)*0.5
   cgPlot, xlocs, data, Err_YLow=lowErrs, Err_YHigh=highErrs, /NoData, /Overplot, $
       Err_Color='charcoal', Err_Thick=2

You see the results in the figure below.

A bar plot with error bars.
A bar plot with error bars added with cgPlot.
 

Because BarCoords is an output keyword, and you can't return output keywords in general from cgWindow, if you want to display a bar plot with error bars in a resizeable graphics window, you have to get the location information first. The code would look like this.

   data = RandomU(seed, 5) * 10.0
   labels = ['Exp 1', 'Exp 2', 'Exp 3', 'Exp 4', 'Exp 5']
   cgLoadct, 33, Clip=[10,245]
   colors = ['cornflower blue','sea green','orange red','goldenrod','dark orchid']
   cgDisplay, /Pixmap
   cgBarPlot, data, BarNames=labels, Colors=colors, BarCoords=xlocs
   wDelete, !D.Window
   lowErrs = RandomU(seed, 5)*1.5
   highErrs = RandomU(seed, 5)*1.5
   cgBarPlot, data, BarNames=labels, Colors=colors, /Window
   cgPlot, xlocs, data, Err_YLow=lowErrs, Err_YHigh=highErrs, /NoData, /Overplot, $
       Err_Color='charcoal', Err_Thick=2, /AddCmd

Version of IDL used to prepare this article: IDL 8.1.

Written: 4 October 2011
Updated: 16 December 2013