【问题标题】:How to get boxplot data for matplotlib boxplots如何获取 matplotlib 箱线图的箱线图数据
【发布时间】:2016-02-04 17:56:55
【问题描述】:

我需要获取生成的统计数据以在 Pandas 中绘制箱线图(使用数据框创建箱线图)。即四分位数1,四分位数2,四分位数3,下须值,上须值和异常值。 我尝试了以下查询来绘制箱线图。

import pandas as pd
df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])
pd.DataFrame.boxplot(df,return_type = 'both')

有没有办法代替手动计算值?

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    一种选择是使用图中的 y 数据 - 可能对异常值(飞行器)最有用

    _, bp = pd.DataFrame.boxplot(df, return_type='both')
    
    outliers = [flier.get_ydata() for flier in bp["fliers"]]
    boxes = [box.get_ydata() for box in bp["boxes"]]
    medians = [median.get_ydata() for median in bp["medians"]]
    whiskers = [whiskers.get_ydata() for whiskers in bp["whiskers"]]
    

    但使用任一方法获取其他值(包括 IQR)可能更直接

    quantiles = df.quantile([0.01, 0.25, 0.5, 0.75, 0.99])
    

    或者,按照 WoodChopper 的建议

    stats = df.describe()
    

    【讨论】:

      【解决方案2】:
      • 要获取箱线图数据,请使用matplotlib.cbook.boxplot_stats,它会返回统计字典列表,用于使用matplotlib.axes.Axes.bxp 绘制一系列箱线图和须线图
        • 要获取箱线图统计信息,请将array 传递给boxplot_stats
          • 这不是特定于pandas
      • pandas 的默认绘图引擎是 matplotlib,因此使用 boxplot_stats 将返回 pandas.DataFrame.plot.box 的正确指标。
      • 将感兴趣的数字列传递给boxplot_stats,如array,使用df.values
      import pandas as pd
      import matplotlib.pyplot as plt
      form matplotlib.cbook import boxplot_stats
      import numpy as np
      
      # test dataframe
      np.random.seed(346)
      df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])
      
      # plot the dataframe as needed
      ax = df.plot.box(figsize=(8, 6), showmeans=True, grid=True)
      

      • 通过将array 传递给boxplot_stats 来提取箱线图指标
        • df.valuesnumpy.ndarray
      • dicts 与来自df 的列数组的顺序相同。
      • 此数据没有异常值,fliers,因为它是使用 numpy.random 生成的。
      # get stats
      stats = boxplot_stats(df.values)
      
      print(stats)
      [out]:
      [{'cihi': 0.6008396701195271,
        'cilo': 0.45316512285356997,
        'fliers': array([], dtype=float64),
        'iqr': 0.47030110594253877,
        'mean': 0.49412631128104645,
        'med': 0.5270023964865486,
        'q1': 0.2603486498337239,
        'q3': 0.7306497557762627,
        'whishi': 0.9941975539538199,
        'whislo': 0.00892072823759571},
       {'cihi': 0.5460977498205477,
        'cilo': 0.39283808760835964,
        'fliers': array([], dtype=float64),
        'iqr': 0.4880880962171596,
        'mean': 0.47578540593013985,
        'med': 0.4694679187144537,
        'q1': 0.2466015651284032,
        'q3': 0.7346896613455628,
        'whishi': 0.9906905357196321,
        'whislo': 0.002613905425137064},
       {'cihi': 0.6327876179340386,
        'cilo': 0.47317829117336885,
        'fliers': array([], dtype=float64),
        'iqr': 0.5083099578365278,
        'mean': 0.5202481643792808,
        'med': 0.5529829545537037,
        'q1': 0.24608370844800756,
        'q3': 0.7543936662845353,
        'whishi': 0.9968264819096214,
        'whislo': 0.008450848029956215},
       {'cihi': 0.5429786764060252,
        'cilo': 0.40089287519667627,
        'fliers': array([], dtype=float64),
        'iqr': 0.4525025516221303,
        'mean': 0.4948030963370377,
        'med': 0.4719357758013507,
        'q1': 0.279181107815125,
        'q3': 0.7316836594372553,
        'whishi': 0.9836196084903415,
        'whislo': 0.019864664399723786},
       {'cihi': 0.5413819754851169,
        'cilo': 0.3838462046931251,
        'fliers': array([], dtype=float64),
        'iqr': 0.5017062764076173,
        'mean': 0.4922357500877824,
        'med': 0.462614090089121,
        'q1': 0.2490034171367362,
        'q3': 0.7507096935443536,
        'whishi': 0.9984043081918205,
        'whislo': 0.0036707224412856343}]
      

      【讨论】:

      • 非常有用。如果列很多,如何知道哪个字典引用了哪个列?
      • @data_runner 见项目符号 5:字典与 df 中的列数组的顺序相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2010-12-03
      • 2018-07-12
      • 2013-05-11
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多