Как расположить разбросанные файлы matplotlib друг над другом по масштабу

У меня есть 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

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

Sheldore 10.09.2018 11:57
0
1
66
1

Ответы 1

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

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])

Другие вопросы по теме