matplotlib 3D箭状箭头外观

iq0todco  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(187)

我正尝试在球体内绘制一个箭头,代码如下

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')
ax.quiver(0, 0, 0,blocx[0], blocy[0], blocz[0],color="b",linewidth=5)
ax.plot_wireframe(x, y, z, color ='#15B05E')

ax.view_init(30, 70)
pl.show()

这里的blockx,y和z是我的一些数据,结果是:

但是我希望箭头像一个圆锥体,而且尺寸要小一些,我该怎么做呢?

hzbexzde

hzbexzde1#

其中一条评论说箭筒没有这个功能,这是正确的。解决这个问题的一个方法是制作一个为你绘制箭头的函数。在这个函数中你可以自定义箭头的格式。
这是我的代码的输出。它只沿着z轴绘制一个箭头,但是顶点可以是任意大小的正值或负值。可以很容易地改变箭头,使其沿着不同的轴下降,但是给它一个任意的方向会变得复杂得多。

注意:使用fig.gca()会给你以下的反对警告。要避免这种情况,你应该调用ax=plt.subplot(projection='3d')
Matplotlib弃用警告:在Matplotlib 3.4中不推荐使用带关键字参数的gca()。从两个次要版本开始,gca()将不带关键字参数。gca()函数只能用于获取当前轴,或者如果不存在轴,则使用默认关键字参数创建新轴。要使用非默认参数创建新轴,请使用plt. axes()或plt. subplot(). ax = fig. gca(projection ='3d ')

代码

(Keep滚动查看参数的详细信息)

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt

def add_arrow(axe=None,
              apex=None, col='b', tipHeight=None, tipWidth=None, heightRatio=.25, widthRatio=0.1,
              **plt_kwargs):
    
    def f(x, y, height):
        return np.sqrt(x ** 2 + y ** 2) *-1.0 *height
        
    if (ax is not None) and (apex is not None):
        if tipHeight is None:
            tipHeight = np.sqrt(apex * 1.0) *heightRatio *apex /abs(apex);
        if tipWidth is None:
            tipWidth = np.sqrt(apex * 1.0) *widthRatio;
        u1, v1 = np.mgrid[0:2*np.pi:100j, 0:np.pi:80j]
        x1 = np.cos(u1)*np.sin(v1)
        y1 = np.sin(u1)*np.sin(v1)
        z1 = f(x1, y1, tipHeight) + apex
        axe.plot_surface(x1 *tipWidth, y1 *tipWidth, z1, color=col, **plt_kwargs)
        axe.plot3D((0,0),(0,0),(0,apex-(tipHeight)),c=col,linewidth=3, **plt_kwargs)
    return(ax) 
            
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)

zApexVal = 1

fig = plt.figure(figsize=(6,6))

ax = plt.subplot(111,projection='3d')
ax.view_init(30, 70)
ax.plot_wireframe(x, y, z, color ='#15B05E')
add_arrow(ax, zApexVal)

plt.show()

生成箭头所需传递的参数为axe(轴)和apexapex是沿z轴的值,用于指定箭头的终点。col参数控制箭头的颜色,默认值为蓝色。此外,可以指定箭头的高度/宽度。2这也可以通过为每个值指定一个比率来控制。3比率应用于箭头的大小并相应地缩放箭头。
这能回答你的问题吗?

相关问题