一年的样本数据:
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"))
我想将这些数据并排分组按月分组(即每月两个方框,一个用于A
,一个用于B
)。对于单个列sns.boxplot(df.index.month, df["A"])
工作正常。但是,sns.boxplot(df.index.month, df[["A", "B"]])
会引发错误(ValueError: cannot copy sequence with size 2 to array axis with dimension 365
)。通过索引(pd.melt(df, id_vars=df.index, value_vars=["A", "B"], var_name="column")
)熔化数据以使用seaborn的hue
属性作为变通方法也不起作用(TypeError: unhashable type: 'DatetimeIndex'
)。
(如果使用普通的matplotlib更容易,解决方案不一定需要使用seaborn。)
/ edit:我发现了一种基本上可以产生我想要的解决方法。但是,一旦DataFrame包含的变量多于我想绘制的变量,就会变得有些尴尬。因此,如果有更优雅/直接的方式,请分享!
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)
答案 0 :(得分:0)
我完全不了解您的问题,但您可以使用matplotlib
来了解这种方法。虽然不是最好的解决方案。
1)df
将month
分成12个数据框,全部堆放在列表中
DFList = []
for group in df_3.groupby(df_3.index.month):
DFList.append(group[1])
2)在循环中一个接一个地绘制它们:
for _ in range(12):
DFList[_].plot(kind='box', subplots=True, layout=(2,2), sharex=True, sharey=True, figsize=(7,7))
plt.show()
3)这是前三行的快照:
您可能还想结帐
matplotlib
的{{3}}
答案 1 :(得分:0)
<body onload="fillZipCode()">
<script>
function fillZipCode() {
document.querySelector('#shipping-new-address-form div:nth-child(8) input').value = '12345';
</script>
会给this
并不是您要找的东西,但是如果添加更多变量,您将保持可读的DataFrame。
您还可以使用
轻松移除轴month_dfs = []
for group in df.groupby(df.index.month):
month_dfs.append(group[1])
plt.figure(figsize=(30,5))
for i,month_df in enumerate(month_dfs):
axi = plt.subplot(1, len(month_dfs), i + 1)
month_df.plot(kind='box', subplots=False, ax = axi)
plt.title(i+1)
plt.ylim([-4, 4])
plt.show()
在if i > 0:
y_axis = axi.axes.get_yaxis()
y_axis.set_visible(False)
之前的循环中
答案 2 :(得分:0)
使用Altair很简单:
alt.Chart(
df.reset_index().melt(id_vars = ["index"], value_vars=["A", "B"]).assign(month = lambda x: x["index"].dt.month)
).mark_boxplot(
extent='min-max'
).encode(
alt.X('variable:N', title=''),
alt.Y('value:Q'),
column='month:N',
color='variable:N'
)
上面的代码融合了DataFrame并添加了一个month
列。然后,Altair为按月细分的每个变量创建箱形图,作为绘图列。
答案 3 :(得分:0)
这是使用熊猫融化和海生的解决方案:
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,
"C": rnd.randn(n) + 10, # will not be plotted
},
index=pd.date_range(start="2017-01-01", periods=n, freq="D"))
df['month'] = df.index.month
df_plot = df.melt(id_vars='month', value_vars=["A", "B"])
sns.boxplot(x='month', y='value', hue='variable', data=df_plot)