Jeden rok údajov zo vzoriek:
import pandas as pd
import numpy.random as rnd
import seaborn as sns
n = 365
df = pd.DataFrame(data = {"A":rnd.randn(n), "B":rnd.randn(n)+1},
index=pd.date_range(start="2017-01-01", periods=n, freq="D"))
Chcem skopírovať tieto dáta vedľa seba zoskupené podľa mesiaca (t. J. Dve polia mesačne, jedna za A
a jeden pre B
). Pre jeden stĺpec sns.boxplot(df.index.month, df["A"])
funguje dobre. Avšak, sns.boxplot(df.index.month, df[["A", "B"]])
hodí chybu (ValueError: cannot copy sequence with size 2 to array axis with dimension 365
). Tavenie údajov indexom (pd.melt(df, id_vars=df.index, value_vars=["A", "B"], var_name="column")
), aby sa použilo morské dno hue
ako riešenie nefunguje (TypeError: unhashable type: "DatetimeIndex"
).
(Riešenie nemusí nutne používať morské dno, ak je jednoduchšie používať obyčajný matplotlib.)
/ Edit: Našiel som riešenie, ktoré v podstate produkuje to, čo chcem. Stáva sa však trochu nepríjemné pracovať s tým, čo DataFrame obsahuje viac premenných, ako chcem vykresliť. Takže ak existuje viac elegantný / priamy spôsob, ako to urobiť, prosím zdieľajte!
df_stacked = df.stack().reset_index()
df_stacked.columns = ["date", "vars", "vals"]
df_stacked.index = df_stacked["date"]
sns.boxplot(x=df_stacked.index.month, y="vals", hue="vars", data=df_stacked)
odpovede:
0 pre odpoveď č. 1Vašu otázku úplne nerozumiem, ale môžete sa na tento prístup pozrieť matplotlib
, Nie je to najlepšie riešenie.
1) Prestávka df
do 12 dátových rámcov month
s, všetky sú uložené v zozname
DFList = []
for group in df_3.groupby(df_3.index.month):
DFList.append(group[1])
2) Nakreslite ich po sebe v smyčke:
for _ in range(12):
DFList[_].plot(kind="box", subplots=True, layout=(2,2), sharex=True, sharey=True, figsize=(7,7))
plt.show()
3) Tu je snímka prvých troch riadkov:
Môžete tiež chcieť pokladňa
matplotlib
"sadd_subplot
metóda