在图中显示数据点集中度的一种好方法是使用具有非单位透明度的散点图。结果,浓度更高的区域会显得更暗。
# 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
它给出了这样的东西:
想象一下我们要强调异常值的情况。所以情况几乎是相反的:一个情节中不太集中的区域更大胆。 (对于我的简单示例可能有一个技巧,但想象一个一般情况,其中点的分布是事先不知道的,或者很难定义透明度/颜色权重的规则。)
我在想是否有任何方便的东西与 alpha
一样是专门为这项工作设计的。尽管也欢迎强调异常值的其他想法。
我正在寻找类似下图的东西,数据点越多,标记越不透明。
最佳答案
要回答这个问题:您可以计算点的密度,对其进行归一化并在颜色图的 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()
左边是原始图像,右边是密度较高的点具有较低 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()
在这里,低密度点仍然用较深的颜色强调,但同时观众可以清楚地看到最高密度位于中间。
关于python - matplotlib 中是否有任何行为像 alpha 但相反的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54457141/