【发布时间】:2015-06-05 20:02:21
【问题描述】:
我有一个散点图,它绘制了来自两个不同数据集的大量点。在某些区域,有大量的点,因此即使 alpha 非常低(例如 alpha=0.1),您也无法看穿质量。但是在那个 alpha 上,你几乎看不到稀疏区域中的点。有没有办法限制堆叠点的 alpha 或以某种方式使背景在密集区域下可见,同时不洗掉稀疏区域?
sn-p 代码如下:
# Code to populate the datasets not included.
fig, ax = plt.subplots()
ax.scatter(x1, y1, s=12, color='red')
ax.scatter(x2, y2, s=12, color='blue', alpha=0.1)
# Plus code to do xlabels and such not included.
制作这个:
如您所见,很难看到底部红色腿的边界,并且仍然使顶部蓝色腿打出。
有什么方法可以制作这种效果吗?
提前致谢。
编辑
一个不错的建议似乎是使用 hexbin 而不是 scatter。这看起来确实很有希望,但颜色仍然不能很好地融合。例如,
ax.hexbin(x1, y1, cmap='Reds', mincnt=1, vmax=100)
ax.hexbin(x2, y2, cmap='Blues', mincnt=1, vmax=50, alpha=0.8, linewidths=0)
产量:
让那些蓝色和红色融合起来真的很棒。也许每个像素都可以有来自一个数据集的 R 值,以及来自另一个数据集的 B 值或其他什么?但它似乎不是 hexbin 中的一个选项。
编辑
应用 Thomasillo 的答案后:
谢谢,我觉得比原版好看。
【问题讨论】:
-
你可以考虑改用 hexbin,如this example所示。
-
@BrenBarn hexbin 在这里有什么用处?这是一个两组密度。我也不明白您链接的示例是否应该解决这个特定问题。
-
您可以使用两个 hexbin,就像您当前使用两个散点图一样。如果您对两个 hexbin 使用不同的颜色图,并将两个 alpha 设置为某个非透明值,那么您可以获得两个在某些地方重叠的 hexbin。我不认为散点图(即使使用 alpha 值)对于具有如此多重叠的数据集来说是最佳选择。
-
我能想到的一个解决方案是单独绘制每个点,并根据在一定半径内靠近它的点数来更改其 alpha 值。(最近的邻居?)当然这需要你检查每个点与其他每个点 O(n^2) 并需要你摆弄一个距离计数函数,然后你需要根据它创建一个 alpha 值(这是很多不需要的工作做完了)。如果您更改绘图宽度/高度,它也会有所不同
-
我会尝试密度的等高线图——这意味着像六边形一样计算密度,但有时更容易阅读。
标签: python matplotlib alpha scatter-plot