8

Suppose we read some data into a pandas data frame:

data1 = pd.read_csv("data.csv", "\t")

The content looks like this:

enter image description here

And then define a function which should give us a horizontal bar chart, where the bar lengths represent values and the bars are labelled with the keys.

def barchart(data, labels):
    pos = arange(len(data))+.5    # the bar centers on the y axis
    barh(pos, data, align='center', height=0.25)
    yticks(pos, labels)

Then we call the plot function like this:

barchart(data1["val"], data1["key"])

which gives us the following plot:

enter image description here

Now, what determines the order of the bars?

Suppose we want the bars in a special order, say [C, A, D, F, E, B], how can we enforce this?

clstaudt
  • 21,436
  • 45
  • 156
  • 239

2 Answers2

9

If you directly read the key as the index with

In [12]: df = pd.read_csv('data.csv', '\t', index_col='key')

In [13]: df
Out[13]: 
     val
key     
A    0.1
B    0.4
C    0.3
D    0.5
E    0.2

you can use ix to get the index in a different order and plot it using df.plot:

In [14]: df.ix[list('CADFEB')].plot(kind='barh')
Out[14]: <matplotlib.axes._subplots.AxesSubplot at 0x530fa90>

barh_example.png

(Note that F is not given in the data, but you gave it as an example)

bmu
  • 35,119
  • 13
  • 91
  • 108
  • **[Starting in 0.20.0, the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers.](https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#IX%20indexer%20is%20deprecated)** Instead use: `df.reindex(labels).plot(kind='barh')` – philip Mar 08 '20 at 17:03
4

I modified original version of barchart. To specify order of bars I am using index set via ii column:

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

def barchart(data, labels):
    pos = np.arange(len(data)) + 0.5  # the bar centers on the y axis
    plt.barh(pos, data.sort_index(), align='center', height=0.25)
    plt.yticks(pos, labels.sort_index())

data1 = pd.DataFrame({'key': list('ABCDE'), 'val': np.random.randn(5)})

new_keys = list('EDACB')
data1['ii'] = [new_keys.index(x) for x in data1.key]

data1 = data1.set_index('ii')
barchart(data1["val"], data1["key"])
plt.show()
lowtech
  • 2,492
  • 2
  • 22
  • 31
  • How can I automatically generate the `data['ii‘]` column from the ordered list of keys? – clstaudt Dec 13 '13 at 09:54
  • i edit the answer to show how to generate data['ii'] column. Also take a look on bmu's answer below, it is really neat. – lowtech Dec 13 '13 at 16:24