如何获取matplotlib箱线图的箱线图数据

2024-06-10 07:13:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要获得统计数据,这些数据是在熊猫中绘制方框图时生成的(使用dataframe创建方框图)。i、 e.四分位数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')

是否有一种方法可以代替手动计算值


Tags: 数据importdataframepandasdfasnp绘制
2条回答
  • 要获取箱线图数据,请使用^{},它返回一个统计字典列表,用于使用^{}绘制一系列箱线图和须线图
    • 要获取箱线图统计信息,请将array传递给boxplot_stats
      • 这不是特定于pandas
  • pandas的默认绘图引擎是matplotlib,因此使用boxplot_stats将返回^{}的正确度量
  • 使用^{}将感兴趣的数值列传递给boxplot_stats、as和array
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)

enter image description here

  • 通过将array传递给boxplot_metrics来提取箱线图度量
    • df.values是一个numpy.ndarray
  • dictsdf中的列数组的顺序相同
  • 该数据没有异常值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}]

一种选择是使用图中的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])

或者,正如樵夫建议的那样

stats = df.describe()

相关问题 更多 >