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
相关产品推荐
相关产品推荐

