在 sns relplot 的 facetgrid 中注释文本
Annotate text in facetgrid of sns relplot
使用以下数据框 (mx):
code Growth Value Risk Mcap
0 APOLLOHOSP 8 6 High small
1 ANUP 8 7 High small
2 SIS 4 6 High mid
3 HAWKINCOOK 5 2 Low mid
4 NEULANDLAB 6 4 Low large
5 ORIENTELEC 7 9 Low mid
6 AXISBANK 2 3 Medium mid
7 DMART 4 1 Medium large
8 ARVIND 2 10 Medium small
9 TCI 1 7 High mid
10 MIDHANI 5 5 Low large
11 RITES 6 4 Medium mid
12 COROMANDEL 9 9 High small
13 SBIN 10 3 Medium large
dataframe
我正在尝试创建一个 sns relplot,它应该在各自的 facetgrid 中注释散点图点。但是我得到的输出看起来像这样:
relplot
这里所有的注释都在第一个面中看到,其他面中的点没有任何注释。
我试过以下代码:
p1 = sns.relplot(x="Growth", y="Value", hue="Risk",col="Mcap",data=mx,s=200,palette = ['r','g','y'])
ax = p1.axes[0,0]
for idx,row in mx.iterrows():
x = row[1]
y = row[2]
text = row[0]
ax.text(x+0.5,y,text, horizontalalignment='left')
修改请指教。提前致谢。
主要问题是您设置了 ax = p1.axes[0,0]
,而 ax
应该是 p1.axes[0,colum_number]
,具体取决于文本必须去的子图的列号。
此外,寻址 row[0]
、row[1]
等会使代码的可读性降低,并且在发生变化时更不容易适应。因此,最好将行直接分配给一些变量,如text, x, y, _risk, mcap = row
。更易于维护的是 itertuples()
而不是 iterrows()
,如下面的代码所示。
为了使名称成为 space,您可以将 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()
使用以下数据框 (mx):
code Growth Value Risk Mcap
0 APOLLOHOSP 8 6 High small
1 ANUP 8 7 High small
2 SIS 4 6 High mid
3 HAWKINCOOK 5 2 Low mid
4 NEULANDLAB 6 4 Low large
5 ORIENTELEC 7 9 Low mid
6 AXISBANK 2 3 Medium mid
7 DMART 4 1 Medium large
8 ARVIND 2 10 Medium small
9 TCI 1 7 High mid
10 MIDHANI 5 5 Low large
11 RITES 6 4 Medium mid
12 COROMANDEL 9 9 High small
13 SBIN 10 3 Medium large
dataframe
我正在尝试创建一个 sns relplot,它应该在各自的 facetgrid 中注释散点图点。但是我得到的输出看起来像这样:
relplot
这里所有的注释都在第一个面中看到,其他面中的点没有任何注释。
我试过以下代码:
p1 = sns.relplot(x="Growth", y="Value", hue="Risk",col="Mcap",data=mx,s=200,palette = ['r','g','y'])
ax = p1.axes[0,0]
for idx,row in mx.iterrows():
x = row[1]
y = row[2]
text = row[0]
ax.text(x+0.5,y,text, horizontalalignment='left')
修改请指教。提前致谢。
主要问题是您设置了 ax = p1.axes[0,0]
,而 ax
应该是 p1.axes[0,colum_number]
,具体取决于文本必须去的子图的列号。
此外,寻址 row[0]
、row[1]
等会使代码的可读性降低,并且在发生变化时更不容易适应。因此,最好将行直接分配给一些变量,如text, x, y, _risk, mcap = row
。更易于维护的是 itertuples()
而不是 iterrows()
,如下面的代码所示。
为了使名称成为 space,您可以将 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()