如何在Matplotlib绘制的3D折线图中添加分段中断?
解决3D折线图不必要的中间连接线问题
你的问题出在:生成的x、y、z是把14组连续数据直接拼接成了一个长数组,plot3D会按数组顺序连接所有点,导致第1组的最后一个点(x=199、z=1)和第2组的第一个点(x=0、z=2)之间被错误连线,出现多余的中间线条。
解决核心是在每组数据之间插入NaN值——matplotlib绘制折线时,遇到NaN会自动中断,不会连接前后的点。
方法一:拆分重组数组(直观易懂)
先把原数组拆成14组,给每组末尾加一个NaN,再重新拼接成新数组:
import numpy as np import matplotlib.pyplot as plt # 生成原始数组 x = np.tile(np.arange(0,200), 14) y = np.random.randint(200, size=2800) z = np.repeat(np.arange(1,15), 200) # 每组200个点,拆分成14组 group_size = 200 x_groups = np.array_split(x, 14) y_groups = np.array_split(y, 14) z_groups = np.array_split(z, 14) # 给每组末尾添加NaN后拼接 x_new, y_new, z_new = [], [], [] for xg, yg, zg in zip(x_groups, y_groups, z_groups): x_new.append(np.append(xg, np.nan)) y_new.append(np.append(yg, np.nan)) z_new.append(np.append(zg, np.nan)) x_new = np.concatenate(x_new) y_new = np.concatenate(y_new) z_new = np.concatenate(z_new) # 绘制3D折线图 ax = plt.axes(projection='3d') ax.plot3D(x_new, z_new, y_new) plt.show()
方法二:直接插入NaN(更高效)
不用拆分数组,直接在每组的分界位置插入NaN,代码更简洁:
import numpy as np import matplotlib.pyplot as plt # 生成原始数组 x = np.tile(np.arange(0,200), 14) y = np.random.randint(200, size=2800) z = np.repeat(np.arange(1,15), 200) group_size = 200 # 计算要插入NaN的位置:第200、400...2600位 insert_positions = np.arange(group_size, len(x), group_size) # 在指定位置插入NaN x_new = np.insert(x, insert_positions, np.nan) y_new = np.insert(y, insert_positions, np.nan) z_new = np.insert(z, insert_positions, np.nan) # 绘图 ax = plt.axes(projection='3d') ax.plot3D(x_new, z_new, y_new) plt.show()
两种方法都能让每组数据的折线独立,不会出现跨组的多余连接线。
内容的提问来源于stack exchange,提问作者Kathan Vyas
相关产品推荐
相关产品推荐

