Как определить порядок баров на гистограмме matplotlib

Предположим, мы читаем некоторые данные в фрейм данных pandas:

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

содержание выглядит следующим образом:

enter image description here

а затем определите функцию, которая должна дать нам горизонтальную гистограмму, где длины баров представляют значения, а бары помечены клавишами.

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)

затем мы вызываем функцию plot следующим образом:

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

что дает нам следующий заговор:

enter image description here

теперь, что определяет порядок столбцов?

Предположим, нам нужны бары в специальном порядке, скажем [C, A, D, F, E, B], как мы можем осуществить это?

2 ответов


Я изменил оригинальную версию barchart. Чтобы указать порядок баров, я использую набор индексов через столбец ii:

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()

если вы непосредственно читаете ключ как индекс с

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

можно использовать ix чтобы получить индекс в другом порядке и построить его с помощью df.plot:

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

barh_example.png

(обратите внимание, что F не указан в данных, но вы дали его в качестве примера)