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

Matplotlib标注子图后出现蓝色粗线问题的代码修改方案

问题原因

加粗蓝色线条是同位置同色图形叠印导致的,和添加图例的操作无关:

  • 代码先调用ax.plot()绘制了默认样式的蓝色连续折线
  • 之后又调用ax.scatter()在完全一致的坐标点上绘制了同色系散点
  • 散点沿折线紧密排布,和底层折线完全重叠,视觉上就会呈现出线条异常加粗的效果。

子图加粗线条异常效果

修改方案

根据实际可视化需求选一种即可:

方案1:需要折线+数据点标记(最常用)

删除单独的scatter调用,直接在plot()方法中通过marker参数配置点样式,从根源避免叠印,同时直接在绘图时设置label,简化图例调用:

import numpy as np
import matplotlib.pyplot as plt

def plot_en(filename):
    data_0 = np.loadtxt(f"{filename[0]}.en")
    data_1 = np.loadtxt(f"{filename[1]}.en")

    fig, (ax0, ax1) = plt.subplots(1, 2)
    plt.subplots_adjust(top=1, bottom=0.08, left=1.5, right=3.5, hspace=0.25, wspace=0.35)

    # 同时绘制折线和点标记,直接绑定图例文本
    ax0.plot(data_0[:, 0], data_0[:, 1], marker='o', label="Admitted")
    ax1.plot(data_1[:, 0], data_1[:, 1], marker='o', label="Not_Admitted")

    ax0.set(xlabel="step", ylabel="time")
    ax1.set(xlabel="step", ylabel="time")

    ax0.legend()
    ax1.legend()

plot_en(["forward0-on", "forward1-on"])

方案2:需要独立设置折线和散点样式

如果要对折线和散点做差异化样式(比如点线不同色、点带边缘),给散点设置区别于折线的颜色,同时调高散点的图层优先级让点浮在线上方,避免同色叠印:

import numpy as np
import matplotlib.pyplot as plt

def plot_en(filename):
    data_0 = np.loadtxt(f"{filename[0]}.en")
    data_1 = np.loadtxt(f"{filename[1]}.en")

    fig, (ax0, ax1) = plt.subplots(1, 2)
    plt.subplots_adjust(top=1, bottom=0.08, left=1.5, right=3.5, hspace=0.25, wspace=0.35)

    # 绘制折线
    ax0.plot(data_0[:, 0], data_0[:, 1], color="#1f77b4", linewidth=1.5)
    # 绘制差异化样式的散点,zorder调高让点显示在线上层
    ax0.scatter(
        data_0[:, 0], data_0[:, 1],
        color="white", edgecolor="#1f77b4", s=30, zorder=2,
        label="Admitted"
    )

    ax1.plot(data_1[:, 0], data_1[:, 1], color="#1f77b4", linewidth=1.5)
    ax1.scatter(
        data_1[:, 0], data_1[:, 1],
        color="white", edgecolor="#1f77b4", s=30, zorder=2,
        label="Not_Admitted"
    )

    ax0.set(xlabel="step", ylabel="time")
    ax1.set(xlabel="step", ylabel="time")

    ax0.legend()
    ax1.legend()

plot_en(["forward0-on", "forward1-on"])

如果只需要展示散点、不需要折线,直接删除两行ax.plot()相关代码即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:21:23