如何对Seaborn FacetGrid图例排序?将'No'置于'Yes'上方
如何调整Seaborn FacetGrid图例顺序让'No'在'Yes'上方?
嘿,这个需求很常见,我给你两种实用的解决办法,按需选择就行:
方法一:从源头指定hue顺序(推荐)
在创建FacetGrid时,直接用hue_order参数定义你想要的显示顺序,这样后续生成的图例自然会遵循这个排序,代码修改后如下:
import pandas as pd import seaborn as sb from matplotlib import pyplot as plt df = sb.load_dataset('tips') # 通过hue_order指定['No', 'Yes'],让No优先显示 g = sb.FacetGrid(df, col='sex', hue='smoker', col_wrap=2, hue_order=['No', 'Yes']) g.map(plt.scatter, 'total_bill', 'tip', alpha=.7) g.add_legend() # 用add_legend()比直接调用axes.legend更规范,能自动匹配hue的设置 plt.show()
这里的hue_order参数可以直接锁定hue变量的展示顺序,配合g.add_legend()使用,能确保图例的颜色、文字和绘图元素完全对应,是最稳妥的方式。
方法二:手动调整已有图例的顺序
如果不想修改FacetGrid的初始化参数,也可以在生成图例时手动调整手柄和标签的顺序:
import pandas as pd import seaborn as sb from matplotlib import pyplot as plt df = sb.load_dataset('tips') g = sb.FacetGrid(df, col='sex', hue='smoker', col_wrap=2) g.map(plt.scatter, 'total_bill', 'tip', alpha=.7) # 获取当前图例的手柄和标签,重新排序后生成新图例 handles, labels = g.axes[-1].get_legend_handles_labels() # 按'No'、'Yes'的顺序重新索引 sorted_idx = [labels.index('No'), labels.index('Yes')] sorted_handles = [handles[i] for i in sorted_idx] sorted_labels = [labels[i] for i in sorted_idx] g.axes[-1].legend(sorted_handles, sorted_labels) plt.show()
这种方法适合已经生成绘图对象后,临时调整图例顺序的场景,通过提取现有图例元素,重新排序后再传入legend()函数即可。
内容的提问来源于stack exchange,提问作者Manojit
相关产品推荐
相关产品推荐

