Как расположить Matplotlib разбрасывать друг на друга по шкале - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть 2 входа (x, y) и 3 класса для этих входов, которые я отмечаю разными цветами. Используя масштабирование, я могу видеть, сколько раз конкретный класс находился в определенной (x, y) точке.

Для отображения точек на графике я использую такой код:

ax.scatter(first_column, second_column, c=outputs_colors, s=labels_mean, alpha=0.3)


first_column - x_values; 
second_column - y_values; 
c=outputs_colors - colors for different classes; 
s=labels_mean - class share at a given point

Когда значения x, y являются различными числами с плавающей запятой - диаграммы являются информативными: Изображение рассеянного графика 1

Но когда x, y являются целыми числами и существует много совпадений в классах, диаграмма теряет ясность: Изображение рассеянного графика 2

Можно ли расположить рассеиватели по размеру от большего в качестве фона до меньшего в качестве переднего плана без использования цикла и отдельного plot.scatter для каждого класса? Чтобы получить что-то вроде этого: Изображение рассеянного графика 3

1 Ответ

0 голосов
/ 10 сентября 2018

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

x = [1.5, 1.5, 1.5, 1.5, 1.5, 2.6, 2.6, 2.6, 2.6, 2.6]
y = np.array([1.5, 3.0, 7.4, 20., 20., 1.5, 3.0, 7.4, 20., 20.])
s = np.array([100, 100, 100, 50, 100, 100, 100, 100, 50, 100])
c = np.array(['k', 'k', 'k', 'r', 'k', 'k', 'k', 'k', 'r', 'k'])

, если вы просто отобразите его как

from matplotlib import pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x, y, s=s, c=c)

Вы получите свою проблему, так как черные маркеры закрывают меньшие красные. Насколько я знаю, в matplotlib нет функции для решения этой проблемы, поэтому сначала нужно отсортировать свои баллы по s в обратном порядке.

import numpy as np
idx_sort = np.argsort(s)[::-1]
x, y, s, c = map(lambda vv: np.take(vv, idx_sort), [x, y, s, c])
...