You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:05:20