2013-05-13 2 views
3

Я хочу создать гистограмму двух серий (например, «A» и «B»), содержащуюся в кадре данных Pandas. Если бы я хотел только построить их с помощью другой оси у, я могу использовать secondary_y:Как создать гистограмму с secondary_y из dataframe

df = pd.DataFrame(np.random.uniform(size=10).reshape(5,2),columns=['A','B']) 
df['A'] = df['A'] * 100 
df.plot(secondary_y=['A']) 

, но если я хочу создать гистограммы, эквивалент команда игнорируется (он не ставит различные шкалы на оси у), так что стержни из «А» настолько велики, что стержни из «B» не могут быть выделены:

df.plot(kind='bar',secondary_y=['A']) 

Как я могу сделать это в панд непосредственно? или как бы вы создали такой график?

Я использую pandas 0.10.1 и matplotlib version 1.2.1.

+0

Что вы подразумеваете под эквивалентной командой, не работает? У вас нет фигуры, или цифра не то, что вы ожидаете? –

+0

, пожалуйста, сообщите об ошибке или опишите, что не работает –

+0

Что вы пытались реализовать это вручную? Вы посмотрели [галерею] (http://matplotlib.org/gallery.html)? – tacaswell

ответ

5

Не думайте, что графическое изображение pandas поддерживает это. Возможно, какой-то ручной код Matplotlib .. вы можете настроить его дальше

import pylab as pl 
fig = pl.figure() 
ax1 = pl.subplot(111,ylabel='A') 
#ax2 = gcf().add_axes(ax1.get_position(), sharex=ax1, frameon=False, ylabel='axes2') 
ax2 =ax1.twinx() 
ax2.set_ylabel('B') 
ax1.bar(df.index,df.A.values, width =0.4, color ='g', align = 'center') 
ax2.bar(df.index,df.B.values, width = 0.4, color='r', align = 'edge') 
ax1.legend(['A'], loc = 'upper left') 
ax2.legend(['B'], loc = 'upper right') 
fig.show() 

enter image description here

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

0

Хорошо, у меня была такая же проблема в последнее время, и даже если это старый вопрос, я думаю, что могу дать ответ на эту проблему, если кто-то потеряет рассудок с этим. Joop дал основания для этого, и это легко, когда у вас есть (например) два столбца в вашем фреймворке данных, но это становится действительно неприятным, когда у вас есть другое количество столбцов для двух осей, из-за того, что вам нужно сыграть с аргументом позиции функции pandas plot(). В моем Exemple я использую Сиборн но optionnal:

import pandas as pd 
import seaborn as sns 
import pylab as plt 
import numpy as np 

df1 = pd.DataFrame(np.array([[i*99 for i in range(11)]]).transpose(), columns = ["100"], index = [i for i in range(11)]) 
df2 = pd.DataFrame(np.array([[i for i in range(11)], [i*2 for i in range(11)]]).transpose(), columns = ["1", "2"], index = [i for i in range(11)]) 

fig, ax = plt.subplots() 
ax2 = ax.twinx() 

# we must define the length of each column. 
df1_len = len(df1.columns.values) 
df2_len = len(df2.columns.values) 
column_width = 0.8/(df1_len + df2_len) 

# we calculate the position of each column in the plot. This value is based on the position definition : 
# Specify relative alignments for bar plot layout. From 0 (left/bottom-end) to 1 (right/top-end). Default is 0.5 (center) 
# http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.plot.html 
df1_posi = 0.5 + (df2_len/float(df1_len)) * 0.5 
df2_posi = 0.5 - (df1_len/float(df2_len)) * 0.5 

# In order to have nice color, I use the default color palette of seaborn 
df1.plot(kind='bar', ax=ax, width=column_width*df1_len, color=sns.color_palette()[:df1_len], position=df1_posi) 
df2.plot(kind='bar', ax=ax2, width=column_width*df2_len, color=sns.color_palette()[df1_len:df1_len+df2_len], position=df2_posi) 

ax.legend(loc="upper left") 

# Pandas add line at x = 0 for each dataframe. 
ax.lines[0].set_visible(False) 
ax2.lines[0].set_visible(False) 

# Specific to seaborn, we have to remove the background line 
ax2.grid(b=False, axis='both') 

# We need to add some space, the xlim don't manage the new positions 
column_length = (ax2.get_xlim()[1] - abs(ax2.get_xlim()[0]))/float(len(df1.index)) 
ax2.set_xlim([ax2.get_xlim()[0] - column_length, ax2.get_xlim()[1] + column_length]) 

fig.patch.set_facecolor('white') 
plt.show() 

И результат: http://i.stack.imgur.com/LZjK8.png

Я не проверял все возможности, но, похоже, она отлично работает независимо от числа столбцов в каждой dataframe вы используете ,

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