Matplotlib绘图如何去除(0,0)到(1,0)的多余连线
问题描述
直接使用爬取到的坐标数据调用绘图接口时会出现多余连线,原始测试代码如下:
x = [0.0000000,0.0082707,0.0132000, 0.0255597, 0.0503554, 0.0751941, 0.1000570, 0.1498328, 0.1996558, 0.2495240, 0.2994312, 0.3993490, 0.4993711, 0.5994664, 0.6996058, 0.7997553, 0.8998927, 0.9499514, 1.0000000, 0.0000000, 0.006114, 0.0062188, 0.0087532, 0.0138088, 0.0264052, 0.0515127, 0.0765762, 0.1016176, 0.1516652, 0.2016828, 0.2516733, 0.3016387, 0.4015163, 0.5013438, 0.6011363, 0.7008976, 0.8006328, 0.9003380, 0.9501740, 1.0000000] y = [0.0000000, 0.0233088, 0.0298517, 0.0425630, 0.0603942, 0.0739301, 0.0850687, 0.1023515, 0.1149395, 0.1230325, 0.1272298, 0.1253360, 0.1130538, 0.0934796, 0.0695104, 0.0445423, 0.0207728, 0.0098870, 0.0000000, 0.0000000, -.0208973, -.0210669, -.0247377, -.0307807, -.0416431, -.0548774, -.0637165, -.0703581, -.0801452, -.0869356, -.0910290, -.0926252, -.0905235, -.0834273, -.0728351, -.0591463, -.0428603, -.0235778, -.0122883, 0.0000000] plt.plot(x,y)
运行后会生成一条从坐标点(1,0)跨连到(0,0)的多余连线,不符合预期。数据内包含两组重复的(0,0)、(1,0)端点,手动删点无法解决问题,需要可自动化执行的处理逻辑。
问题原因
plt.plot()默认会将传入的所有坐标点按数组顺序依次首尾连线,你拿到的x、y数组实际是两条独立曲线的点位直接拼接得到的:前19个点是上半支y≥0的曲线,到(1,0)结束;从第20个点开始是下半支y≤0的曲线,从(0,0)重新开始。接口默认把第一条曲线的终点和第二条曲线的起点连起来,就形成了那条跨区域的多余连线。
解决方案
完全可以通过判断逻辑实现自动化处理,不需要手动删点、也不需要针对单组数据写死分段索引,两种通用方法如下:
- 纯Python判断断点分段绘图
利用单段曲线x值从0到1单调递增的规律,遍历点位时如果发现当前x值比段内上一个x值小,就说明到了两段曲线的分界点,拆分后逐段绘图即可:import matplotlib.pyplot as plt # 自动拆分曲线段 segments_x = [] segments_y = [] current_x, current_y = [], [] for xi, yi in zip(x, y): # 核心判断:当前段已有数据,且x值出现跳变回落,说明到了分段点 if current_x and xi < current_x[-1]: segments_x.append(current_x) segments_y.append(current_y) current_x, current_y = [], [] current_x.append(xi) current_y.append(yi) segments_x.append(current_x) segments_y.append(current_y) # 逐段绘图,不会产生跨段连线 for sx, sy in zip(segments_x, segments_y): plt.plot(sx, sy) plt.show() - 插入NaN值自动断连
Matplotlib绘制折线时遇到NaN值会自动断开连线,找到分段位置插入空值即可,不需要拆分多个数组:import numpy as np import matplotlib.pyplot as plt x_arr = np.array(x) y_arr = np.array(y) # 定位x值下降的分段位置 break_pos = np.where(np.diff(x_arr) < 0)[0] + 1 # 在分段位置插入NaN x_fixed = np.insert(x_arr, break_pos, np.nan) y_fixed = np.insert(y_arr, break_pos, np.nan) # 直接绘图即可自动断开多余连线 plt.plot(x_fixed, y_fixed) plt.show()
两种方法对同类型爬取数据通用,只要单段曲线满足x从0到1单调递增、段间x跳回起始值的规律,都可以自动识别分段,不需要人工调整。
内容的提问来源于stack exchange,提问作者John Chae
相关产品推荐
相关产品推荐

