Python.plt.sns. Аннотации к точкам на графике scatterplot, перенос длинных подписей, минимизация наложения
- в колонке keyword простые строки от 2 до 5 слов, в нижнем регистре, разделенные пробелами. Хочу настроить перенос, где в зависимости от количества слов в строке перенос будет каждые 2 слова или 1.
- Хочу настроить отображение - если подпись близко к краю, чтобы она не заходила, за график.
- Еще в задании необходимо сделать обводку для точек, не могу найти необходимый параметр.
- Конструкция 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: можно ли это сделать как то компактнее-лаконичнее
