Matplotlib:使用关键词sym时,箱线图异常值颜色改变
这个内容只适用于 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 个回答
这确实很奇怪。你可以通过在符号上指定颜色来解决这个问题。使用 boxplot(data, sym='b.')
(这里的 b 代表蓝色)。不过我觉得这像是个 bug,特别是因为奇怪的颜色只出现在下方的异常值上,而不是上方的。
这里发生的事情是,绘制飞行器的方式是通过调用 plot
函数来实现的(可以看看在 boxplot
内部定义的 doplot
辅助函数)。如果你没有通过 sym
参数传递颜色,绘图函数就会使用默认的方式,也就是按照 axes
的颜色循环来上色。
在 1.4.0 版本(我们已经发布了候选版本,大家都应该去测试一下!)中,boxplot
下的代码已经完全重写。这暴露了一个错误(这个错误会很快修复),之后就会按预期工作。
在查看箱线图的默认点样式时:
*sym* : [ default 'b+' ] # blue +
默认情况下,点是蓝色的加号(+)。如果你只指定一个点,它可能会有不同的颜色。可以想象在某些情况下,这种行为是有用的。虽然可以说这是默认设置不一致,但这并不是一个错误。
所以,如果你想要两个图的颜色相同,那就使用:
boxplot(data, sym='+')
boxplot(data, sym='.')
如果不指定颜色,点的颜色似乎会轮换(在某些情况下这是想要的行为)。如果你想要固定的颜色,可以使用 sym='b+' 和 sym='b.'。
正如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.