Do tworzenia wykresów punktowych używam matplotlib. Każdy punkt na wykresie punktowym jest powiązany z nazwanym obiektem. Chciałbym móc zobaczyć nazwę obiektu po najechaniu kursorem na punkt na wykresie punktowym skojarzonym z tym obiektem. W szczególności dobrze byłoby móc szybko zobaczyć nazwy punktów, które są wartościami odstającymi. Najbliższą rzeczą, jaką udało mi się znaleźć podczas wyszukiwania tutaj, jest polecenie adnotacji, ale wydaje się, że tworzy ono stałą etykietę na wykresie. Niestety, biorąc pod uwagę liczbę punktów, które mam, wykres punktowy byłby nieczytelny, gdybym oznaczył każdy punkt etykietą. Czy ktoś zna sposób na tworzenie etykiet, które pojawiają się tylko wtedy, gdy kursor znajdzie się w pobliżu tego punktu?
python
matplotlib
jdmcbr
źródło
źródło
Odpowiedzi:
Wydaje się, że żadna z pozostałych odpowiedzi nie odpowiada na to pytanie. Oto kod, który używa rozproszenia i pokazuje adnotację po najechaniu kursorem na punkty rozrzutu.
Ponieważ ludzie chcą również używać tego rozwiązania dla linii
plot
zamiast rozproszenia, poniższe rozwiązanie byłoby tym samym rozwiązaniemplot
(które działa nieco inaczej).Pokaż fragment kodu
Jeśli ktoś szuka rozwiązania dla linii na podwójnych osiach, zapoznaj się z artykułem Jak wyświetlić etykiety po najechaniu kursorem na punkt na wielu osiach?
W przypadku, gdy ktoś szuka rozwiązania dla wykresów słupkowych, zapoznaj się np. Z tą odpowiedzią .
źródło
ind["ind"]
jest to lista indeksów dla wszystkich punktów pod kursorem. Oznacza to, że powyższy kod faktycznie daje dostęp do wszystkich punktów na danej pozycji, a nie tylko do najwyższego punktu. Na przykład, jeśli masz dwa nakładające się punkty, tekst może być odczytany1 2, B C
lub nawet1 2 3, B C D
jeśli masz 3 nakładające się punkty.0 8, A I
(patrz zdjęcie ).fig.canvas.draw_idle()
wiele razy (nawet zmienia kursor na bezczynny). Rozwiązałem to zapisując poprzedni indeks i sprawdzając, czyind["ind"][0] == prev_ind
. Następnie aktualizuj tylko wtedy, gdy przechodzisz z jednego punktu do drugiego (aktualizuj tekst), przestań najeżdżać (uczyń adnotację niewidoczną) lub zacznij najeżdżać (uczyń adnotację widoczną). Dzięki tej zmianie jest o wiele bardziej czysty i wydajny.%matplotlib notebook
na notebooku IPython / Jupyter.To rozwiązanie działa, gdy najeżdżasz na linię bez konieczności jej klikania:
źródło
matplotlib
...) - czy to działa zipython
/jupyter
notebookami? Czy działa również, gdy istnieje wiele wątków pobocznych? A co z wykresem słupkowym, a nie liniowym?Z http://matplotlib.sourceforge.net/examples/event_handling/pick_event_demo.html :
źródło
print
Oświadczenie powinno również użyć nawiasów dla kompatybilności z Pythona 3Niewielka zmiana na przykładzie podanym w http://matplotlib.org/users/shell.html :
To kreśli prostoliniową fabułę, o co prosił Sohaib
źródło
mpld3 rozwiąż to za mnie. EDYCJA (DODANO KOD):
Możesz sprawdzić ten przykład
źródło
TypeError: array([1.]) is not JSON serializable
.Pracowały dla mnie mplcursors. mplcursors zapewnia klikalne adnotacje dla matplotlib. Jest mocno zainspirowany mpldatacursor ( https://github.com/joferkington/mpldatacursor ), ze znacznie uproszczonym interfejsem API
źródło
matplotlib
że każda dziesiąta linia ma ten sam kolor, taki ból.mplcursors
rozwiązuje to jednak.Inne odpowiedzi nie dotyczyły mojej potrzeby prawidłowego wyświetlania podpowiedzi w najnowszej wersji wbudowanej figury matplotlib Jupyter. Ten jednak działa:
Prowadzące do czegoś podobnego do poniższego obrazu podczas przechodzenia przez punkt za pomocą myszy:
źródło
Jeśli używasz notebooka jupyter, moje rozwiązanie jest tak proste, jak:
Możesz dostać coś takiego
źródło
Zrobiłem wielowierszowy system adnotacji do dodania: https://stackoverflow.com/a/47166787/10302020 . najbardziej aktualna wersja: https://github.com/AidenBurgess/MultiAnnotationLineGraph
Po prostu zmień dane w dolnej sekcji.
źródło