如何调整Seaborn Jointplot图例中指定标记的颜色为灰色?
问题
使用Seaborn jointplot并叠加多个Matplotlib散点图层后,需要将图例中后五个标记(对应“3”“4”“5”“6”“8”)的颜色改为灰色(#b9b9bd)。
解决方案
核心是获取图例手柄后,直接修改指定手柄的标记颜色:
- 提取当前图例的手柄与标签
- 遍历后五个对应气缸数的手柄,设置其标记填充色为目标灰色,同时保留黑色边缘保证辨识度
- 重新生成图例
修改后的完整代码
# 导入包 import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np # 加载mpg数据集 mpg_df = sns.load_dataset("mpg") mpg_df = ( mpg_df .astype({"cylinders":"category"}) ) mpg_df["cylinders"] = ( mpg_df["cylinders"] .cat .as_ordered() ) # 设置标记 _markers_cylinders = { 3:"P", 4:"d", 5:"v", 6:"X", 8:"s" } # 设置国家对应的颜色 _palette_origin = { "usa":"#fca847", "japan":"#8aed7b", "europe":"#7b81ed" } kws={ "s": 225, "linewidth": 2 } # 绘制jointplot——仅保留边缘分布 jp = sns.jointplot( data=mpg_df, x="weight", y="mpg", hue="origin", palette=_palette_origin, markers=",", marginal_kws={"fill":True}, color="w", height=10, s=1 ) # 在jointplot上按产地和气缸数分层绘制散点图 origin = ["usa", "japan", "europe"] for nation in origin: df = mpg_df[mpg_df["origin"] == nation] for k,v in _markers_cylinders.items(): jp.ax_joint.scatter( data=df[df["cylinders"]==k], x="weight", y="mpg", marker=_markers_cylinders[k], c=_palette_origin[nation], edgecolor="k", alpha=0.6, **kws ) jp.ax_joint.grid( color="k", linestyle=":", linewidth=0.75 ) han, lab = jp.ax_joint.get_legend_handles_labels() # 修改后五个图例标记的颜色为灰色 for handle in han[3:8]: handle.set_markerfacecolor("#b9b9bd") handle.set_markeredgecolor("k") # 保持边缘黑色,确保标记清晰 lab = [ "USA", "Japan", "Europe", "3", "4", "5", "6", "8" ] jp.ax_joint.legend( han[0:8], lab[0:8], title="Origin & Cylinders", fontsize=15, bbox_to_anchor=(1.20, 1), title_fontsize = 14, markerscale=2.5, shadow = True ) sns.move_legend( jp.ax_joint, loc="upper left", bbox_to_anchor=(1.20, 1), markerscale=0.25 ) plt.show()
效果说明
修改后,图例中代表气缸数的五个标记会显示为灰色填充、黑色边缘的样式,与代表产地的彩色标记形成明确区分,同时不会改变图表中实际散点的颜色。
内容的提问来源于stack exchange,提问作者907Resident
相关产品推荐
相关产品推荐

