当使用 matplotlib
绘制点图时,我想偏移重叠的数据点以使它们全部可见。例如,如果我有:
CategoryA: 0,0,3,0,5
CategoryB: 5,10,5,5,10
我希望每个 CategoryA
“0” 数据点并排设置,而不是彼此重叠,同时仍与 CategoryB
不同。
在 R (ggplot2
) 中有一个 "jitter"
选项可以做到这一点。 matplotlib 中是否有类似的选项,或者是否有其他方法会导致类似的结果?
编辑: 澄清一下,the "beeswarm"
plot in R基本上就是我的想法,pybeeswarm
是 matplotlib/Python 版本的早期但有用的开始。
编辑: 添加 Seaborn 的 Swarmplot ,在 0.7 版本中引入,是我想要的一个很好的实现。
最佳答案
通过@user2467675 扩展答案,我是这样做的:
def rand_jitter(arr):
stdev = .01 * (max(arr) - min(arr))
return arr + np.random.randn(len(arr)) * stdev
def jitter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, hold=None, **kwargs):
return scatter(rand_jitter(x), rand_jitter(y), s=s, c=c, marker=marker, cmap=cmap, norm=norm, vmin=vmin, vmax=vmax, alpha=alpha, linewidths=linewidths, **kwargs)
stdev
变量确保抖动足以在不同的尺度上看到,但它假定轴的限制为零和最大值。
然后您可以调用 jitter
而不是 scatter
。
关于python - Matplotlib:避免 "scatter/dot/beeswarm"图中的重叠数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671808/