Hello to all
I've discovered Numpy and Matplotlib two weeks ago and I'm trying to free myself to the slavery of Matlab (TM) and I'm converting all my small sotware about chemometrics in python (and I will be happy to release them soon to the community)
I've searched a bit in the mailing list archive but not found anything about this topic.
I have to make a plot with errorbars (I take two vectors from previous calculation). I thuoght it was an esay task... but.. let's see what happened
first try withous error bars
#!/usr/bin/env python
# a stacked bar plot with errorbars
from pylab import *
#womenMeans = (25, 32, 34, 20, 25)
#womenStd = (2, 3, 4, 1, 2)
#womenStd = (3.1, 5.1, 2.3, 3.5, 3.4)
############### it works
##N=5
##menMeans = array([[20], [35], [30], [35], [27]])
##ind = arange(N) # the x locations for the groups
##width = 0.35 # the width of the bars: can also be len(x) sequence
##p1 = bar(ind, womenMeans, width, color='r', )
and it worked !!!
simple plot with error (but this time with sequences..)
################ it works
##womenStd = (3.1, 5.1, 2.3, 3.5, 3.4)
##N=5
##menMeans = (20, 35, 30, 35, 27)
##ind = arange(N) # the x locations for the groups
##width = 0.35 # the width of the bars: can also be len(x) sequence
##p1 = bar(ind, womenMeans, width, color='r', yerr=womenStd)
it works... so I thought.. I will add error bars and be ok ...BUT....
############## it doesnt'works
##womenStd = array([[3.1], [5.1], [2.3], [3.5], [3.4]])
##N=5
##womenMeans = array([[20], [35], [30], [35], [27]])
##ind = arange(N) # the x locations for the groups
##width = 0.35 # the width of the bars: can also be len(x) sequence
##p1 = bar(ind, womenMeans, width, color='r', yerr=womenStd)
##Traceback (most recent call last):
## File "C:\Python25\Lib\site-packages\matplotlib\examples\bar_stacked.py", line 34, in -toplevel-
## p1 = bar(ind, menMeans, width, color='r', yerr=womenStd)
## File "C:\Python24\Lib\site-packages\matplotlib\pylab.py", line 1651, in bar
## ret = gca().bar(*args, **kwargs)
## File "C:\Python24\Lib\site-packages\matplotlib\axes.py", line 2572, in bar
## fmt=None, ecolor=ecolor, capsize=capsize)
## File "C:\Python24\Lib\site-packages\matplotlib\axes.py", line 2904, in errorbar
## barlines.extend( self.vlines(x, y, upper, label='_nolegend_' ) )
## File "C:\Python24\Lib\site-packages\matplotlib\axes.py", line 2032, in vlines
## color=color, linestyle=linestyle, marker=marker,
## File "C:\Python24\Lib\site-packages\matplotlib\lines.py", line 206, in __init__
## self.set_data(xdata, ydata)
## File "C:\Python24\Lib\site-packages\matplotlib\lines.py", line 269, in set_data
## raise RuntimeError('xdata and ydata must be the same length')
##RuntimeError: xdata and ydata must be the same length
···
#############
What's the matter ???
After spending an hour searching what a tuple, and a sequence is… I've solved the problem in this way…
womenStd = array([[3.1], [5.1], [2.3], [3.5], [3.4]])
womenStdFlatten=womenStd.flatten()
womenStdTuple=tuple(womenStdFlatten)
N=5
womenMeans = array([[20], [35], [30], [35], [27]])
womenFlatten=womenMeans.flatten()
womenTuple=tuple(womenFlatten)
ind = arange(N) # the x locations for the groups
width = 0.35 # the width of the bars: can also be len(x) sequence
p1 = bar(ind, womenTuple, width, color='r', yerr=womenStdTuple)
ylabel('Scores')
title('Scores by group and gender')
#xticks(ind+width/2., ('G1', 'G2', 'G3', 'G4', 'G5') )
#yticks(arange(0,81,10))
#legend( (p1[0], p2[0]), ('Men', 'Women') )
show()
Does anyone know if this is the only solution to get it work ???
I hope to have helped someone with the same problem like me and also curious to know if there is any other solution
Used python 2.4 scypy 1.0 , and the last version of numpy and matplotlib avaible for them
Cheers
Giorgio