Использование AdjustText, чтобы избежать дублирования меток с анализом соответствия принца Python

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

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

Вот код, создавший образ:

import pandas as pd
import prince
from adjustText import adjust_text

pd.set_option('display.float_format', lambda x: '{:.6f}'.format(x))
X=pd.DataFrame(data=[ ... my data ... ],
columns=pd.Series([ ... my data ... ]),
index=pd.Series([ ... my data ...]),
)

ca = prince.CA(n_components=2,n_iter=3,copy=True,check_input=True,engine='auto',random_state=42)
ca = ca.fit(X)
ca.row_coordinates(X)
ca.column_coordinates(X)
ax = ca.plot_coordinates(X=X,ax=None,figsize=(6, 6),x_component=0,y_component=1,show_row_labels=True,show_col_labels=True)

ax.get_figure().savefig('figure.png')

Во всех примерах adjustText, которые мне удалось найти, всегда был прямой доступ к координатам меток. Как в этом случае получить доступ к координатам меток? Как я могу применить adjust_text к этой фигуре?


person yannis    schedule 10.04.2020    source источник


Ответы (2)


Сначала отключите отображение ярлыков с помощью plot_coordinates():

ax = ca.plot_coordinates(X=X,ax=None,figsize=(6, 6),x_component=0,y_component=1,show_row_labels=False,show_col_labels=False)

Затем извлеките координаты столбцов и строк:

COLS=ca.column_coordinates(X).to_dict()
XCOLS=COLS[0]
YCOLS=COLS[1]
ROWS=ca.row_coordinates(X).to_dict()
XROWS=ROWS[0]
YROWS=ROWS[1]

Структуры XCOLS, YCOLS, XROWS, YROWS — это словари со значениями, которые являются числами с плавающей запятой (координаты). Давайте объединим два словаря оси X в один словарь оси X, который я назову XGLOBAL, то же самое для словарей оси Y, в YGLOBAL:

XGLOBAL={ k : XCOLS.get(k,0)+XROWS.get(k,0) for k in set(XCOLS) | set(XROWS) }
YGLOBAL={ k : YCOLS.get(k,0)+YROWS.get(k,0) for k in set(YCOLS) | set(YROWS) }

Теперь я просто применяю adjust_text(), как описано в документации:

fig = ax.get_figure()
texts=[plt.text(XGLOBAL[x],YGLOBAL[x],x,fontsize=7) for x in XGLOBAL.keys()]
adjust_text(texts,arrowprops=dict(arrowstyle='-', color='red'))
fig.savefig('newfigure.png')

И результат:

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

Обратите внимание, что в то время как генерация изображения была мгновенной без adjust_text, с adjust_text она заняла около 40 секунд.

person yannis    schedule 10.04.2020

Вы также можете поставить небольшой угол в итерации текстов. Я видел на своей стороне, что это помогает подпрограмме Adjust_text.

texts=[plt.text(XGLOBAL[x],YGLOBAL[x],x,fontsize=7, 
rotation = -XGLOBAL.keys()+2*x) for x in XGLOBAL.keys()]
person Anilom    schedule 17.05.2021