Как заставить узкие ограничительные рамки уважать невидимого художника? - PullRequest
1 голос
/ 29 апреля 2019

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

Мой подход к этому таков:

from matplotlib import pyplot as plt

plt.plot([0,1])
title = plt.title("my invisible title")
title.set_visible(False)
plt.savefig(
        "invisible_artist.png",
        bbox_inches="tight", pad_inches=0,
        bbox_extra_artists=[title],
        facecolor="grey", # just to visualise the bbox
    )

Это производит:

output of above script

Для сравнения, здесь вывод с видимым заголовком, что я и ожидал в этом случае:

output with visible title

Очевидно, что когда заголовок сделан невидимым, для него не остается свободного места, в то время как дополнительное пространство добавляется в других направлениях.

Почему это происходит и как я могу достичь желаемого результата, т.е. иметь одинаковые ограничивающие рамки в обоих случаях?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

Невидимые художники не учитываются при жестких расчетах bbox.Некоторым обходным решением может быть сделать заголовок прозрачным,

title.set_alpha(0)

или использовать пробел в качестве заголовка

plt.title(" ")

В более общем случае вы, конечно, можете получить ограничивающую рамку перед тем, как сделает заголовок невидимым, затем поверните заголовок невидимым и, наконец, сохраните рисунок с сохраненным ранее bbox.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([0,1])
title = ax.set_title("my invisible title")

bbox = fig.get_tightbbox(fig.canvas.get_renderer())
title.set_visible(False)

plt.savefig(
        "invisible_artist.png",
        bbox_inches=bbox,
        facecolor="grey", # just to visualise the bbox
    )

plt.show()

image

недостаток в том, что pad_inches работает только для bbox_inches="tight".Таким образом, чтобы добиться эффекта pad_inches для такого указанного вручную bbox, нужно будет манипулировать самим Bbox.

0 голосов
/ 29 апреля 2019

Просто укажите цвет заголовка, который будет таким же, как facecolor, т. Е. 'grey' в вашем случае.Теперь вам не нужно title.set_visible(False).Я делаю это более общим, используя переменную col для указания цвета

from matplotlib import pyplot as plt

col = 'grey'
plt.plot([0,1])
title = plt.title("my invisible title", color=col)
plt.savefig(
        "invisible_artist.png",
        bbox_inches="tight", pad_inches=0,
        bbox_extra_artists=[title],
        facecolor=col, # just to visualise the bbox
    )

enter image description here

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