Как рассчитать плотность полярного графика в matplotlib - PullRequest
0 голосов
/ 09 марта 2019

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

Как сделать график рассеяния, окрашенный по плотности в matplotlib?

Мой код:

# Calculate the point density: Saccade Orientation is an angle, Amplitude is supposed to be the Y value
xy = np.vstack([saccade_orientation_PP, saccade_amplitude_PP])
z = gaussian_kde(xy)(xy)

# Sort the points by density, so that the densest points are plotted last
idx = z.argsort()
x, y, z = np.array(saccade_orientation_PP)[idx], np.array(saccade_amplitude_PP)[idx], z[idx]

ax1 = plt.subplot(121, polar=True)
ax1.scatter(saccade_orientation_PP, saccade_amplitude_PP, c=z, edgecolor='', alpha = 0.75)

Это результат, который я получаю, если Я не использую две строки кода, которые сортируют точки по плотности (закомментировано)

Resulting image **without** values sorted by z

И это результат, когда сортировка реализована

Resulting image **with** values sorted by z

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

Спасибо.

1 Ответ

1 голос
/ 09 марта 2019

Ключевым вопросом здесь является использование полярных координат.

Плотности должны быть вычислены по xy декартовым координатам, использование полярных координат приводит к странным значениям расстояния, попробуйте вывести ваши данные на прямоугольный график и увидите.

Вы можете включить преобразование координат до вычисления значений z. E.g.:

xy = np.vstack([np.sin(angle)*amp, np.cos(angle)*amp]) 
z = gaussian_kde(xy)(xy) 
...