Я хотел бы контролировать расположение лейблов matplotlib на контурном графике, но без использования ручного = True flag в clabel. Например, я хотел бы указать координату x и создать метки в точках, проходящих через эту строку. Я вижу, что вы можете получить расположение отдельных меток, используя get_position(), но я застрял в этом. Любая помощь будет принята с благодарностью. Спасибо!
Месторасположение Matplotlib Contour Clabel
Ответ 1
Нет, для этого нет возможности встроить в matplotlib. Предполагается, что вы либо живете с местами по умолчанию, либо полностью интерактивны с помощью руководства и с помощью мыши.
Возможно, вы захотите записать это как отчет об ошибке вверх, чтобы они могли улучшить свои алгоритмы.
Существует множество возможностей для этого. Первый - программно разместить текст на фигуре контура. Таким образом вы не сможете надежно удалить строки под текстом. Предполагая, что у вас есть контур c
, вы можете найти контурные линии в c.collections
. Для каждой линии контура введите get_paths
и поместите текст на этот путь.
Другой вариант - заменить код для ручного размещения (в matplotlib.contour.BlockingContourLabeler
) или настроить код, который находит позиции метки (в matplotlib.contour.locate_label
), но обе функции довольно плотные. Если вы можете найти рабочую замену для locate_label
, просто перепишите старый метод в макрос графика
def your_locate_label(self, linecontour, labelwidth):
# some magic
pass
ar = np.array([[1,0], [0,1]]
c = matplotlib.contour(ar)
c.locate_label = your_locate_label
c.clabel()
Btw, если вы используете ipython
, вы можете легко просмотреть источник функции из своего интерактивного сеанса с помощью
%psource c.clabel
или непосредственно вызывать ваш $EDITOR
в файле, если он определен с помощью
%edit c.clabel
Ответ 2
Да, теперь есть способ контролировать расположение ярлыков! https://github.com/matplotlib/matplotlib/pull/642
plt.figure()
CS = plt.contour(X, Y, Z)
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)]
plt.clabel(CS, inline=1, fontsize=10, manual=manual_locations)