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