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

