Попытка создать цветную карту для большинства перекрывающихся точек - PullRequest
0 голосов
/ 08 ноября 2019

Я столкнулся с проблемой, пытаясь создать цветную карту в диаграмме рассеяния. Вот часть моего кода:

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

    f, ax = plt.subplots()

    xy = np.vstack([x, y])
    xy = xy[~np.isnan(xy)]
    z = gaussian_kde(xy)(xy)

    idx = z.argsort()
    x, y, z = x[idx], y[idx], z[idx]

    plt.scatter(x, y, c=z, cmap='Reds', alpha=0.5)

x и y - оба столбца в моем фрейме данных panda, и у них обоих есть значения NaN. Я попытался извлечь все значения NaN, выполнив ~ np.isnan (xy), чтобы получить только фактические значения, так как он не позволял мне получать инфы или NaN, поскольку я считаю, что gaussian_kde () выдавала эту ошибку. Кроме того, оба столбца не совпадают друг с другом с точки зрения того, где находятся эти значения NaN, и один столбец имеет больше значений NaN, чем другой. Оба также имеют одинаковое количество элементов. Когда я запускаю свой код, он просто продолжает работать, и мне приходится его останавливать. Есть идеи, что может быть не так?

1 Ответ

1 голос
/ 08 ноября 2019

Вы должны отфильтровать Nans, используя:

inds = ~np.logical_or(np.isnan(x), np.isnan(y))
x = x[inds]
y = y[inds]

Из этого примера , я думаю, ваш код должен выглядеть следующим образом:

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

# Generate fake data
x = np.random.normal(size=1000)
y = x * 3 + np.random.normal(size=1000)

# removing nans in both vectors at the same place
inds = ~np.logical_or(np.isnan(x), np.isnan(y))
x = x[inds]
y = y[inds]

# Calculate the point density
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)

fig, ax = plt.subplots()
ax.scatter(x, y, c=z, s=100, edgecolor='')
plt.show()

Просто оставайтесь впомните, что если x и y - очень большие векторы, gaussian_kde может занять много времени. Для длины вектора 50000 для запуска требуется около 40,5 с.

...