【问题标题】:Several boxes out of one column [Boxplot]一列中有几个框[箱线图]
【发布时间】:2022-01-27 01:11:10
【问题描述】:

我有一个包含两列(time_id 和 param1)的数据框。对于第 2 列(param1),我想根据时间创建一个箱线图。

但是我想把它分成三个(或 n 个)部分。这意味着箱线图中不仅有一个框,而且每个时间范围内只有一个框。 例如(n=3)一个基于值20,3,4,21,19[时间1-3]的框和一个基于8,9,18,6,4[时间4-6]的框等等

所以下面的代码创建了整列的箱线图。

import pandas as pd

# initialize data of lists.
data = {'time_id':[1,1,2,3,3,4,5,5,5,6,7,8,8,9],
        'param1':[20,3,4,21,19,8,9,18,6,4,2,3,7,1]}
 
# Create DataFrame
df = pd.DataFrame(data)

boxplot = df.boxplot(column='param1')

将列分成三个框以使箱形图看起来像这样(示例性)是一种优雅的方法:

【问题讨论】:

  • 应该将取值范围或元素个数分n组吗?假设像[1, 1, 1, 2, 5, 5, 6, 7, 120, 121, 122, 123] 这样的 time_it 系列。范围是1-2, 5-7, 120-123 还是1-41, 42-82, 83-123
  • 范围为 1-2、5-7 和 120-123。但实际上 stepsize 始终是相同的,分别没有 time_ids 的间隙。

标签: python pandas matplotlib


【解决方案1】:

由于您的时间序列或多或少是均匀分布的,我也会选择pd.cut()。最困难的部分是恕我直言,为箱线图创建有用的标签。

from matplotlib import pyplot as plt
import pandas as pd

# initialize data of lists.
data = {'time_id':[1,1,2,3,3,4,5,5,5,6,7,8,8,9],
        'param1':[20,3,4,21,19,8,9,18,6,4,2,3,7,1]}
 
# Create DataFrame
df = pd.DataFrame(data)

bin_nr = 3

_, bin_vals = pd.cut(df.time_id, bins=bin_nr, retbins=True)
bin_labels = ['time {mini} : {maxi}'.format(mini=df.time_id[(df.time_id > bin_vals[i]) & (df.time_id <= bin_vals[i+1])].min(), maxi=df.time_id[(df.time_id > bin_vals[i]) & (df.time_id <= bin_vals[i+1])].max()) for i in range(bin_nr)]
df["Labels"] = pd.cut(df.time_id, bins=bin_nr, labels=bin_labels)
df.boxplot(column='param1', by="Labels", rot=45)

plt.tight_layout()
plt.show()

示例输出:

在实际示例中,您的时间序列可能包含浮点数,而不是整数。这些浮点数可能相当长,使得标签也相当烦人。在这种情况下,您可以使用缩写它们的输出 bin_labels = ['time {mini:.2} : {maxi:.2}'.for.... 但这不适用于整数数组。

【讨论】:

    【解决方案2】:

    我不确定这是不是最优雅的方法,但您可以使用 pandas 的函数 cut() 和数据框的方法 .pivot()

    df["class"]=pd.cut(df['time_id'], bins=3, labels=False)
    df = df.drop("time_id", axis=1).pivot(columns="class")
    boxplot = df.boxplot()
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2020-09-10
      • 2021-01-25
      • 2018-09-08
      相关资源
      最近更新 更多