You need to enable JavaScript to run this app. Python3 Matplotlib实现基于条件更换标记的折线图绘制问题
优惠活动
大模型
产品
解决方案
定价
更多

Python3 Matplotlib实现基于条件更换标记的折线图绘制问题

现有代码的核心问题
  • 循环内每次仅传入单个y值调用ax.plot(),没有为每个点指定对应的x轴坐标,matplotlib会自动将所有单点的x坐标设为0,最终所有点全堆叠在x=0的位置,既无法形成连续折线,也没有横向排布
  • 逐点单独调用plot的逻辑不会自动连接相邻点的线段,无法生成预期的连续折线效果
  • 循环内重复传入完全相同的图例标签,会导致生成的图例出现大量重复条目
实现思路
  1. 锚定坐标逻辑:以数组的行索引作为x轴取值,数组第一列的数值作为y轴值,先生成无标记的连续黑色折线,保证基础线条连贯
  2. 按照第二列的判断条件拆分两组数据点:
    • 筛选出第二列值大于50的点,单独为这组点配置圆形(o)标记
    • 筛选出第二列值不满足大于50条件的点,单独为这组点配置叉形(x)标记
  3. 每类数据仅传入一次图例标签,避免图例重复
可直接运行的修正代码
import numpy as np
import matplotlib.pyplot as plt
import random

# 生成测试数据,固定随机种子保证可复现
random.seed(42)
randomlist = random.sample(range(0, 100), 100)
arr = np.array(randomlist)
arr_re = arr.reshape(50, 2)

# 提取绘图坐标与判断掩码
x = np.arange(len(arr_re))
y = arr_re[:, 0]
mask = arr_re[:, 1] > 50

figure, ax = plt.subplots(figsize=(13, 6))
# 绘制基础连续折线
ax.plot(x, y, color="black", linestyle="-", linewidth=1, zorder=1)
# 分条件绘制对应样式的标记
ax.scatter(x[mask], y[mask], marker="o", color="black", label='第二列值>50', zorder=2)
ax.scatter(x[~mask], y[~mask], marker="x", color="black", label='第二列值<=50', zorder=2)

ax.legend()
plt.show()

补充:如果需要折线本身根据条件切换样式,可在条件突变的断点处拆分线段逐段绘制,无需逐点遍历。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 22:45:03