/ / Python Seaborn Distplot Y wartość odpowiadająca danej wartości X - python, matplotlib, fabuła, punkt, seaborn

Python Seaborn Distplot Y wartość odpowiadająca danej wartości X - python, matplotlib, fabuła, punkt, seaborn

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:

wprowadź opis obrazu tutaj

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ąć:

wprowadź opis obrazu tutaj

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 № 1

wprowadź opis obrazu tutaj

Aby 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.

  1. Spójrz na dokumentację; czy funkcja distplot ma argument, który robi to, czego chcemy? Niestety nie.
  2. Czy funkcja zwraca obiekt? Tak. Czy to jest krzywa? Niestety nie. Zamiast tego jest to osie matplotlib (znajdując to z type())
  3. 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.
  4. Dowiedz się, jakie są te linie: Są Line2D obiekty. Ponownie patrząc na dokumentację stwierdzamy, że istnieje metoda get_data. Więc teraz mamy dane krzywej. Świetny!
  5. 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ę.
  6. Tak biorąc pod uwagę x i y 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 do numpy.interp. Dostarcza nam to współrzędnych, których potrzebujemy, aby narysować punkt.
  7. Dowiedz się, jak narysować punkt. Cóż, to łatwe, wiele przykładów na to.

To jest to.