Jestem raczej nowy w Pythonie / Matplotlib i używam go w notatniku ipython. Próbuję dodać kilka linii adnotacji do istniejącego wykresu i nie mogę dowiedzieć się, jak wyrenderować linie na wykresie. Na przykład, jeśli wykreślę co następuje:
import numpy as np
np.random.seed(5)
x = arange(1, 101)
y = 20 + 3 * x + np.random.normal(0, 60, 100)
p = plot(x, y, "o")
Otrzymuję następujący wykres:
Jak więc dodać pionową linię od (70,100) do (70,250)? A co z linią ukośną od (70,100) do (90,200)?
Próbowałem kilku rzeczy, które Line2D()
doprowadziły mnie jedynie do zamieszania. W R
po prostu użyłbym funkcji segmentów (), która dodałaby segmenty linii. Czy jest odpowiednik w matplotlib
?
źródło
x = np.arange(1, 101)
.plt.plot([70, 70], [100, 250], 'k-', lw=2, label="_not in legend")
90
jest używany zarówno jako, jakx2
i,y1
prowadzi do wielu niejasności. Każdy, kto to przegląda, powinien pamiętać, że[70, 90]
nie odnosi się do żadnego punktu w lokalizacjix1,y1
. Dla odniesienia, oto znaczenie wartości:[x1: 70, x2: 90], [y1: 90, y2: 200]
Dla nowoprzybyłych jeszcze nie jest za późno .
Przyjmuje również zakres y, używając ymin i ymax.
źródło
Używając
vlines
:Podstawowe sygnatury wywoławcze to:
źródło
vline()
anihline()
funkcji. A co z liniami ukośnymi? Zredagowałem pytanie, aby dodać przekątną teraz, gdy pokazałeś mi linie H & V.DataFrame
zawierający współrzędne x, y i wykreśl je za pomocąstyle='k-'
Matplolib pozwala teraz na „linie adnotacji”, o które zabiegał OP.
annotate()
Funkcja umożliwia kilka form ścieżkach łączących i bezgłowy i tailess strzałkę, tj prostą linię, jest jednym z nich.W dokumentacji jest napisane, że możesz narysować tylko strzałkę z pustym ciągiem jako pierwszym argumentem.
Z przykładu OP:
Podobnie jak w podejściu w odpowiedzi gcalmettes, możesz wybrać kolor, szerokość linii, styl linii itp.
Oto zmiana w części kodu, która sprawiłaby, że jedna z dwóch przykładowych linii byłaby czerwona, szersza i nie w 100% nieprzezroczysta.
Możesz również dodać krzywą do linii łączącej, dostosowując
connectionstyle
.źródło
.plot()
nie mogę.Zamiast nadużywać
plot
lubannotate
, co będzie nieefektywne w przypadku wielu linii, możesz użyćmatplotlib.collections.LineCollection
:Potrzeba listę linii
[l1, l2, ...]
, w którym każda z linii jest sekwencją N współrzędnych ( N może być więcej niż dwa).Dostępne są standardowe słowa kluczowe formatujące, akceptujące albo pojedynczą wartość, w którym to przypadku wartość dotyczy każdego wiersza, albo sekwencja M
values
, w którym to przypadku wartość dla i- tego wiersza tovalues[i % M]
.źródło