Я хочу нарисовать линию или какой-нибудь разделитель между подсюжетами.
Мне хорошо известен этот вопрос , но я не смог получить решение, данное там, чтобы работать, как я объясню ниже.
Я (вроде) понимаю эти преобразования , но фундаментальный вопрос, который у меня есть, который прояснит все остальное, заключается в следующем: есть ли способ определить «реальный» левый нижний угол каждого подплот как точка (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)
Должно быть, я сделал это неправильно, потому что, хотя первое решение по крайней мере что-то рисует, это вообще ничего не рисует - но никаких ошибок не дано.
Есть идеи? Спасибо!