Вы можете рассчитать плотность точек, нормализовать ее и закодировать в альфа-канале карты цветов.
(.env) boris@boris-All-Series:~/ALPHA$ cat alphaViceVersa.py
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
# this is synthetic example
N = 25000 # 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.Greys([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()
(.env) boris@boris-All-Series:~/ALPHA$ python3 alphaViceVersa.py
Слева — исходное изображение, справа — изображение, где точки с более высокой плотностью имеют более низкую альфу.
Однако, что это нежелательно, поскольку прозрачные точки с высокой плотностью неотличимы от точек с низкой плотностью, т.е. на правом изображении это действительно выглядит так, как будто у вас есть дыра в середине вашего дистрибутива.Решение с цветовой картой, которая не содержит цвета фона.
(.env) boris@boris-All-Series:~/ALPHA$ cat alphaViceVersa1.py
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# this is synthetic example
N = 25000 # 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()
No comments:
Post a Comment