Как нарисовать разделитель или линии между вспомогательными участками (если на вспомогательных участках есть заголовки, метки осей и т. Д.) - PullRequest
1 голос
/ 01 апреля 2019

Я хочу нарисовать линию или какой-нибудь разделитель между подсюжетами.

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

Я (вроде) понимаю эти преобразования , но фундаментальный вопрос, который у меня есть, который прояснит все остальное, заключается в следующем: есть ли способ определить «реальный» левый нижний угол каждого подплот как точка (0,0) какого-либо преобразования? Или, как только вы начнете добавлять заголовки, метки и т. д., могут ли эти элементы портить систему координат, например, метка оси может иметь координаты y <0? </p>

Построение линии с использованием метода plot () для каждой оси и с использованием transform = axis.transAxes, так что (0,0) - это левый нижний угол, а (1,1) - верхний вправо действительно рисует линию, но:

  • рисование от (0,0) до (1,0) рисует в нижней части оси; Мне нужно это ниже, ниже, под ярлыком x_axis и т. Д.
  • определить точные координаты, где его изобразить, а именно, сколько внизу, громоздко, поскольку это зависит от того, какие элементы присутствуют на рисунке: названия, этикетки и т. д.
  • Линия заканчивается ниже других элементов фигура, а на выходе очень грязный

Второе решение, приведенное по этой ссылке, использует blended_transform_factory, но, если честно, я не смог заставить работать синтаксис.

Пример игрушки:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns

sns.set(style='darkgrid')

n = int(100)
x = np.arange(0,n)
fig, ax = plt.subplots(3,2)

for i,a in enumerate(ax.flatten() ):
    y = np.random.rand(n)
    sns.lineplot(x, y, ax=a)
    a.set_title('Chart # ' + str(i+1))
    a.set_xlabel('my x')
    a.set_ylabel('my y')

    # this is the first solution; messy output, line behind other elements of the figure
    a.plot([-1, 1.5], [-0.2, -0.2], color='black', lw=0.5, transform=a.transAxes, clip_on=False)

Второе решение будет означать замену последней строки приведенными ниже (всегда внутри цикла for):

trans = matplotlib.transforms.blended_transform_factory(fig.transFigure, a.transAxes)
line = matplotlib.lines.Line2D([0, 1], [0,0], color='w', transform=trans)
fig.lines.append(line)

Должно быть, я сделал это неправильно, потому что, хотя первое решение по крайней мере что-то рисует, это вообще ничего не рисует - но никаких ошибок не дано.

Есть идеи? Спасибо!

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