Попытка создать карту цветов для большинства перекрывающихся точек

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

   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), чтобы получить только фактические значения, поскольку это не позволяло мне принимать infs или NaN, поскольку я считаю, что gaussian_kde() выдавало эту ошибку. Кроме того, оба столбца не совпадают друг с другом с точки зрения того, где находятся эти значения NaN, и один столбец содержит больше значений NaN, чем другой. Оба также имеют одинаковое количество элементов. Когда я запускаю свой код, он просто продолжает работать, и мне приходится его останавливать. Есть идеи, что может быть не так?


person researchnewbie    schedule 08.11.2019    source источник
comment
При публикации вашего примера, пожалуйста, покажите библиотеки, которые вы импортируете. Мы не знаем, откуда gaussian_kde. Каков типичный размер векторов x и y?   -  person Liris    schedule 08.11.2019
comment
@Liris Я пошел дальше и обновил, чтобы добавить импортированные пакеты. x и y векторы имеют размер около 200k.   -  person researchnewbie    schedule 09.11.2019


Ответы (1)


Вы должны отфильтровать 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 секунд.

person Liris    schedule 08.11.2019
comment
Я пошел вперед и скомпилировал, это сработало! Интересно, что для его компиляции потребовалось 300 секунд из-за больших размеров векторов, которые у меня есть. Можно ли как-то уменьшить это время без использования gaussian_kde? Я пытаюсь создать цветовую карту, которая отображала бы области с наибольшим количеством перекрывающихся точек. - person researchnewbie; 09.11.2019
comment
Я так не думаю. Если у вас достаточно большое количество точек, вы можете выбрать некоторые из них случайным образом, чтобы уменьшить количество точек, которые вы будете передавать до gaussian_kde ! - person Liris; 09.11.2019