Potrebujem vykresliť body na rozbuške morušového, čo zodpovedá určitým hodnotám X tak, že spadajú buď na krivku hustoty alebo pod ňou. Tu je distplot z nasledujúcej adresy URL: Z lokality Seaborn - príklady rozptýlenia
Tu je obrázok s kódom:
Takže napríklad v spise, ktorý som uviedol vyššie, potrebujemurčiť programovo, čo je hodnota osi Y zodpovedajúca hodnote X 0, ktorá spadá na krivku hustoty. Z obrázka sa zdá, že je niekde okolo 0,37. Ako to môžem získať v mojom programe?
Za predpokladu, že je to možné, potom ako to môžem zobraziťv zobrazenom grafe, t.j. aký riadok kódu to ukáže. Prekladám súbor R vizualizácií do Pythonu. Nasledujúci príbeh v R ukazuje, čo sa snažím dosiahnuť:
Pozrite sa na body zobrazené na krivke? Existuje veľa bodových hodnôt, ktoré sa majú čerpať, ale ak mi pomôžete čerpať jeden, môžem sa pokúsiť urobiť zvyšok. Som začiatočníkom oboch balíčkov Matplotlib a Seaborn.
odpovede:
2 pre odpoveď č. 1Aby ste získali súradnicu y pre bod na krivke kde v distplot, môžete použiť základné údaje krivky. Dáta môžete získať z čiarového grafu pomocou get_data
metódu linky. Môžete potom interpolovať údaje v bodoch, ktoré vás zaujímajú, napr. 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()
Spýtal sa v komentároch o tom, ako získať toto riešenie:
Začnite s týmto problémom. Máme rozruch a chceme nakresliť bod v určitom bode jeho krivky kde.
- Pozrite sa na dokumentáciu. má funkcia distplot argument, ktorý robí to, čo chceme? Bohužiaľ nie.
- Funkcia vráti objekt? Áno. Je to krivka? Bohužiaľ nie. Namiesto toho to je matplotlib osi (zistenie, že sa s
type()
) - Zistite, aké sú osi matplotlib; prečítať dokumentáciu, Uff, je to dosť ťažké, ale narazíme na metódu
axes.get_lines()
; pretože krivka by mala byť čiarou, ktorá by mala pomôcť. - Zistite, aké sú tieto riadky: Sú
Line2D
objektov. Znovu pri pohľade na dokumentáciu zisťujeme, že existuje metódaget_data
, Teraz máme údaje o krivke. Skvelé! - V tomto bode by bolo ešte lepšie, keby sme mali funkciu, ktorú by sme mohli zavolať s našou hodnotou x, aby sme získali zodpovedajúcu hodnotu y. Teraz sa zdá, musíme túto funkciu nájsť sami.
- Takže
x
ay
údaje o krivke, ako nájdeme hodnotu y danej hodnoty x? Keďže údaje sú diskrétne, musíme ich interpolovať. Hľadáte okolo "interpolovať" a "python" nakoniec nás prinášanumpy.interp
, Takže to nám poskytuje súradnice, ktoré potrebujeme na to, aby nakreslili bod. - Zistite, ako nakresliť bod. No, to je jednoduché. Veľa príkladov pre to okolo.
To je to.