如何向箱线图异常值添加注释

问题描述 投票:0回答:1

我有一个如下图(使用

plt.boxplot()
):

现在,我想要绘制一个数字,显示这些异常值出现的频率(最好是在每个异常值的右上角)。

这可以以某种方式实现吗?

python matplotlib boxplot plot-annotations
1个回答
4
投票

ax.boxplot
返回箱线图中所有元素的字典。您需要从该字典中获取的密钥是
'fliers'

boxdict['fliers']
中,有
Line2D
实例用于绘制传单。我们可以使用
x
y
获取它们的
.get_xdata()
.get_ydata()
位置。

您可以使用

set
查找所有唯一的 y 位置,然后使用
.count()
查找在该位置绘制的传单数量。

那么这只是使用 matplotlib 的

ax.text
向绘图添加文本标签的情况。

考虑以下示例:

import matplotlib.pyplot as plt
import numpy as np

# Some fake data
data = np.zeros((10000, 2))
data[0:4, 0] = 1
data[4:6, 0] = 2
data[6:10, 0] = 3
data[0:9, 1] = 1
data[9:14, 1] = 2
data[14:20, 1] = 3

# create figure and axes
fig, ax = plt.subplots(1)

# plot boxplot, grab dict
boxdict = ax.boxplot(data)

# the fliers from the dictionary
fliers = boxdict['fliers']

# loop over boxes in x direction
for j in range(len(fliers)):

    # the y and x positions of the fliers
    yfliers = boxdict['fliers'][j].get_ydata()
    xfliers = boxdict['fliers'][j].get_xdata()

    # the unique locations of fliers in y 
    ufliers = set(yfliers)

    # loop over unique fliers
    for i, uf in enumerate(ufliers):

        # print number of fliers
        ax.text(xfliers[i] + 0.03, uf + 0.03, list(yfliers).count(uf))

plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.