2016-04-22 3 views
0

Я пытаюсь собрать серию диаграмм в списке, а затем вывести их все за один проход в Excel.Список объектов диаграммы, но не весь график

В списке показаны все диаграммы как «matplotlib.figure.Figure at (пример) 0xb8eae80», но не отображает их все. Все они отображаются на консоли iPython (в Spyder), когда запущена прога.

Если я попытаюсь показать их индивидуально, используя список [i] в ​​iPython, некоторые диаграммы показывают, но некоторые из них не видны (одни и те же диаграммы отсутствуют).

Для вывода в Excel «отсутствующие» диаграммы имеют пустой холст с размером по умолчанию, поэтому, хотя XL получает некоторую информацию о существовании диаграммы, он даже не получает информацию «figsize».

Отсутствующий диаграмма в примере коде ниже для диаграммы с множественными линейными графиками (его быстрым примера, я понимаю, что это может быть сценарий лучше)

Спасибо за любую помощь.

Пример кода (который имеет такую ​​же проблему, как мой исходный код):

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


ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 
xdf = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD')) # splits out list into components 
xdf = xdf.cumsum() 

figlist = [] # set up list to collect charts (a list of objects) 

fig = plt.figure() 
xdf.A.plot(figsize = (9,5), grid=True) #plots individual column 
plt.axhline(0,lw=2, color = "black") 
plt.title('A') 
figlist.append(fig) 

fig = plt.figure() 
xdf.B.plot(figsize = (9,5), grid=True) #plots individual column 
plt.axhline(0,lw=2, color = "black") 
plt.title('B') 
figlist.append(fig) 

fig = plt.figure() 
xdf.C.plot(figsize = (9,5), grid=True) #plots individual column 
plt.axhline(0,lw=2, color = "black") 
plt.title('C') 
figlist.append(fig) 

fig = plt.figure() 
xdf.D.plot(figsize = (9,5), grid=True) #plots individual column 
plt.axhline(0,lw=2, color = "black") 
plt.title('D') 
figlist.append(fig) 

fig = plt.figure() 
xdf.plot(figsize = (9,5), grid=True) #plots all columns on same chart 
plt.axhline(0,lw=2, color = "black") 
plt.title('All') 
figlist.append(fig) 

# output all charts to XL 
xw.Workbook() # open new workbook 

for i in range(len(figlist)): 
    plotno = 'Plot' + str(i) 
    plot = xw.Plot(figlist[i]) 
    plot.show(plotno, left=30, top=(i*500+20)) 

ответ

0

Вы не обращаетесь к объекту фигурное правильно для участков, генерируемых панд, из docs:

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) 
ax = df.plot(kind='bar') 
fig = ax.get_figure() 

в вашем случае, что-то вроде

ax = xdf.plot(figsize = (9,5), grid=True) #plots all columns on same chart 
plt.axhline(0,lw=2, color = "black") 
plt.title('All') 
figlist.append(ax.get_figure()) 

должен сделать трюк для последний график.

+0

Проблема решена, большое спасибо Феликс. Любая идея, почему мой неправильный метод работал для некоторых диаграмм, но не последний? – johnb

+0

Нет, я не знаю, как панды и matplotlib работают вместе под капотом, но [это] (http://stackoverflow.com/questions/19555525/saving-plots-axessubplot-generated-from-python-pandas -with-matplotlibs-savefi) описывает ту же ошибку. –