I have stumbled accross the following snippet, for creating horizontal bar chart using matplotlib:
import matplotlib
from pylab import *
val = 3+10*rand(5) # the bar lengths
pos = arange(5)+.5 # the bar centers on the y axis
print pos
figure(1)
barh(pos,val, align='center')
yticks(pos, ('Tom', 'Dick', 'Harry', 'Slim', 'Jim'))
xlabel('Performance')
title('horizontal bar chart using matplotlib')
grid(True)
show()
I want to modify the above script as follows:
any help (code snippet or links) to help me make the above modifications would be very helpful.
as an aside, if I wanted to make stacked horizontal bars (say each label had 3 stacked horizontal bars), how would I modify the code above to do plot a 3 stacked horizontal bar plot?
[[Edit]]
Could someone post two short code snippet that shows how to:
Print labels on the opposite side of the horizontal bars (so that for example, the label for 'negative' bars appears in the 1st quarant, and the labels for 'positive' bars appears in the 2nd quadrant
Plot multiple (say 2 or 3) horizontal bars (instead of just one). Good examples are the first two images shown here
import matplotlib
from pylab import *
val = 3-6*rand(5) # the bar lengths # changed your data slightly
pos = arange(5)+.5 # the bar centers on the y axis
print pos
figure(1)
barh(pos,val, align='center',height=0.1) # notice the 'height' argument
yticks(pos, ('Tom', 'Dick', 'Harry', 'Slim', 'Jim'))
gca().axvline(0,color='k',lw=3) # poor man's zero level
xlabel('Performance')
title('horizontal bar chart using matplotlib')
grid(True)
show()
In general, I'd suggest not using from pyplot import *
. Unless you're in the interactive mode, use the object-oriented approach:
import matplotlib.pyplot as plt
from numpy.random import rand
from numpy import arange
val = 3-6*rand(5) # the bar lengths
pos = arange(5)+.5 # the bar centers on the y axis
print pos
fig = plt.figure()
ax = fig.add_subplot(111)
ax.barh(pos,val, align='center',height=0.1)
ax.set_yticks(pos, ('Tom', 'Dick', 'Harry', 'Slim', 'Jim'))
ax.axvline(0,color='k',lw=3) # poor man's zero level
ax.set_xlabel('Performance')
ax.set_title('horizontal bar chart using matplotlib')
ax.grid(True)
plt.show()
A good starting point for various sorts of plots is the matplotlib
gallery
As said by Zhenya, you will have to tweek your plot.
As an example, below is a function which produces a customize horizontal bar plot:
By default, it will plot the name of the categories (people) to the right, but you can of course change that.
import numpy as np
import matplotlib.pyplot as plt
# creation of the data
name_list = ['day1', 'day2', 'day3', 'day4']
data = {name: 3+10*np.random.rand(5) for name in name_list}
colors_list = ['0.5', 'r', 'b', 'g'] #optional
def customize_barh(data, width_bar=1, width_space=0.5, colors=None):
n_measure = len(data) #number of measure per people
n_people = data[data.keys()[0]].size # number of people
#some calculation to determine the position of Y ticks labels
total_space = n_people*(n_measure*width_bar)+(n_people-1)*width_space
ind_space = n_measure*width_bar
step = ind_space/2.
pos = np.arange(step, total_space+width_space, ind_space+width_space)
# create the figure and the axes to plot the data
fig = plt.figure(figsize=(8,6))
ax = fig.add_axes([0.15, 0.15, 0.65, 0.7])
# remove top and right spines and turn ticks off if no spine
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('right') # ticks position on the right
# postition of tick out
ax.tick_params(axis='both', direction='out', width=3, length=6,
labelsize=24, pad=8)
ax.spines['left'].set_linewidth(3)
ax.spines['bottom'].set_linewidth(3)
# plot the data
for i,day in enumerate(data.keys()):
if colors == None:
ax.barh(pos-step+i*width_bar, data[day], width_bar, #facecolor='0.4',
edgecolor='k', linewidth=3)
else:
ax.barh(pos-step+i*width_bar, data[day], width_bar, facecolor=colors[i],
edgecolor='k', linewidth=3)
ax.set_yticks(pos)
# you may want to use the list of name as argument of the function to be more
# flexible (if you have to add a people)
ax.set_yticklabels(('Tom', 'Dick', 'Harry', 'Slim', 'Jim'))
ax.set_ylim((-width_space, total_space+width_space))
ax.set_xlabel('Performance', size=26, labelpad=10)
customize_barh(data, colors=colors_list)
plt.savefig('perf.png')
plt.show()
which produces:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With