Точечный график с различным текстом в каждой точке данных, который соответствует размеру и цвету маркера - PullRequest
0 голосов
/ 29 января 2020

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

Код, который я использую для построения диаграммы рассеяния ниже:

  plot = plt.figure(figsize=(30,20))
ax = sns.scatterplot(x='Recipients', y='Donors', data=concatenated, hue = 'Cost of Transfer',
                     palette="Set2", s= 300)

def label_point(x, y, val, ax):
    a = pd.concat({'x': x, 'y': y, 'val': val}, axis=1)
    for i, point in a.iterrows():
        ax.text(point['x']+.1, point['y'], str(point['val']))

label_point(concatenated.Recipients, concatenated.Donors, concatenated.Species, plt.gca())

enter image description here

Любая помощь очень ценится :)

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Было бы довольно сложно и, вероятно, подвержено ошибкам попытаться найти цвета точек в sns.scatterplot(). Вам действительно нужно использовать scatterplot()?

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

iris = sns.load_dataset("iris")
iris['label'] = 'label_'+iris.index.astype(str) # create a label for each point

df = iris
x_col = 'sepal_length'
y_col = 'sepal_width'
hue_col = 'species'
label_col = 'label'
palette = 'Set2'
size = 5

fig, ax = plt.subplots()
colors = matplotlib.cm.get_cmap(palette)(range(len(df[hue_col].unique())))
for (g,temp),c in zip(iris.groupby('species'),colors):
    print(g,c)
    ax.plot(temp[x_col], temp[y_col], 'o', color=c, ms=size, label=g)
    for i,row in temp.iterrows():
        ax.annotate(row[label_col], xy=(row[x_col],row[y_col]), color=c)
ax.set_xlabel(x_col)
ax.set_ylabel(y_col)
ax.legend(title=hue_col)

enter image description here

0 голосов
/ 29 января 2020

Текст на графике задается с помощью ax.text (), matplotlib axes.text .

# Before
ax.text(point['x']+.1, point['y'], str(point['val']))
# After
ax.text(point['x']+.1, point['y'], str(point['val']), {'color': 'g', 'fontsize': 20})

Попробуйте цвет и размер шрифта, который вам нравится.

...