Chciałbym kontrolować położenie clabels matplotlib na wykresie konturu, ale bez korzystania z instrukcji = True flagi w zawijas. Na przykład, chciałbym podać współrzędną x i mieć etykiety utworzone w punktach przechodzących przez tę linię. Widzę, że można uzyskać lokalizację poszczególnych etykiet za pomocą get_position(), ale utknąłem w tym. Każda pomoc będzie bardzo ceniona. Dzięki!Matplotlib Contour Clabel Lokalizacja
Odpowiedz
Nie, nie ma żadnej możliwości wbudowania w matplotlib, aby to zrobić. Powinieneś albo mieszkać z domyślnymi lokalizacjami, albo przejść w pełni interaktywnie za pomocą instrukcji i za pomocą myszy.
Być może zechcesz zgłosić to jako raport o błędach, aby usprawnić swoje algorytmy.
Istnieje wiele opcji do obejścia tego. Pierwszym jest programowe umieszczanie tekstu na rysunku konturu. W ten sposób nie będziesz w stanie niezawodnie usunąć linii pod tekstem. Zakładając, że masz kontur c
, możesz znaleźć linie konturu w c.collections
. Dla każdej linii konturu wywołaj get_paths
i umieść tekst na tej ścieżce.
Inną opcją byłoby zastąpienie kod ręcznym umieszczeniu (w matplotlib.contour.BlockingContourLabeler
) lub dostosować kod, który wyszukuje pozycje etykiet (w matplotlib.contour.locate_label
), ale obie funkcje są dość gęsta. Jeśli można wymyślić zamiennik pracy dla locate_label
prostu nadpisać starą metodę w swojej kreślenia makro
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, jeśli używasz ipython
można łatwo przeglądać źródła funkcji z interaktywnej sesji z
%psource c.clabel
lub bezpośrednio powoływać się na swój $EDITOR
pliku zostały zdefiniowane jest z
%edit c.clabel
Tak, tam teraz to sposób na kontrolowanie lokalizacji etykiet! 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)
instrukcja może być iterable przedmiot x, y krotki. Etykiety konturu zostaną utworzone tak, jakby kliknięcie myszy odbywało się na każdej pozycji x, y. – Faber
Czy istnieje sposób na umożliwienie zautomatyzowanego etykietowania, a następnie przeplatanie etykiet, aby usunąć (i być może poprawić) wszystkie przecinające się osie? –
nie mogę znaleźć ten problem pisał, więc zrobiłem nowe: https://github.com/matplotlib/matplotlib/issues/613 – keflavich