Seaborn绘制DataFrame时指定Target列线型后图例不匹配求助
问题解决:Seaborn绘图图例样式不匹配
问题根源:你手动调用ax.legend(legend)时,相当于完全重置了图例——直接用传入的文字生成新图例,完全没关联之前绘图时设置的Target列的线条样式,所以图例里的$z^*$才会显示默认的蓝色实线。
给你两种解决思路:
思路1:让Seaborn自动生成匹配样式的图例
直接给第二个lineplot指定label,让Seaborn自动合并两部分的图例,样式会自动同步:
fig = plt.figure() # 绘制其他列,自动生成图例项 ax = sns.lineplot(data=df[cols_to_plot]) # 绘制Target列,指定label,样式和图例绑定 ax = sns.lineplot(data=df['Target'], linestyle="-.", color='k', label=r'$z^*$') ax.set_ylabel(y_label) ax.set_xlabel(x_label) # 删掉手动传legend的代码,用Seaborn自动生成的图例 # ax.legend(legend) fig.tight_layout() fig.savefig(sv_pth, format='pdf')
思路2:自定义图例文字同时保留样式
如果需要保留原来的legend列表自定义文字,先让Seaborn生成带样式的图例,再修改对应文本:
fig = plt.figure() ax = sns.lineplot(data=df[cols_to_plot]) # 给Target列临时指定一个label,方便后续定位 ax = sns.lineplot(data=df['Target'], linestyle="-.", color='k', label='Target') ax.set_ylabel(y_label) ax.set_xlabel(x_label) # 获取现有图例的手柄和标签 handles, labels = ax.get_legend_handles_labels() # 找到Target对应的位置,替换成你需要的$z^*$ target_pos = labels.index('Target') labels[target_pos] = r'$z^*$' # 用修改后的标签更新图例 ax.legend(handles, labels) fig.tight_layout() fig.savefig(sv_pth, format='pdf')
内容的提问来源于stack exchange,提问作者derekboase
相关产品推荐
相关产品推荐

