Python.plt.sns. Аннотации к точкам на графике scatterplot, перенос длинных подписей, минимизация наложения

  1. в колонке keyword простые строки от 2 до 5 слов, в нижнем регистре, разделенные пробелами. Хочу настроить перенос, где в зависимости от количества слов в строке перенос будет каждые 2 слова или 1.
  2. Хочу настроить отображение - если подпись близко к краю, чтобы она не заходила, за график.
  3. Еще в задании необходимо сделать обводку для точек, не могу найти необходимый параметр.
  4. Конструкция if-else внутри метода выдает ошибку, ее видимо надо выносить за метод, возможно есть какие-то параметры на графике scatterplot или внутри plt.text, которые облегчат эти задачи, или это задание легче выполнить в plotly, где есть необходимые параметры.

UPDATE:

for a in df2['area'].unique():
# Выделяем область для построения графика
area = df2[df2['area']==a].copy()
# Функция для обработки словосочетаний
def str_n(row):
    lst = row.split(' ')
    if len(lst) == 2:
        return row.replace(' ', '\n')
    elif len(lst) == 3:
        return '{} {}\n{}'.format(lst[0],lst[1],lst[2])
    else:
        return '{} {}\n{} {}'.format(lst[0],lst[1],lst[2],lst[3])
# Добавляем перенос строк в словосочетаниях
area['annot'] = area['keyword'].apply(str_n)

plt.figure(figsize=(15,15), dpi=100)
# Строим график
p1 = sns.scatterplot(x='x', y='y', 
                 data=area, 
                 hue='cluster_name',
                 legend=True, markers=True) 
# Добавляем подписи
for i in area.index:
    for ind in area.index:
        if (-0.2 < (area.x[i]-area.x[ind]) < 0 and (-0.2 < (area.y[i]-area.y[ind]) < 0.2)):
            p1.text(area.x[i]-i/1000, 
                    area.y[i]-i/1000 if area.y[i] <= 14 else area.y[i]-0.2, 
                    area.annot[i], 
                    horizontalalignment='right',
                    size=10, color='black')
        else:
            p1.text(area.x[i]+i/1000, 
                    area.y[i]+i/1000 if area.y[i] <= 14 else area.y[i]-0.2, 
                    area.annot[i], 
                    horizontalalignment='right' if area.x[i] >= 12.9 else 'left',
                    size=10, color='black')

plt.title(a, fontsize=20)
plt.xlim(0,15)
plt.ylim(0,15)
plt.show()  

Написал вот такой код c множеством условий, теперь если точки на графике расположены близко horizontalalignment='right'.

  • Вопрос 1: теперь появилась проблема наложения множественных подписей при 2ном переборе значений.
  • Вопрос 2: можно ли это сделать как то компактнее-лаконичнее

Ответы (0 шт):