Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to plot multiple horizontal bars in one chart with matplotlib

Can you help me figure out how to draw this kind of plot with matplotlib?

I have a pandas data frame object representing the table:

Graph       n           m
<string>    <int>      <int>

I want to visualize the size of n and m for each Graph: A horizontal bar chart where for each row, there is a label containing the Graph name to the left of the y-axis; to the right of the y-axis, there are two thin horizontal bars directly below each other, whose length represents n and m. It should be clear to see that both thin bars belong to the row labelled with the graph name.

This is the code I have written so far:

fig = plt.figure()
ax = gca()
ax.set_xscale("log")
labels = graphInfo["Graph"]
nData = graphInfo["n"]
mData = graphInfo["m"]

xlocations = range(len(mData))
barh(xlocations, mData)
barh(xlocations, nData)

title("Graphs")
gca().get_xaxis().tick_bottom()
gca().get_yaxis().tick_left()

plt.show()
like image 648
clstaudt Avatar asked Mar 04 '13 12:03

clstaudt


2 Answers

It sounds like you want something very similar to this example: http://matplotlib.org/examples/api/barchart_demo.html

As a start:

import pandas
import matplotlib.pyplot as plt
import numpy as np

df = pandas.DataFrame(dict(graph=['Item one', 'Item two', 'Item three'],
                           n=[3, 5, 2], m=[6, 1, 3])) 

ind = np.arange(len(df))
width = 0.4

fig, ax = plt.subplots()
ax.barh(ind, df.n, width, color='red', label='N')
ax.barh(ind + width, df.m, width, color='green', label='M')

ax.set(yticks=ind + width, yticklabels=df.graph, ylim=[2*width - 1, len(df)])
ax.legend()

plt.show()

enter image description here

like image 67
Joe Kington Avatar answered Sep 19 '22 13:09

Joe Kington


The question and answers are a bit old now. Based on the documentation this is much simpler now.

>>> speed = [0.1, 17.5, 40, 48, 52, 69, 88]
>>> lifespan = [2, 8, 70, 1.5, 25, 12, 28]
>>> index = ['snail', 'pig', 'elephant',
...          'rabbit', 'giraffe', 'coyote', 'horse']
>>> df = pd.DataFrame({'speed': speed,
...                    'lifespan': lifespan}, index=index)
>>> ax = df.plot.barh()

enter image description here

like image 42
Taras Alenin Avatar answered Sep 21 '22 13:09

Taras Alenin