Matplotlib: первый график, созданный в цикле, не сохраняется с указанным 'figsize' в rcParams - PullRequest
0 голосов
/ 13 февраля 2019

Я читал похожие проблемы с ноутбуками Jupyter, такие как: Размер рисунка Matplotlib не соблюдается

Моя функция генерирует и сохраняет графики, используя цикл for.Первый сгенерированный сюжет всегда меньше и не имеет форматирования остальных.Если я запускаю функцию дважды, проблема устранена.

Я попытался указать определенный бэкэнд: matplotlib.use ('Agg'), но это не дало никакого эффекта.

        fig, ax = plt.subplots()
        #Format xlabel and grid
        plt.xlabel('Date', weight = 'bold')
        plt.grid(alpha = 2.0)
        #Clear legend
        legendList = legendList[0:0]
        #Format data to required units and set axis label
        for i in range(len(plotData.columns)):
            plt.ylabel(splitUnits + ' ' + '[' + units + ']', weight = 'bold')
            #Plot each data column on axis
            ax = self.formatAxis(ax)
            ax.plot(plotData.iloc[:,i], formatList[i], linewidth=2, markersize=2)

            #Set Legend and remove brackets from array
            legendList.append(str(plotData.iloc[:,[i]].columns.values[-1]).lstrip('(').rstrip(')')) 

        plt.legend(loc='upper right', labels=legendList)

        #Resize graph and set resolution
        plt.rcParams['figure.figsize'] = (12, 7)        #Width and height of graph 12,7
        dpi = 250    #108 previously
        plt.rcParams['figure.dpi'] = dpi

        plt.rcParams['figure.figsize'] = (12, 7)
        #Format y-axis grid and ticks and legend format
        ax.grid(which='minor', alpha=0.4)     #...alpha controls gridline opacity
        ax.margins(y=0.85)
        ymin = ax.get_yticks()[0]
        ymax = ax.get_ylim()[-1]
        step = ax.get_yticks()[1] - ax.get_yticks()[0]
        y_minor = np.arange(ymin, ymax, step/5)
        ax.set_yticks(y_minor, minor=True)
        ax.set_ylim([ymin, ymax])

        #Import Logo, and insert in graph
        self.manageDir('working')
        im = image.imread('logo4.png')
        fig.figimage(im, 280, 1360, zorder=1)     #130, 580 represent logo placement in graph
        plt.close('all')

        fig.savefig('Plot ' + str(plotNo) + '.png', bbox_inches='tight', pad_inches=0.3)

'PlotData' - это кадр данных, в котором все значения отображаются на одной оси и затем сохраняются.Первое изображение, сохраненное в файл, похоже, использует настройки размера фигуры по умолчанию, но все остальные сохраненные графики используют указанную настройку (12, 7).Если у кого-то есть идеи или вы хотели бы получить какую-либо информацию, пожалуйста, дайте мне знать!Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019

Настройки фигуры, сохраненные в rcParams, считываются в момент вызова plt.figure() или plt.subplots().Поэтому, чтобы ваши настройки в rcParams работали правильно, вы должны переместить эти назначения в до того, как создаст ваши фигуры.Лучше всего было бы переместить все rcParams назначения в начало вашего сценария.

В качестве альтернативы, вы можете изменить размер фигуры и разрешение задним числом, используя команды fig.set_size_inches() и fig.set_dpi() соответственно.

...