pylab: отображение точек с цветами и метками (идентификаторы, а не категории)

Я пытаюсь построить точки как с цветами, так и с метками. Это не классическая проблема: обычно пользователи Python устанавливают «метки» как категории. В этом случае я хочу, чтобы цвет представлял собой функцию, а метка была идентификатором самой точки. Это следует из игрушечного примера:

x = [-0.01611772,  1.51755901, -0.64869352, -1.80850313, -0.11505037]
y = [ 0.04845168, -0.45576903,  0.62703651, -0.24415787, -0.41307092]

colors = ['b', 'g', 'r', 'b', 'r']
labels = ['Gioele', 'Felix', 'Elpi', 'Roro', 'Cacara']

Я хотел бы использовать функцию разброса. После «быстрой» документации:

def scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs) Inferred type: (x: Any, y: Any, s: int, c: Any, marker: unicode, cmap: Any, norm: Any, vmin: Any, vmax: Any, alpha: Any, linewidths: Any, verts: Any, edgecolors: Any, hold: Any, data: Any, kwargs: dict) -> Any

Итак, моя попытка была:

import pylab
pylab.scatter(x, y, c=colors, data=labels)
pylab.show()

но, кажется, игнорируя часть data=labels.

Кроме того: предположим, что мы можем нанести метки, есть ли способ нанести их «умным» способом, то есть таким, чтобы метки не скрывали друг друга? Мне нужно что-то похожее на функцию R ggrepel.


person Andrea Ianni ௫    schedule 25.10.2016    source источник


Ответы (1)


Я думаю, что здесь можно использовать plt.annotate. Чтобы взять ваш пример:

import matplotlib.pyplot as plt

x = [-0.01611772,  1.51755901, -0.64869352, -1.80850313, -0.11505037]
y = [ 0.04845168, -0.45576903,  0.62703651, -0.24415787, -0.41307092]
colors = ['b', 'g', 'r', 'b', 'r']
labels = ['Gioele', 'Felix', 'Elpi', 'Roro', 'Cacara']

plt.scatter(x,y,c=colors)
for label,xi,yi in zip(labels,x,y):
    plt.annotate(label,xy=(xi,yi),textcoords='offset points',
    ha='left',va='bottom')

Это дает следующий результат:

введите здесь описание изображения

Редактировать: я только что заметил, что вы также спрашивали о перекрывающихся метках. У этого вопроса есть хорошее решение. Также, по-видимому, есть фрагмент кода на github, предназначенный для эмуляции ggrepel.

person Angus Williams    schedule 25.10.2016
comment
UserWarning: вы использовали textcoords kwarg, но не xytext kwarg. Это может привести к удивительным результатам... несмотря на это.... это работает. Я надеялся, что смогу избежать цикла, но... по крайней мере, у меня есть решение. Спасибо! :) - person Andrea Ianni ௫; 25.10.2016
comment
Просто отредактировано, чтобы включить некоторые вещи о предотвращении перекрытия меток, извините, я не заметил этого первым. Забавно, я не понял UserWarning, о котором вы говорите. Вы получили это предупреждение, просто выполнив код, который я разместил выше? - person Angus Williams; 25.10.2016
comment
Мне пришлось удалить часть textcoords='offset points',, чтобы получить все метки. - person Jean-François Fabre; 17.01.2019