如何获取Matplotlib箱线图的箱线图数据?
箱线图是数据分析中常见的一种图表形式,可以展示数据的中位数、四分位数和异常值等。在Matplotlib中,我们可以使用boxplot
函数来绘制箱线图,但是如果我们想要获取箱线图中的数据,该怎么办呢?本文将介绍如何利用Matplotlib来获取箱线图的箱线图数据。
Matplotlib箱线图简介
先来简单介绍一下Matplotlib中的箱线图。我们可以通过如下代码生成一组数据,并使用boxplot
函数绘制箱线图:
import matplotlib.pyplot as plt
import numpy as np
# 生成一组数据
np.random.seed(123)
data = np.random.normal(size=(100, 4), loc=0, scale=1)
# 绘制箱线图
fig, ax = plt.subplots()
ax.boxplot(data)
plt.show()
在箱线图中,箱体的上边缘和下边缘分别表示数据的第三四分位数和第一四分位数,箱体中线表示中位数,箱体中的小方块表示所有数据点的合集,而箱体外的圆点则表示异常值。
Matplotlib如何获取箱线图数据?
既然我们已经绘制了箱线图,那么我们如何获取箱线图的具体数据呢?下面将介绍三种不同的方法。
方法一:使用返回值的方式
在Matplotlib中,boxplot
函数会返回一个字典,其中包含了箱体、须和异常值等各个部分的数据。我们可以根据这个字典来获取箱线图数据。
fig, ax = plt.subplots()
box_dict = ax.boxplot(data)
whiskers = [item.get_ydata() for item in box_dict['whiskers']]
caps = [item.get_ydata() for item in box_dict['caps']]
boxes = [item.get_ydata() for item in box_dict['boxes']]
medians = [item.get_ydata() for item in box_dict['medians']]
fliers = [item.get_ydata() for item in box_dict['fliers']]
以上代码中,whiskers
表示两端的须,caps
表示两端的线段,boxes
表示箱体,medians
表示中位数,fliers
表示异常值。这些变量的格式均为[[bottom, top], ...]
。
方法二:解析绘图对象
在我们绘制完箱线图之后,可以通过解析绘图对象来获取箱线图中的数据。我们可以使用如下代码将绘图对象中的元素按类型分组:
def get_bbox_data(ax, element):
bbox_data = []
artists = [artist for artist in ax.get_children()]
for artist in artists:
if isinstance(artist, element):
bbox_data.append(artist.get_bbox().get_points()[:, 1])
return bbox_data
whiskers = get_bbox_data(ax, plt.Line2D)
caps = get_bbox_data(ax, plt.Line2D)
boxes = get_bbox_data(ax, plt.Rectangle)
medians = get_bbox_data(ax, plt.Line2D)
fliers = get_bbox_data(ax, plt.Circle)
以上代码中,whiskers
表示两端的须,caps
表示两端的线段,boxes
表示箱体,medians
表示中位数,fliers
表示异常值。这些变量的格式均为[[bottom, top], ...]
。
方法三:从坐标系中获取数据
最后一种方法是从坐标系中获取数据。具体来说,我们可以通过如下代码将箱线图中的各个元素的坐标位置转换为数据进行提取:
def get_data_from_ax(ax, artist_list, axis_id):
coords = np.array([coord[axis_id] for artist in artist_list for coord in artist.get_xydata()])
data = ax.transData.inverted().transform(coords)
return data
whiskers = get_data_from_ax(ax, ax.artists[1:2], 1)
caps = get_data_from_ax(ax, ax.artists[2:4], 1)
boxes = get_data_from_ax(ax, ax.artists[4:5], 1)
medians = get_data_from_ax(ax, ax.artists[5:6], 1)
fliers = get_data_from_ax(ax, ax.artists[6:], 1)
以上代码中,whiskers
表示两端的须,caps
表示两端的线段,boxes
表示箱体,medians
表示中位数,fliers
表示异常值。这些变量的格式均为[data1, data2, ...]
,其中data1
等为二维数组,表示一个点的x坐标和y坐标。
示例
下面展示如何使用以上三种方法来获取箱线图的数据。针对方法一,我们可以通过如下方式打印出各个部分的数据:
print("whiskers", whiskers)
print("caps", caps)
print("boxes", boxes)
print("medians", medians)
print("fliers", fliers)
针对方法二,我们可以使用如下方式演示数据提取:
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame({
"whiskers": whiskers,
"caps": caps,
"boxes": boxes,
"medians": medians,
"fliers": fliers
})
# 打印数据
print(df.head())
针对方法三,我们也可以使用如下方式提取数据并进行展示:
# 将数据转换为DataFrame
import pandas as pd
df = pd.DataFrame({
"whiskers": list(map(list, whiskers)),
"caps": list(map(list, caps)),
"boxes": list(map(list, boxes)),
"medians": list(map(list, medians)),
"fliers": list(map(list, fliers))
})
# 打印数据
print(df.head())
结论
本文介绍了如何使用Matplotlib获取箱线图的箱线图数据,并提供了三种不同的方法来获取这些数据,包括使用返回值、解析绘图对象和从坐标系中获取数据。对于数据分析人员来说,掌握这些方法可以更好地理解和使用箱线图。