Основная проблема заключается в том, что вы устанавливаете ax = p1.axes[0,0]
, в то время как ax
должно быть p1.axes[0,colum_number]
в зависимости от номера столбца подзаговора, текст должен иметь значение go.
Далее, обращаясь к row[0]
, row[1]
et c. может сделать код менее читаемым и менее удобным для адаптации, когда что-то меняется. Поэтому лучше присваивать строку некоторым переменным, как в text, x, y, _risk, mcap = row
. Еще более легким в обслуживании будет itertuples()
вместо iterrows()
, как показано в приведенном ниже коде.
Чтобы освободить место для имени, вы можете расширить x-пределы немного вправо.
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
data = [['APOLLOHOSP', 8, 6, 'High', 'small'],
['ANUP', 8, 7, 'High', 'small'],
['SIS', 4, 6, 'High', 'mid'],
['HAWKINCOOK', 5, 2, 'Low', 'mid'],
['NEULANDLAB', 6, 4, 'Low', 'large'],
['ORIENTELEC', 7, 9, 'Low', 'mid'],
['AXISBANK', 2, 3, 'Medium', 'mid'],
['DMART', 4, 1, 'Medium', 'large'],
['ARVIND', 2, 10, 'Medium', 'small'],
['TCI', 1, 7, 'High', 'mid'],
['MIDHANI', 5, 5, 'Low', 'large'],
['RITES', 6, 4, 'Medium', 'mid'],
['COROMANDEL', 9, 9, 'High', 'small'],
['SBIN', 10, 3, 'Medium', 'large']]
mx = pd.DataFrame(data=data, columns=["code", "Growth", "Value", "Risk", "Mcap"])
plotnum = {'small': 0, 'mid': 1, 'large': 2}
p1 = sns.relplot(x="Growth", y="Value", hue="Risk", col="Mcap", data=mx, s=200, palette=['r', 'g', 'y'])
for ax in p1.axes[0]:
ax.set_xlim(0.0, max(mx["Growth"]) + 1.9)
for row in mx.itertuples():
ax = p1.axes[0, plotnum[row.Mcap]]
ax.text(row.Growth + 0.5, row.Value, row.code, horizontalalignment='left')
plt.show()
![resulting plot](https://i.stack.imgur.com/cUKKF.png)