Matplotlib - последовательно создавая фигуры одинакового размера - PullRequest
0 голосов
/ 15 мая 2018

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

Я думал, что этого будет достаточно, но, видимо, нет:

common_figsize=(6,5)

fig, ax = plt.subplots(figsize = common_figsize)
# five plots in a loop for the first figure.
# my_code()...
plt.savefig("Figure-1.pdf", transparent=True)
plt.close(fig)


fig, ax = plt.subplots(figsize = common_figsize)
# five plots in a loop for the new figure.
# my_code()...
plt.savefig("Figure-2.pdf", transparent=True)
plt.close(fig)

Если я правильно понимаю, это не совсем то, что я хочу из-за разных масштабов, возникающих при разных разрешениях yticks.

Для обоих рисунков pyplot получает один и тот же список для xticks. В данном случае это список из 50 значений, от 1 до 50.

CHUNK_COUNT = 50
x_step = CHUNK_COUNT / 10
new_xticks = list(range(x_step, CHUNK_COUNT + x_step, x_step)) + [1]
plt.xticks(new_xticks)
ax.set_xlim(left=1, right=CHUNK_COUNT)

Это создает обе фигуры с осью X, которая идет от 1 до 50. Пока все хорошо.

Однако я так и не понял, как справиться с проблемой разрешения утиков. У одной из фигур было yticks меньше, чем у другой, поэтому я переопределил ее, чтобы иметь столько тиков, сколько у другой:

# Add yticks to Figure 1.
y_divisor = 6
y_step = (100 - min_y_tick) / y_divisor
new_yticks = [min_y_tick + y_step * i for i in range(0, y_divisor + 1)]
plt.yticks(new_yticks)

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

Рисунок 1:

Figure 1 - edited to have as many yticks as Figure 2

Рисунок 2:

Figure 2 - unchanged yticks

Таким образом, я считаю, что matplotlib принимает параметр figsize, но затем перераспределяет элементы графика для соответствия разным значениям тиков и длины текста.

Возможно ли, чтобы он работал в обратном порядке? Чтобы изменить метки и повороты текста автоматически , чтобы квадраты были абсолютно одинаковой длины и высоты?

Извините, если это дубликат, и спасибо за помощь.

EDIT:

Наконец-то удалось представить минимальный, полный и проверяемый пример. Среди тестов я удалил пользовательский код yticks, и проблема все еще сохраняется:

from matplotlib.lines import Line2D
import matplotlib.ticker as mtick
import matplotlib.pyplot as plt
from matplotlib import rc
# activate latex text rendering
rc('text', usetex=True)

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

CHUNK_COUNT = 50
common_figsize=(6,5)
plot_counter = 5

x_step = int(int(CHUNK_COUNT) / 10)
new_xticks = list(range(x_step, int(CHUNK_COUNT) + x_step, x_step)) + [1]

##### Plot Figure 1
fig, ax = plt.subplots(figsize = common_figsize)

plt.ylabel("Summary of a simple YY axis")
plt.yticks(rotation=45)

ax.yaxis.set_major_formatter(mtick.PercentFormatter(is_latex=False))

for i in range(0, plot_counter):

    xvals = range(1, CHUNK_COUNT + 1)

    yvals = []
    for j in xvals:
        yvals.append(j + i)

    plt.plot(xvals, yvals)

plt.xticks(new_xticks)
ax.set_xlim(left=1, right=int(CHUNK_COUNT))

plt.savefig("Figure_1.png", transparent=True)
plt.close(fig)

##### Plot Figure 2
fig, ax = plt.subplots(figsize = common_figsize)

plt.ylabel("Summary of another YY axis")
plt.yticks(rotation=45)

ax.yaxis.set_major_formatter(mtick.PercentFormatter(is_latex=False))

for i in range(0, plot_counter):

    xvals = range(1, CHUNK_COUNT + 1)

    yvals = []
    for j in xvals:
        yvals.append((j + i) / 100)


    plt.plot(xvals, yvals)

plt.xticks(new_xticks)
ax.set_xlim(left=1, right=int(CHUNK_COUNT))

plt.savefig("Figure_2.png", transparent=True)
plt.close(fig)

1 Ответ

0 голосов
/ 16 мая 2018

Оказывается, это произошло из-за ошибки с моей стороны.Я перенес код из другого контекста, где autolayout был активен:

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

После установки значения False все квадраты фигур имели одинаковые размеры:

from matplotlib import rcParams
rcParams.update({'figure.autolayout': False})

Несмотря на различия в длине элементов ytick, теперь учитываются размеры, указанные в моем исходном вопросе.

Эти результаты были получены с помощью примера MWE, который я добавил в концемоего вопроса:

Figure 1 post-fix Figure 2 post-fix

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...