Muszę nanieść punkty na wykresie Seaborn odpowiadającym pewnym wartościom X, tak aby spadały na krzywą gęstości lub poniżej. Oto distplot z następującego adresu URL: Z witryny firmy Seaborn - przykłady distplot
Oto obraz z kodem:
Na przykład na powyższym wykresie potrzebujęaby programowo określić, jaka jest wartość osi Y odpowiadająca wartości X wynoszącej 0, która spada na krzywą gęstości. Z rysunku wynika, że jest to około 0,37. Jak mogę to uzyskać w moim programie?
Zakładając, że da się to zrobić, jak mogę to pokazaćna pokazanym wykresie, tzn. jaki wiersz kodu to pokaże. Tłumaczę zestaw wizualizacji R do Pythona. Poniższy wątek w R pokazuje, co próbuję osiągnąć:
Zobacz punkty pokazane na krzywej? Jest wiele wartości, które należy narysować, ale jeśli pomożesz mi je narysować, spróbuję zrobić resztę. Jestem początkującym użytkownikiem zarówno pakietów Matplotlib, jak i Seaborn.
Odpowiedzi:
2 dla odpowiedzi № 1Aby uzyskać współrzędną y dla punktu na krzywej kde w obszarze dystrybucji, można użyć podstawowych danych krzywej. Możesz pobrać dane z wykresu liniowego za pomocą get_data
metoda linii. Następnie możesz interpolować dane w punktach, które Cię interesują, używając np. numpy.interp
.
import seaborn.apionly as sns
import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
x = np.random.randn(100)
ax = sns.distplot(x, hist_kws={"ec":"k"})
data_x, data_y = ax.lines[0].get_data()
xi = 0 # coordinate where to find the value of kde curve
yi = np.interp(xi,data_x, data_y)
print ("x={},y={}".format(xi, yi)) # prints x=0,y=0.3698
ax.plot([0],[yi], marker="o")
plt.show()
Pytany w komentarzach o tym, jak uzyskać to rozwiązanie:
Zacznij od problemu. Mamy działkę i chcemy narysować punkt w pewnym punkcie krzywej kde.
- Spójrz na dokumentację; czy funkcja distplot ma argument, który robi to, czego chcemy? Niestety nie.
- Czy funkcja zwraca obiekt? Tak. Czy to jest krzywa? Niestety nie. Zamiast tego jest to osie matplotlib (znajdując to z
type()
) - Dowiedz się, jakie są osie matplotlib; czytać dokumentacja. Uff, jest dość ciężki, ale natknęliśmy się na metodę
axes.get_lines()
; ponieważ krzywa powinna być linią, która powinna pomóc. - Dowiedz się, jakie są te linie: Są
Line2D
obiekty. Ponownie patrząc na dokumentację stwierdzamy, że istnieje metodaget_data
. Więc teraz mamy dane krzywej. Świetny! - W tym momencie byłoby jeszcze lepiej, gdybyśmy mieli funkcję, którą moglibyśmy wywołać z naszą wartością x, aby otrzymać odpowiednią wartość y. Teraz wydaje się, że sami musimy znaleźć tę funkcję.
- Tak biorąc pod uwagę
x
iy
dane krzywej, jak znaleźć wartość y danej wartości x? Ponieważ dane są dyskretne, musimy interpolować. Rozglądanie się za "interpolacją" i "pytonem" ostatecznie doprowadza nas donumpy.interp
. Dostarcza nam to współrzędnych, których potrzebujemy, aby narysować punkt. - Dowiedz się, jak narysować punkt. Cóż, to łatwe, wiele przykładów na to.
To jest to.