【问题标题】:Python - Plotting velocity and acceleration vectors at certain pointsPython - 在某些点绘制速度和加速度矢量
【发布时间】:2016-05-03 09:28:33
【问题描述】:

在这里,我有一个参数方程。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

t = np.linspace(0,2*np.pi, 40)

# Position Equation
def rx(t):
    return t * np.cos(t)
def ry(t):
    return t * np.sin(t)

# Velocity Vectors
def vx(t):
    return np.cos(t) - t*np.sin(t)
def vy(t):
    return np.sin(t) + t*np.cos(t)

# Acceleration Vectors
def ax(t):
    return -2*np.sin(t) - t*np.cos(t)

def ay(t):
    return 2*np.cos(t) - t*np.sin(t)

fig = plt.figure()
ax1 = fig.gca(projection='3d')

z = t 
ax1.plot(rx(z), ry(z), z)
plt.xlim(-2*np.pi,2*np.pi)
plt.ylim(-6,6)
#ax1.legend() # no labels
plt.show()

所以我有这个创建这个图表的参数方程。

我已经在我的代码中定义了上面的速度和加速度参数方程。

我想要做的是在上面的位置图中在定义的点处绘制加速度和速度矢量。 (Id est, t = pi/2, 3pi/2, 2pi)

类似这样的:

Plotting a 3d cube, a sphere and a vector in Matplotlib

但我想做一些更直接的事情,因为我必须将每个点 t 定义为两个方程。

这样的事情可能吗?我只能找到向量场,什么不行。

类似的东西。

谢谢。

编辑问题

# t = pi/4 

t_val_start_pi4 = np.pi/4
vel_start_pi4 = [rx(t_val_start_pi4), ry(t_val_start_pi4), t_val_start_pi4]

vel_end_pi4 = [rx(t_val_start_pi4 ) + vx(t_val_start_pi4 ), ry(t_val_start_pi4 )+vy(t_val_start_pi4 ), t_val_start_pi4 ]

vel_vecs_pi4 = (t_val_start_pi4 , vel_end_pi4)

vel_arrow_pi4 = Arrow3D(vel_vecs_pi4[0],vel_vecs_pi4[1], vel_vecs_pi4[2], mutation_scale=20, lw=1, arrowstyle="-|>", color="b")

axes.add_artist(vel_arrow_pi4)

它会给我一个错误说Tuple out of index

【问题讨论】:

  • 下面展示了如何绘制箭头。一旦计算出向量尾部的位置、向量的长度、向量的方向,并确定向量的样式,就可以使用它来绘制向量:matplotlib.org/examples/pylab_examples/arrow_simple_demo.html
  • 那么第一个零代表尾部位置,下一个代表向量长度吗? ax.arrow(0, 0, 0.5, 0.5, head_width=0.05, head_length=0.1, fc='k', ec='k')
  • @DarthLazar - 请参阅documentation 了解该方法
  • @cricket_007。好的,但是这对于 3d 情节如何运作?
  • 可以在官方文档上找到任何内容,但感谢 StackOverflow 已经为您提供了答案stackoverflow.com/questions/11140163/…

标签: python vector matplotlib plot


【解决方案1】:

我觉得这很接近......甚至得到了与示例图片匹配的颜色:)

不过,我对在极坐标上绘图并没有太多经验(在第三维 t 坐标上大多感到困惑)。

希望这会有所帮助,您可以弄清楚如何扩展它

我采用了你所拥有的,从 this answer 添加了 Arrow3D 类,并在 t 的一些示例值上添加了一个简单的 for 循环。

#draw a vector
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d

class Arrow3D(FancyArrowPatch):
    def __init__(self, xs, ys, zs, *args, **kwargs):
        FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)
        self._verts3d = xs, ys, zs

    def draw(self, renderer):
        xs3d, ys3d, zs3d = self._verts3d
        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
        self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))
        FancyArrowPatch.draw(self, renderer)

axes = fig.gca(projection='3d')

t_step = 8
for t_pos in range(0, len(t)-1, t_step):
    t_val_start = t[t_pos]
#     t_val_end = t[t_pos+1]

    vel_start = [rx(t_val_start), ry(t_val_start), t_val_start]
    vel_end = [rx(t_val_start)+vx(t_val_start), ry(t_val_start)+vy(t_val_start), t_val_start]
    vel_vecs = list(zip(vel_start, vel_end))
    vel_arrow = Arrow3D(vel_vecs[0],vel_vecs[1],vel_vecs[2], mutation_scale=20, lw=1, arrowstyle="-|>", color="g")
    axes.add_artist(vel_arrow)

    acc_start = [rx(t_val_start), ry(t_val_start), t_val_start]
    acc_end = [rx(t_val_start)+ax(t_val_start), ry(t_val_start)+ay(t_val_start), t_val_start]
    acc_vecs = list(zip(acc_start, acc_end))
    acc_arrow = Arrow3D(acc_vecs[0],acc_vecs[1],acc_vecs[2], mutation_scale=20, lw=1, arrowstyle="-|>", color="m")
    axes.add_artist(acc_arrow)

axes.plot(rx(t), ry(t), t)
plt.xlim(-2*np.pi,2*np.pi)
plt.ylim(-6,6)

【讨论】:

  • 天哪,这太棒了。谢谢你。快速提问,我将如何在 t 的某些点绘制箭头?例如,我选择 t 作为这个数字来绘制箭头。我该怎么办?
  • 我会将我的问题样本放在帖子的编辑部分
  • vel_vecs_pi4 的速度矢量不正确,您需要像我为 vel_vecs 所做的那样压缩开始和结束矢量
  • 我把它改成了vel_vecs_pi4 = list(zip(t_val_start_pi4 , vel_end_pi4)) 然后它给了我TypeError: zip argument #1 must support iteration 我做错了什么?
  • 您创建了一个包含 t 值和端点向量的元组。 zip 的参数需要是 2 个可迭代对象,即起始速度向量和结束速度向量,即使用 vel_start_pi4
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多