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

Matplotlib向量坐标与线性组合箭头同图显示问题及终点修正

问题:Matplotlib绘图中坐标点与向量箭头的显示问题

我想在同一张Matplotlib图里展示两个向量的坐标点(对应代码片段1的Part 1)和它们的线性组合向量(对应代码片段1的Part 2),但遇到两个问题:

  • 代码片段1中,只有向量箭头能显示,坐标点看不到,不清楚原因。
  • 代码片段2调整代码顺序后,坐标点和箭头都能显示,但箭头未到达预期的终点坐标w=[2,1],求修正方法。

代码片段1:仅箭头显示

import matplotlib.pyplot as plt
import numpy as np

# Part 1: Plot points
x = [-2, 2, 2]
y = [-1, -1, 1]

plt.plot(x, y, color='r', linestyle='dashed', linewidth=2, marker='o', markerfacecolor='blue', markeredgecolor='blue')
plt.xlim(-3, 3)
plt.ylim(-2, 2)
y_range = np.arange(-2, 3)
x_range = np.arange(-3, 4)
plt.yticks(y_range)
plt.xticks(x_range)

# Part 2: Plot Vector
v = np.array([-2, -1])
w = np.array([2, 1])

# Creates axes of plot referenced 'ax'
ax = plt.axes()

# Plots red dot at origin (0,0)
ax.plot(*v, 'or')

ax.arrow(*v, *w, color='b', linewidth=2.5, head_width=0.30, head_length=0.35)

# Sets limit for plot for x-axis
plt.xlim(-3, 3)

# Set major ticks for x-axis
major_xticks = np.arange(-3, 4)
ax.set_xticks(major_xticks)

# Sets limit for plot for y-axis
plt.ylim(-2, 2)

# Set major ticks for y-axis
major_yticks = np.arange(-2, 3)
ax.set_yticks(major_yticks)

# Default Grid
plt.grid(visible=True, which='major')

plt.show()

代码片段2:坐标与箭头均显示,但箭头未达预期终点w=[2,1]

import matplotlib.pyplot as plt
import numpy as np

# Part 2: Plot Vector
v = np.array([-2, -1])
w = np.array([2, 1])

# Creates axes of plot referenced 'ax'
ax = plt.axes()

# Plots red dot at origin (0,0)
ax.plot(*v, 'or')

ax.arrow(*v, *w, color='b', linewidth=2.5, head_width=0.30, head_length=0.35)

# Sets limit for plot for x-axis
plt.xlim(-3, 3)

# Set major ticks for x-axis
major_xticks = np.arange(-3, 4)
ax.set_xticks(major_xticks)

# Sets limit for plot for y-axis
plt.ylim(-2, 2)

# Set major ticks for y-axis
major_yticks = np.arange(-2, 3)
ax.set_yticks(major_yticks)

# Part 1: Plot points
x = [-2, 2, 2]
y = [-1, -1, 1]

plt.plot(x, y, color='r', linestyle='dashed', linewidth=2, marker='o', markerfacecolor='blue', markeredgecolor='blue')
plt.xlim(-3, 3)
plt.ylim(-2, 2)
y_range = np.arange(-2, 3)
x_range = np.arange(-3, 4)
plt.yticks(y_range)
plt.xticks(x_range)

# Default Grid
plt.grid(visible=True, which='major')

plt.show()

异常绘图效果

绘图显示异常


问题分析与解决方案

1. 代码片段1坐标点不显示的原因

代码片段1中,先调用plt.plot绘制坐标点,之后执行ax = plt.axes()会创建新的坐标轴覆盖原有绘图,导致之前画的坐标点被新轴覆盖,只能看到新轴上的箭头。

2. 代码片段2箭头未达终点的原因及修正

Matplotlib的ax.arrow(x, y, dx, dy)函数后两个参数是偏移量,不是终点坐标。当前传入的*w是终点坐标[2,1],实际应传入从起点v到终点w的偏移量:w - v。

同时建议统一用ax对象设置坐标轴参数,避免重复设置导致的混乱。

修正后的完整代码

import matplotlib.pyplot as plt
import numpy as np

# 仅初始化一次坐标轴,避免覆盖绘图
ax = plt.axes()

# 绘制坐标点
x = [-2, 2, 2]
y = [-1, -1, 1]
ax.plot(x, y, color='r', linestyle='dashed', linewidth=2, 
        marker='o', markerfacecolor='blue', markeredgecolor='blue')

# 绘制向量
v = np.array([-2, -1])
w = np.array([2, 1])
# 绘制起点红点
ax.plot(*v, 'or')
# 计算起点到终点的偏移量
dx, dy = w - v
# 绘制箭头,length_includes_head确保箭头长度包含头部,终点准确落在目标坐标
ax.arrow(*v, dx, dy, color='b', linewidth=2.5, 
         head_width=0.30, head_length=0.35, length_includes_head=True)

# 设置坐标轴范围与刻度
ax.set_xlim(-3, 3)
ax.set_ylim(-2, 2)
ax.set_xticks(np.arange(-3, 4))
ax.set_yticks(np.arange(-2, 3))

# 显示网格
ax.grid(visible=True, which='major')

plt.show()

内容的提问来源于stack exchange,提问作者tlockhart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:23:13