如何在Matplotlib中按条件显示Seaborn散点图的文本标签
实现方案
方法1:修改原有循环,增加条件判断(改动最小)
只需要在原有循环的plt.text逻辑外增加条件判断即可,修改后完整代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造数据集 data = {'Var1':[3, 8, 4, 2, 13], 'Var2':[5, 7, 9, 10, 15], 'Name':['obs1', 'obs2', 'obs3', 'obs4', 'obs5']} df1 = pd.DataFrame(data) # 绘制散点图 sns.scatterplot(data=df1,x='Var1',y='Var2') # 仅给符合条件的点加标签 for i in range(df1.shape[0]): # 增加Var2的条件判断:高于14 或 低于8 if df1.Var2[i] > 14 or df1.Var2[i] < 8: plt.text(x=df1.Var1[i]+0.3, y=df1.Var2[i]+0.3,s=df1.Name[i], fontdict=dict(color="black",size=10), bbox=dict(facecolor="white",alpha=0.5)) plt.show()
运行后只会给obs1(Var2=5<8)、obs2(Var2=7<8)、obs5(Var2=15>14)三个点添加标签。
方法2:先筛选符合条件的子集再遍历(数据量大时效率更高)
先过滤出满足条件的观测点,再遍历子集添加标签,不需要遍历全量数据:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt data = {'Var1':[3, 8, 4, 2, 13], 'Var2':[5, 7, 9, 10, 15], 'Name':['obs1', 'obs2', 'obs3', 'obs4', 'obs5']} df1 = pd.DataFrame(data) sns.scatterplot(data=df1,x='Var1',y='Var2') # 先筛选符合条件的子集 cond = (df1['Var2'] > 14) | (df1['Var2'] < 8) df_label = df1[cond] # 遍历子集添加标签 for _, row in df_label.iterrows(): plt.text(x=row['Var1']+0.3, y=row['Var2']+0.3, s=row['Name'], fontdict=dict(color="black",size=10), bbox=dict(facecolor="white",alpha=0.5)) plt.show()
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

