带有熊猫和 Jupyter 笔记本的交互式箱线图

Posted

技术标签:

【中文标题】带有熊猫和 Jupyter 笔记本的交互式箱线图【英文标题】:Interactive boxplot with pandas and Jupyter notebook 【发布时间】:2017-05-30 18:15:33 【问题描述】:

我在 pandas DataFrame 中有数据,我想创建一个交互式箱线图,允许我选择天数,同时为“类别”列中每个类别中的值绘制箱线图

这是我的代码/数据到目前为止的样子:

import numpy as np
import pandas as pd

categories=('A','B','C')

data = 
            'days':      np.random.randint(120, size=100), 
            'category':  np.random.choice(categories, 100),
            'value':     100.0 * np.random.random_sample(100)
       

df = pd.DataFrame(data)

print(df)

   category  days      value
0         A     4  77.383981
1         A    31  63.011934
2         A     5   1.165061
3         C    59  23.588979
4         A    57  14.906734
5         C   106  33.366634
6         A    29  90.658570
7         B    25  16.137490
8         A   118  34.526302
9         C    76   4.111797
10        A    11  30.195917
..      ...   ...        ...
90        A    64  37.529774
91        A    76   3.771360
92        C   112  93.948775
93        C    14  34.855189
94        B    64  83.106007
95        A    10  78.346319
96        B    86  66.645889
97        A    46  12.969012
98        C    29  57.925427
99        A    59  34.526146

[100 rows x 3 columns]

我想为每个类别(选定/指定的天数)创建一个箱线图,并沿 X 轴绘制不同的类别。

如何使用 pandas(或 matplotlib)来做到这一点?

【问题讨论】:

(1) 您能否详细说明“jupyter 中的交互式绘图”是什么意思?如我所见,jupyter 已经非常具有交互性,因此调用具有新值的单元格会创建不同的图。 (2) 什么是天数?像42 这样的单个值?想如何选择天数? @ImportanceOfBeingErnest:(1) 我第一次在 Jupyter 中发现此功能,是通过观看此视频:youtube.com/watch?v=ZrRpN_IrcBA(概念是在 24:50 左右引入的)。 (2) 天数为整数。交互式小部件允许您从下拉框中选择值。 这将是包含在问题中的一条信息。请参阅更新的答案以了解如何实现此下拉框。 【参考方案1】:

您可以简单地按天数过滤数据框,然后绘制相应的箱线图。

numer_of_days = 42
df_filtered= df.loc[df['days'] < numer_of_days]  # use operators like ==, >=, <, etc.
df_filtered[["category", "value"]].boxplot( by="category", return_type='axes')


为了获得下拉字段,您可以使用ipywidgets.interact() 函数,您可以向该函数提供绘制特定日期数据框的函数。 (在下文中,我将天数限制为 12 天,这样下拉菜单实际上对于从中选择一天是有意义的。)
import numpy as np
import pandas as pd
from ipywidgets import interact
%matplotlib notebook

categories=('A','B','C')

data = 
            'days':      np.random.randint(12, size=100), 
            'category':  np.random.choice(categories, 100),
            'value':     100.0 * np.random.random_sample(100)
       

df = pd.DataFrame(data)

def select_days(number_of_days):
    df_filtered= df.loc[df['days'] == int(number_of_days)] 
    ax = df_filtered[["category", "value"]].boxplot( by="category", return_type='axes')
    ax["value"].set_title("Day " + number_of_days)
    print df_filtered

days = [str(day) for day in np.arange(12)]

interact(select_days, number_of_days=days)

【讨论】:

【参考方案2】:

如何显示盒子、分布和小提琴图

f, axes = plt.subplots(5, 3, figsize=(20, 20))
colors = ["r", "g", "b", "m", "c"]

count = 0
for i in houseNumData:
    sb.boxplot(houseNumData[i], orient = "h", color = colors[count], ax = axes[count,0])
    sb.distplot(houseNumData[i], color = colors[count], ax = axes[count,1])
    sb.violinplot(houseNumData[i], color = colors[count], ax = axes[count,2])
    count += 1

【讨论】:

我建议您解释您的代码,以便 OP 了解如何将解决方案实施到 OP 的问题陈述中。

以上是关于带有熊猫和 Jupyter 笔记本的交互式箱线图的主要内容,如果未能解决你的问题,请参考以下文章

如何按中值对熊猫中的箱线图进行排序?

向熊猫数据框箱线图添加标签?

为熊猫箱线图(groupby)设置无标题

使用熊猫的箱线图

更改熊猫中箱线图的面色

更改熊猫箱线图子图中各个框的颜色