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

Matplotlib技术问题:如何让图表图例更简洁紧凑?

解决图例冗余问题,实现类似ggplot的简洁样式

你的问题核心是每个年份下的同类别(EN/TF/VA)都生成了重复的形状图例,这是因为你在散点绘图时给每个分组都加了label=gg[0],导致图例被多次创建。下面是具体的修复方案:

步骤1:修改绘图代码,避免重复添加图例标签

先保留折线(step)的年份标签,但去掉散点的标签,这样不会生成冗余的形状条目:

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import pandas as pd

# 假设你已定义好color_dict(年份对应颜色)和marker_dict(类别对应形状)
# 示例:color_dict = {2014: "#1f77b4", 2015: "#ff7f0e", 2016: "#2ca02c", 2017: "#d62728", 2018: "#9467bd", 2019: "#8c564b"}
# 示例:marker_dict = {"EN": "o", "TF": "s", "VA": "^"}

fig, ax = plt.subplots()

# 绘制年度折线(保留年份标签)
for year_group in df1.groupby(level="Jahr"):
    year, data = year_group
    ax.step(data.Monat, data.km, label=str(year), color=color_dict[year], where="post")
    
    # 绘制散点,但不添加label,避免重复图例
    for cat_group in data.groupby("Kat"):
        cat, cat_data = cat_group
        # 跳过NaN类别(如果不需要显示的话)
        if pd.isna(cat):
            continue
        ax.scatter(cat_data.Monat, cat_data.km, marker=marker_dict[cat], color=color_dict[year])

步骤2:手动创建中性色的形状图例

用Line2D模拟散点的形状,生成三个中性色(比如深灰色)的图例条目,然后和年份的颜色图例合并:

# 创建自定义形状图例(中性色)
shape_legend_handles = [
    Line2D([0], [0], marker=marker_dict["EN"], color="darkgray", linestyle="None", markersize=8, label="EN"),
    Line2D([0], [0], marker=marker_dict["TF"], color="darkgray", linestyle="None", markersize=8, label="TF"),
    Line2D([0], [0], marker=marker_dict["VA"], color="darkgray", linestyle="None", markersize=8, label="VA")
]

# 获取现有年份图例的手柄和标签
year_handles, year_labels = ax.get_legend_handles_labels()

# 合并两个图例:年份颜色 + 形状类别
ax.legend(
    handles=year_handles + shape_legend_handles,
    labels=year_labels + ["EN", "TF", "VA"],
    loc="best"  # 可以根据需求调整位置,比如"upper left"
)

plt.show()

为什么这样有效?

  • 去掉散点的label参数后,Matplotlib只会为折线生成年份对应的图例,不会重复添加每个年份下的类别形状。
  • 手动创建的Line2D对象用中性色统一展示形状,避免了不同年份颜色对形状图例的干扰,完全符合你想要的ggplot风格。
  • 合并图例后,用户可以同时看到年份的颜色区分和类别的形状区分,信息清晰无冗余。

内容的提问来源于stack exchange,提问作者musbur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:45