Список объектов диаграммы, но не весь график

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

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

Если я попытаюсь показать их по отдельности, используя list[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))

person johnb    schedule 22.04.2016    source источник


Ответы (1)


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

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

должен сделать свое дело для последней диаграммы.

person Felix Zumstein    schedule 23.04.2016
comment
Проблема решена, большое спасибо, Феликс. Есть идеи, почему мой неправильный метод сработал для некоторых графиков, но не для последнего? - person johnb; 23.04.2016
comment
Нет, я недостаточно знаю, как pandas и matplotlib работают вместе под капотом, но это описывает ту же ошибку. - person Felix Zumstein; 23.04.2016