2015-06-05 4 views
1

У меня есть (5) серия pandas, я пытаюсь построить график (5). я хочу иметь их так, чтобы они выглядели, как этот формат с 5-диаграмме на последнем ряду сам по себе, в центре (не фокусируются на содержание диаграмм, просто позиционирование) enter image description hereMatplotlib subplot2grid plotting IndexError in pandas 0.16.1

Но в панд 0,16 .1, я получаю индексную ошибку на 5-й диаграмме. Вот пример MCVE моей проблемы, который вы, ребята, можете скопировать и вставить и попробовать сами.

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib 
matplotlib.style.use('ggplot') 

fig = plt.figure() 

firstperiod = pd.Series({1:1, 2:2, 3:3, 4:3, 5:4}) 
secondperiod = pd.Series({1:1, 2:1, 3:2, 4:2}) 
thirdperiod = pd.Series({1:4, 2:4, 3:5, 4:1, 5:1, 6:3}) 
fourthperiod = pd.Series({1:3, 2:3, 3:1, 4:6, 5:7, 6:5}) 
fifthperiod = pd.Series({1:2, 2:2, 3:1, 4:5, 5:5}) 

ax1 = plt.subplot2grid((6,4), [0,0], 2, 2) 
firstperiod.plot(kind='hist', bins=5) 

ax2 = plt.subplot2grid((6,4), [0,2], 2, 2) 
secondperiod.plot(kind='hist', bins=4) 

ax3 = plt.subplot2grid((6,4), [2,1], 2, 2) 
thirdperiod.plot(kind="hist", bins=6) 

ax4 = plt.subplot2grid((6,4), [2,2], 2, 2) 
fourthperiod.plot(kind="hist", bins=6) 

ax5 = plt.subplot2grid((6,4), [4,1], 2, 2) 
fifthperiod.plot(kind="hist", bins=5) 

plt.tight_layout() 
plt.show() 

Он не выполняет до последнего (5) график, а затем это выскакивает:

IndexError: index 4 is out of bounds for axis 0 with size 4

Что это дает? и как это исправить?

спасибо заранее, ребята, оцените.

ответ

2

Это то, что вы после ... Я добавил plt.ion(), чтобы привести его в интерактивный режим, и plt.draw(), чтобы добавить каждую фигуру, как вы ее определяете.

Делая это становится очевидным, что ось определяется как (y,x) не (x,y) ...

This reference также может помочь в будущем

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib 
matplotlib.style.use('ggplot') 

plt.ion() 
fig = plt.figure() 

firstperiod = pd.Series({1:1, 2:2, 3:3, 4:3, 5:4}) 
secondperiod = pd.Series({1:1, 2:1, 3:2, 4:2}) 
thirdperiod = pd.Series({1:4, 2:4, 3:5, 4:1, 5:1, 6:3}) 
fourthperiod = pd.Series({1:3, 2:3, 3:1, 4:6, 5:7, 6:5}) 
fifthperiod = pd.Series({1:2, 2:2, 3:1, 4:5, 5:5}) 

ax1 = plt.subplot2grid((3,4), (0,0), colspan=2) 
firstperiod.plot(kind='hist', bins=5) 
plt.draw() 
raw_input() 

ax2 = plt.subplot2grid((3,4), (0,2), colspan=2) 
secondperiod.plot(kind='hist', bins=4) 
plt.draw() 
raw_input() 

ax3 = plt.subplot2grid((3,4), (1,0), colspan=2) 
thirdperiod.plot(kind="hist", bins=6) 
plt.draw() 
raw_input() 

ax4 = plt.subplot2grid((3,4), (1,2), colspan=2) 
fourthperiod.plot(kind="hist", bins=6) 
plt.draw() 
raw_input() 

ax5 = plt.subplot2grid((3,4), (2,1), colspan=2) 
fifthperiod.plot(kind="hist", bins=5) 
plt.draw() 
raw_input() 

plt.tight_layout() 
plt.draw() 

Я изменил высоту колонки от 6 до 3, потому что график, который вы показали выше, имел colspan как в два раза rowspan

+0

это работает для вас? это ничего не замышляет для меня - и строка 'plt.tight_layout' дает мне такую ​​ошибку: ' ValueError: max() arg - пустая последовательность' – SpicyClubSauce

+0

, ближайший я получил вашу версию на работу, вынимая 'plt.tight_layout', а затем добавить' plt.ioff() 'и ' plt.show() 'в конце кода. Можете ли вы дважды проверить свои права и посоветовать иначе? Я также обнаружил, что в этом случае я получаю тот же результат без 'plt.draw()' и 'raw_input()' - @alexmcf – SpicyClubSauce

+0

Хорошо, я переместил 'plt.tight_layout()' вверх до самого начала Я отправил свой ответ - не понял, что это испортит сюжет! посмотрите мою измененную версию, где я делаю 'plt.tight_layout()' в конце, а не ... Для вашей окончательной версии удалите все 'plt.draw()', 'raw_input()', 'plt.ion() 'и добавьте' plt.show() 'в конце. Последнее просто для того, чтобы подтвердить, что сюжет работает правильно ... –