Thursday, September 8, 2022

What behaves like alpha but reversed

 Вы можете рассчитать плотность точек, нормализовать ее и закодировать в альфа-канале карты цветов.


(.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