matplotlib savefig() управление размером
Я написал функцию, которая взяла dataframe, созданную из Pandas, и создала тепловую карту:
def drawHeatMap(df, city, province, collector, classtype, color, titleposy):
try:
thePlot = pl.matshow(df.values, cmap='PuBuGn')
pl.colorbar(thePlot, orientation='vertical')
aTitle = (classtype + ' Composition Changes Over Time in ' + city +
', ' + province + '\n' + collector + ' collector. ' + 'rs100')
pl.title(aTitle, x=0.5, y=titleposy, style='oblique', weight='bold')
pl.xlabel('Collection Time')
pl.xticks(range(len(df.columns)), df.columns, rotation=90)
pl.yticks(range(len(df.index)), df.index)
fileName = (classtype + '-' + city + '-'
+ province + '-' + collector + '.png')
pl.savefig(fileName)
except ZeroDivisionError:
errorMessage = ('No Data Avaiable for ' + city + ', ' + province +
' with ' + collector + ' collector.')
print errorMessage
Проблема, с которой я savefig()
, заключается в том, что savefig()
сохранит цифры с осью и savefig()
графикой. Мне нужно использовать show()
, максимизировать график и вручную сохранить фигуру с помощью кнопки GUI.
Как я могу исправить свою функцию, поэтому savefig()
сохранит графики правильно? Я попытался поставить строку, подобную этой, прежде чем pl.savefig()
будет контролировать мою фигуру:
pl.figure(figsize=....)
но в итоге я создаю несколько пустых графов. Каков правильный способ написать функцию matplotlib, которая дает мне полный контроль над сохранением фигуры?
Обновлено с примером ошибки : ![enter image description here]()
Ответы
Ответ 1
Я добавил plt.tight_layout()
перед savefig()
, и он решил проблему обрезки, которую я имел. Возможно, это поможет и вам.
EDIT: Я также установил размер фигуры в начале rcParams['figure.figsize'] = 40, 12
(вы можете установить свою собственную ширину и высоту)
Ответ 2
Из документации вы можете добавить аргумент dpi
для установки разрешения.
savefig('foo.png', dpi=199)
Ответ 3
Короткий:
Вам просто нужно вызвать pl.figure(figsize=...)
прежде чем вы pl.colorbar
(и все остальные вещи)
Объяснение:
pl.figure
создает новую фигуру (с заданным размером), на которой все методы pl.*
будут действовать следующим образом.
Таким образом, pl.savefig
просто сохраняет последний созданный рисунок, который пуст, если вы создали новый в предыдущей строке.
Ответ 4
Команда pl.figure()
создает новую фигуру matplotlib. Размер фигуры задается при создании экземпляра. Вы хотите установить размер фигуры, но у вас уже есть фигура. Таким образом, вы были на правильном пути, но попробуйте это вместо этого:
def drawHeatMap(df, city, province, collector, classtype, color, titleposy):
try:
fig = pl.figure(figsize=(....))
ax = fig.add_subplot(111)
ax.matshow(df.values, cmap='PuBuGn')
pl.colorbar()
aTitle = classtype + ' Composition Changes Over Time in ' + city + ', ' + province + '\n' + collector + ' collector. ' + 'rs100'
ax.set_title(aTitle, x=0.5, y=titleposy, style='oblique', weight='bold')
ax.set_xlabel('Collection Time')
ax.set_xticks(range(len(df.columns)), df.columns, rotation=90)
ax.set_yticks(range(len(df.index)), df.index)
fileName = classtype + '-' + city + '-' + province + '-' + collector + '.png'
fig.savefig(fileName)
except ZeroDivisionError:
errorMessage = 'No Data Available for ' + city + ', ' + province + ' with ' + collector + ' collector.'
print errorMessage
Ответ 5
перед звонком pl.savefig(fileName)
делать plt.tight_layout()