2010-05-07 13 views
11

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

5

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 
+0

nie mogę znaleźć ten problem pisał, więc zrobiłem nowe: https://github.com/matplotlib/matplotlib/issues/613 – keflavich

9

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) 
+0

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

+2

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? –