Суммирование перекрывающихся пузырьков с градиентом в python - PullRequest
3 голосов
/ 07 февраля 2020

Я хочу построить карту указанных c сайтов, чтобы интерпретировать их влияние на окружающую городскую среду. Для этого я хотел бы построить участки в виде пузырьков с уменьшающимся градиентом к краю круга, где градиент перекрывающихся кругов равен сумме.

В качестве примера я использовал это:

# libraries
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

# create data
x = np.random.rand(15)
y = x+np.random.rand(15)
z = x+np.random.rand(15)
z=z*z

# Change color with c and alpha. I map the color to the X axis value.
plt.scatter(x, y, s=1500, c=z, cmap="Blues", alpha=0.4, edgecolors="grey", linewidth=1)

# Add titles (main and on axis)
plt.xlabel("the X axis")
plt.ylabel("the Y axis")
plt.title("A colored bubble plot")

plt.show();

, который производит:

enter image description here

Однако цвет кружков не уменьшается, и они не кажутся Подводя итог предполагаемому способу.

Есть ли какой-нибудь умный способ сделать это, или это может быть проще с каким-либо решением для тепловых карт, или с использованием сеток и эффекта затухания на соседних плитках?

1 Ответ

1 голос
/ 08 февраля 2020

Вот подход с плотностями, размещенными в каждом x и y, увеличенными на значение z. В зависимости от расстояния до каждой позиции x, y добавляется величина.

import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import norm # calculate the length of a vector
# import seaborn as sns

# create data
x = np.random.rand(15)
y = x+np.random.rand(15)
z = x+np.random.rand(15)
z=z*z

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12,5))
# Change color with c and alpha. I map the color to the X axis value.
ax1.scatter(x, y, s=1500, c=z, cmap="Blues", alpha=0.4, edgecolors="grey", linewidth=1)
ax1.set_xlabel("the X axis")
ax1.set_ylabel("the Y axis")
ax1.set_title("A colored bubble plot")

centers = np.dstack((x, y))[0]
xmin = min(x)-0.2
xmax = max(x)+0.2
ymin = min(y)-0.2
ymax = max(y)+0.2
zmin = min(z)
zmax = max(z)
xx, yy = np.meshgrid(np.linspace(xmin, xmax, 100),
                     np.linspace(ymin, ymax, 100))
xy = np.dstack((xx, yy))
zz = np.zeros_like(xx)
for ci, zi in zip(centers, z):
    sigma = zi / zmax * 0.3
    sigma2 = sigma ** 2
    zz += np.exp(- norm(xy - ci, axis=-1) ** 2 / sigma2 / 2)

img = ax2.imshow(zz, extent=[xmin, xmax, ymin, ymax], origin='lower', aspect='auto', cmap='Blues')
#plt.colorbar(img, ax=ax2)

ax2.set_xlabel("the X axis")
ax2.set_ylabel("the Y axis")
ax2.set_title("Density depending on z")

plt.show()

На графике сравниваются два подхода с использованием одинаковых случайных данных.

sample plot

...