Как создавать аннотации по всем осям lmplot?

#python #matplotlib #seaborn

#python #matplotlib #seaborn

Вопрос:

Сейчас я занимаюсь машинным обучением и хотел бы добавить аннотации к графикам кластеризации.

Здесь я использую данные образцов почвы и пытаюсь разделить их на несколько групп. Когда я фокусируюсь на определенном элементе, я хотел бы увидеть корреляции других элементов или узнать идентификаторы образцов и посмотреть их на карте. Сейчас я пытаюсь указать ID на графиках, но я не уверен, как это сделать с помощью lmplots.

 import pandas as pd
import seaborn as sns
sns.set()

data=pd.read_csv("E:ProgrammingPythonMatplotlibGeochemi_test3.csv", index_col=0) #reading my dataset

data_x = data.drop(labels=["E","N","B_ppm","Geology","Height"], axis=1)
data_y=data["Geology"]


from sklearn.decomposition import PCA

model = PCA(n_components=2)
model.fit(data_x)
X_2D = model.transform(data_x)
data['PCA1'] = X_2D[:, 0]
data['PCA2'] = X_2D[:, 1]
#sns.lmplot("PCA1", "PCA2", data=data, hue="Geology", fit_reg=False)


from sklearn.mixture import GaussianMixture as GMM
model = GMM(n_components=4,covariance_type='full')
model.fit(data_x)
y_gmm = model.predict(data_x)


data['cluster'] = y_gmm

fgrid = sns.lmplot("PCA1", "PCA2", data=data, hue="Se_ppm", col="cluster",fit_reg=False)
ax = fgrid.axes[0,0]
p1=sns.regplot(data=data, x="PCA1", y="PCA2", fit_reg=False, marker="o", scatter_kws={'s':10})

for line in range(0,data.shape[0]):
     p1.text(data.PCA1[line] 0.2, data.PCA2[line], data.index[line], horizontalalignment='left', size='medium', color='black', weight='semibold')
  

В результате этого кода я получаю этот график.
введите описание изображения здесь
Возможно ли добавлять аннотации по каждой оси? Здесь аннотации отображаются только по правым осям.
Когда я искал аннотации, я мог найти построение только на regplot. Могу ли я также создавать аннотации на lmplot, который разделен столбцами?

Комментарии:

1. Я не совсем уверен, почему аннотации не выстраиваются в линию, и сетки фасетов никогда не были моей сильной стороной, однако вы также можете заглянуть в этот модуль adjust_text , это также значительно облегчит чтение аннотаций. github.com/Phlya/adjustText

Ответ №1:

Возврат lmplot является FacetGrid . Вам нужно указать каждый объект Axes в FacetGrid, чтобы аннотировать каждый из них. Что-то вроде этого:

 for ax in fgrid.axes:
    for line in range(0,data.shape[0]): 
        ax.text(...)
  

Однако, вы, похоже, перезаписали последний объект Axes своим regplot вызовом. Я не уверен, что это намеренно.

Комментарии:

1. Это не намеренно. Я допустил ошибку в этой части. Сейчас я пытаюсь разобраться с осями.

2. Исходя из названия FacetGrid, я пытался выяснить, как отображать текст по каждой оси, но я не смог найти способ сделать это. Однако, извините за мой поздний ответ. Возможно, мне придется закрыть это и попробовать сделать это с другим подходом.

3. Вы определенно можете добавить текст к каждой оси в FacetGrid. Вам нужно получить объекты axes с помощью fgrid.axes . Это будет массив осей в FacetGrid в том же макете, что и фактический рисунок. Итак, чтобы добавить текст, например, к первым осям, вы должны сделать что-то вроде fgrid.axes[0,0].text(x, y, 'text')

4. Спасибо за дополнительную информацию. Однако, я получаю, TypeError: cannot convert the series to <class 'float'> когда пытаюсь выбрать оси с помощью fgrid.axes[0,0] . Есть ли способ избежать этого?

5. Это кажется странной ошибкой, возникающей при запуске fgrid.axes[0,0] . Вы уверены, что ошибка возникает именно там? Есть ли что-нибудь еще, что вы пытаетесь выполнить в той же строке?