python - matplotlib 中是否有任何行为像 alpha 但相反的东西?

标签 python matplotlib

在图中显示数据点集中度的一种好方法是使用具有非单位透明度的散点图。结果,浓度更高的区域会显得更暗。

# this is synthetic example
N = 10000       # a very very large number
x = np.random.normal(0, 1, N)
y = np.random.normal(0, 1, N)
plt.scatter(x, y, marker='.', alpha=0.1)  # an area full of dots, darker wherever the number of dots is more

它给出了这样的东西:

enter image description here

想象一下我们要强调异常值的情况。所以情况几乎是相反的:一个情节中不太集中的区域更大胆。 (对于我的简单示例可能有一个技巧,但想象一个一般情况,其中点的分布是事先不知道的,或者很难定义透明度/颜色权重的规则。)

我在想是否有任何方便的东西与 alpha 一样是专门为这项工作设计的。尽管也欢迎强调异常值的其他想法。


更新:当多个数据点分散在同一区域时会发生这种情况: enter image description here

我正在寻找类似下图的东西,数据点越多,标记越不透明。

enter image description here

最佳答案

要回答这个问题:您可以计算点的密度,对其进行归一化并在颜色图的 alpha channel 中对其进行编码。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

# this is synthetic example
N = 10000       # a very very large number
x = np.random.normal(0, 1, N)
y = np.random.normal(0, 1, N)


fig, (ax,ax2) = plt.subplots(ncols=2, figsize=(8,5))
ax.scatter(x, y, marker='.', alpha=0.1)

values = np.vstack([x,y])
kernel = stats.gaussian_kde(values)
weights = kernel(values)
weights = weights/weights.max()

cols = plt.cm.Blues([0.8, 0.5])
cols[:,3] = [1., 0.005]
cmap = LinearSegmentedColormap.from_list("", cols)

ax2.scatter(x, y, c=weights, s = 1, marker='.', cmap=cmap)

plt.show()

enter image description here

左边是原始图像,右边是密度较高的点具有较低 alpha 的图像。

但是请注意,这是不可取的,因为高密度透明点与低密度透明点无法区分。 IE。在右图中,它看起来真的好像你的分布中间有一个洞。

显然,具有不包含背景颜色的颜色图的解决方案不会让读者感到困惑。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# this is synthetic example
N = 10000       # a very very large number
x = np.random.normal(0, 1, N)
y = np.random.normal(0, 1, N)

fig, ax = plt.subplots(figsize=(5,5))

values = np.vstack([x,y])
kernel = stats.gaussian_kde(values)
weights = kernel(values)
weights = weights/weights.max()

ax.scatter(x, y, c = weights, s=9, edgecolor="none", marker='.', cmap="magma")

plt.show()

enter image description here

在这里,低密度点仍然用较深的颜色强调,但同时观众可以清楚地看到最高密度位于中间。

关于python - matplotlib 中是否有任何行为像 alpha 但相反的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54457141/

相关文章:

matplotlib - 删除 matplotlib 中的部分绘图

python - 使用 Python 和 Raspberry Pi 快速捕获和将 2D 图像堆叠为 3D numpy 数组

Python:找到最小的整数

python - 如何更改pygame图标?

python - Mac 上的 Visual Studio Code 中未出现 Matplotlib 图像

python - matplotlib 如何开始刻度从 Axis 原点留下空间

python - 删除列表中的项目并获取新列表?

python - Jython 单元测试

python - Matplotlib:Pcolor 创建巨大的图像

python - python plot 中的一个错误