Matplotlib:使用关键词sym时,箱线图异常值颜色改变

6 投票
4 回答
10991 浏览
提问于 2025-04-18 15:37

这个内容只适用于 Matplotlib 版本低于 1.4.0!

我遇到了一个奇怪的现象,就是当我改变用来绘制异常值的符号时,它们的颜色也会变化。(这是 Boxplot 的文档) 我觉得这可能是个 bug。

我该怎么做才能把所有异常值的颜色都“重置”为蓝色,即使我想用其他符号而不是“+”呢?

这是一个简单的示例,参考了官方示例

#!/usr/bin/python

from pylab import *

# fake up some data
spread = rand(50) * 100
center = ones(25) * 50
flier_high = rand(10) * 100 + 100
flier_low = rand(10) * -100
data = concatenate((spread, center, flier_high, flier_low), 0)

# Left Figure
boxplot(data)

# Right Figure
figure()
boxplot(data, sym='.')

在这里输入图片描述

4 个回答

1

这确实很奇怪。你可以通过在符号上指定颜色来解决这个问题。使用 boxplot(data, sym='b.') (这里的 b 代表蓝色)。不过我觉得这像是个 bug,特别是因为奇怪的颜色只出现在下方的异常值上,而不是上方的。

1

这里发生的事情是,绘制飞行器的方式是通过调用 plot 函数来实现的(可以看看在 boxplot 内部定义的 doplot 辅助函数)。如果你没有通过 sym 参数传递颜色,绘图函数就会使用默认的方式,也就是按照 axes 的颜色循环来上色。

在 1.4.0 版本(我们已经发布了候选版本,大家都应该去测试一下!)中,boxplot 下的代码已经完全重写。这暴露了一个错误(这个错误会很快修复),之后就会按预期工作。

2

在查看箱线图的默认点样式时:

*sym* : [ default 'b+' ]  # blue +

默认情况下,点是蓝色的加号(+)。如果你只指定一个点,它可能会有不同的颜色。可以想象在某些情况下,这种行为是有用的。虽然可以说这是默认设置不一致,但这并不是一个错误。

所以,如果你想要两个图的颜色相同,那就使用:

boxplot(data, sym='+')
boxplot(data, sym='.')

如果不指定颜色,点的颜色似乎会轮换(在某些情况下这是想要的行为)。如果你想要固定的颜色,可以使用 sym='b+' 和 sym='b.'。

2

正如BrenBarn和Joop所说,最简单的方法就是用字符来指定颜色:比如用boxplot(data, sym='b.')可以把颜色设置为蓝色,或者用sym='gx'可以在图中显示绿色的x标记。

通过参考这个问题,我找到了一个方法,可以让异常值的显示完全自定义。(我想要减小异常值的大小)

# insert this after lines '#Right figure', 'figure()'

r = boxplot(data, sym="w") # outlier are computed but not drawn

top_points = r["fliers"][0].get_data()[1]
bottom_points = r["fliers"][2].get_data()[1]
plot(np.ones(len(top_points)), top_points, "x", color="blue", markersize=1)
plot(np.ones(len(bottom_points)), bottom_points, ".", color="blue")
#if you have several boxplots this "np.ones(len(bottom_points))" is the number of plot you want to draw in, so 1s for the first [2,2,2,2,...] for the second ect.

enter image description here

撰写回答