Месторасположение Matplotlib Contour Clabel

Я хотел бы контролировать расположение лейблов matplotlib на контурном графике, но без использования ручного = True flag в clabel. Например, я хотел бы указать координату x и создать метки в точках, проходящих через эту строку. Я вижу, что вы можете получить расположение отдельных меток, используя get_position(), но я застрял в этом. Любая помощь будет принята с благодарностью. Спасибо!

Ответ 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)