2013-12-12 4 views
6

Предположим, что мы читаем некоторые данные в кадре панды данных:Как определить порядок баров в Matplotlib гистограмме

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) 

Затем мы вызываем функцию участка, как это:

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

, который дает нам следующий сюжет:

enter image description here

Теперь, что определяет порядок баров?

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

+2

просто переупорядочите свой ввод. – tacaswell

+0

@tcaswell Как изменить порядок ввода по списку '[C, A, D, F, E, B]'? – clstaudt

+0

@cls 'barchart (данные [['C', 'A', 'D', 'F', 'E', 'B']], метки)' –

ответ

2

I модифицировано оригинальный версия 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() 
+0

Как я могу автоматически генерировать столбец 'data ['ii']' из упорядоченный список ключей? – clstaudt

+0

Я редактирую ответ, чтобы показать, как генерировать данные ['ii']. Также взгляните на ответ bmu ниже, это действительно аккуратно. – lowtech

7

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

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, чтобы получить индекс в другом порядке и построить ее с помощью :

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

barh_example.png

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

+1

+1 Я не знал, что DataFrame.plot это гибкий, спасибо – lowtech

Смежные вопросы