Matplotlib指定marker='o'绘图时斧头图形出现异常连线的原因
斧头绘图异常连线问题解析
问题现象
使用Matplotlib绘制斧头图形时,斧刃上半部分(blade1)的最后一个点与斧刃下半部分(blade2)的第一个点之间出现了一条不必要的斜线,破坏了斧头的正常形状。
代码重现
import math import numpy as np import matplotlib.pyplot as plt def generate_axe_points(num_points=100): # 手柄部分 handle1_x = np.linspace(0.5, 1, num_points // 2) handle1_y = np.full(handle1_x.shape, 1) handle2_y = np.linspace(1, 5, num_points // 2) handle2_x = np.full(handle2_y.shape, 0.5) handle3_x = np.linspace(0.5, 1, num_points // 2) handle3_y = np.full(handle3_x.shape, 5) handle4_y = np.linspace(1, 5, num_points // 2) handle4_x = np.full(handle4_y.shape, 1) # 斧刃部分 blade1_x = np.linspace(1, 4, num_points // 2) blade1_y = 0.05 * blade1_x ** 2 - 0.2 * blade1_x + 5.15 blade2_x = np.linspace(1, 4, num_points // 2) blade2_y = -0.05 * blade2_x ** 2 + 0.2 * blade2_x + 3.5 x = np.concatenate([handle1_x, handle2_x, handle3_x, handle4_x, blade1_x, blade2_x]) y = np.concatenate([handle1_y, handle2_y, handle3_y, handle4_y, blade1_y, blade2_y]) return list(zip(x, y)) axe_points = generate_axe_points() # 绘制原始斧头 plt.figure(figsize=(12, 4)) plt.plot(*zip(*axe_points), 'b-', marker = 'o') plt.title("Original Axe Shape") plt.axis('equal') plt.show()
原因分析
plt.plot()函数会严格按照传入点的顺序依次连接相邻点:
- blade1的点是从x=1到x=4生成的,最后一个点坐标为(4, 5.95)
- blade2的点是从x=1到x=4生成的,第一个点坐标为(1, 3.65)
- 当所有点拼接成一个数组后,blade1的最后一个点(4,5.95)直接紧跟blade2的第一个点(1,3.65),
plt.plot()会自动连接这两个不相邻的点,从而出现了这条异常斜线。
解决方法
方法1:反转blade2的x轴生成顺序
让blade2的点从x=4到x=1反向生成,这样blade1的最后一个点(4,5.95)会和blade2的第一个点(4,2.75)自然衔接,不会出现跨段连线:
# 修改斧刃部分的blade2代码 blade2_x = np.linspace(4, 1, num_points // 2) # 从4到1反向生成 blade2_y = -0.05 * blade2_x ** 2 + 0.2 * blade2_x + 3.5
方法2:分部分独立绘制
不将所有点拼接成一个数组,而是分别绘制手柄和斧刃的各个部分,让各段线条独立,避免跨部分连线:
# 修改绘图部分代码 plt.figure(figsize=(12, 4)) # 绘制手柄四段 plt.plot(handle1_x, handle1_y, 'b-', marker='o') plt.plot(handle2_x, handle2_y, 'b-', marker='o') plt.plot(handle3_x, handle3_y, 'b-', marker='o') plt.plot(handle4_x, handle4_y, 'b-', marker='o') # 绘制斧刃两段 plt.plot(blade1_x, blade1_y, 'b-', marker='o') plt.plot(blade2_x, blade2_y, 'b-', marker='o') plt.title("Fixed Axe Shape") plt.axis('equal') plt.show()
内容的提问来源于stack exchange,提问作者Excortia
相关产品推荐
相关产品推荐

