首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >pandas DataFrame的多个列的并排框图

pandas DataFrame的多个列的并排框图
EN

Stack Overflow用户
提问于 2017-03-13 18:06:35
回答 3查看 14.5K关注 0票数 12

一年的样本数据:

代码语言:javascript
复制
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。)

编辑

我找到了一种变通方法,基本上可以产生我想要的东西。但是,一旦DataFrame包含的变量超过了我想要绘制的数量,它就会变得有些笨拙。因此,如果有更优雅/更直接的方法,请分享!

代码语言:javascript
复制
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)

产生:

EN

回答 3

Stack Overflow用户

发布于 2019-05-31 02:40:58

这是一个使用熊猫熔化和海运的解决方案:

代码语言:javascript
复制
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)
票数 6
EN

Stack Overflow用户

发布于 2019-05-20 03:15:54

代码语言:javascript
复制
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()

将会给this

这并不是你想要的,但是如果你添加了更多的变量,你就可以保持一个可读的DataFrame。

还可以使用以下命令轻松删除轴

代码语言:javascript
复制
if i > 0:
        y_axis = axi.axes.get_yaxis()
        y_axis.set_visible(False)

plt.show()之前的循环中

票数 0
EN

Stack Overflow用户

发布于 2019-05-20 03:46:58

使用Altair,这非常简单:

代码语言:javascript
复制
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为每个变量创建按月份分解的箱形图作为曲线图列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42760965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档