熊猫DataFrame的多列并排的boxplot

Fre*_*d S 10 python plot boxplot pandas seaborn

一年的样本数据:

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"))
Run Code Online (Sandbox Code Playgroud)

我想将这些数据并排分组,按月分组(即每月两个盒子,一个盒子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).通过index(pd.melt(df, id_vars=df.index, value_vars=["A", "B"], var_name="column"))熔化数据以使用seaborn的hue属性作为变通方法也不起作用(TypeError: unhashable type: 'DatetimeIndex').

(如果使用普通的matplotlib更容易,解决方案不一定需要使用seaborn.)

/编辑:我找到了一个基本上可以产生我想要的解决方法.但是,一旦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)
Run Code Online (Sandbox Code Playgroud)

生产: A和B的并排箱图,按月分组.

小智 8

这是使用 pandas Melting 和 Seaborn 的解决方案:

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)
Run Code Online (Sandbox Code Playgroud)


小智 0

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()
Run Code Online (Sandbox Code Playgroud)

会给这个

不完全是您正在寻找的内容,但如果添加更多变量,您可以保留可读的 DataFrame。

您还可以使用以下方法轻松删除轴

if i > 0:
        y_axis = axi.axes.get_yaxis()
        y_axis.set_visible(False)
Run Code Online (Sandbox Code Playgroud)

在之前的循环中plt.show()