You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:31:57