如何将Matplotlib 3D Quiver箭头改为锥形并缩小尺寸?
解决方案
要实现锥形箭头并缩小箭头尺寸,你可以通过调整matplotlib中3D箭图(quiver)的几个关键参数来完成,以下是修改后的代码和说明:
import numpy as np import matplotlib.pyplot as plt as pl # 生成单位球体网格 u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j] x = np.cos(u)*np.sin(v) y = np.sin(u)*np.sin(v) z = np.cos(v) fig = pl.figure(figsize=(20,15)) ax = fig.gca(projection='3d') # 可选:如果需要固定箭头长度(比如0.5个单位,适配单位球体),先归一化向量 mag = np.sqrt(blocx[0]**2 + blocy[0]**2 + blocz[0]**2) dx = blocx[0] / mag * 0.5 dy = blocy[0] / mag * 0.5 dz = blocz[0] / mag * 0.5 # 修改后的箭图参数 ax.quiver(0, 0, 0, dx, dy, dz, color="b", linewidth=2, # 缩小箭杆宽度 length=1, # 箭头长度(配合归一化后的向量,总长度为0.5) arrow_length_ratio=0.2, # 箭头头部占总长度的比例(更小的值让头部更紧凑) headwidth=3) # 箭头头部宽度(相对于箭杆,值越大锥形越明显) ax.plot_wireframe(x, y, z, color='#15B05E') ax.view_init(30, 70) pl.show()
参数说明:
linewidth: 从原来的5改为2,缩小箭杆的粗细,让整体尺寸更协调。- 向量归一化: 如果你的原始向量长度超过1(会超出单位球体),先归一化再乘以目标长度(比如0.5),确保箭头完全在球体内。
arrow_length_ratio: 设置箭头头部占总箭头长度的比例(默认0.3),调整为0.2可以让锥形头部更紧凑。headwidth: 控制箭头头部相对于箭杆的宽度(默认3),这个参数直接影响锥形的视觉效果,值越大头部越宽,锥形越明显。
如果不需要固定箭头长度,也可以直接用原始向量并调整length参数来缩放,比如:
ax.quiver(0, 0, 0, blocx[0], blocy[0], blocz[0], color="b", linewidth=2, length=0.5, arrow_length_ratio=0.2, headwidth=3)
这里的length=0.5会将原始向量缩小到原来的50%。
内容的提问来源于stack exchange,提问作者Jose Antonio Valderrama
相关产品推荐
相关产品推荐

