【问题标题】:How to use a point to discribe the trail of an object with package matplotlib如何使用一个点来描述一个带有matplotlib包的对象的轨迹
【发布时间】:2018-08-13 19:26:43
【问题描述】:

在while循环中,命令“plt.plot(x,y,'*')”绘制对象的轨迹。所以在轴上绘制了很多点。但我只想要一个移动点来描述trail.Details 在以下代码的“while循环”中。

import matplotlib.pyplot as plt
import numpy as np
#just a dynamic painting
tolerance = 1e-1
radius = np.pi

# missile 1
x_m1, y_m1 = -np.pi, 0
v_m1 = 5

# missile 2
x_m2, y_m2 = 0, np.pi
v_m2 = v_m1
# missile 3
x_m3, y_m3 = np.pi, 0
v_m3 = v_m1
# missile 4
x_m4, y_m4 = 0, -np.pi
v_m4 = v_m1

plt.figure(figsize=(10, 10), dpi=80)
plt.title(" missile flight simulator ", fontsize=40)
plt.xlim(-4, 4)
plt.ylim(-4, 4)
#plt.xticks([])
#plt.yticks([])

# set spines
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))


plt.annotate('missile start point', xy=(x_m1, y_m1),  xycoords='data',
             xytext=(+15, +15), textcoords='offset points', fontsize=12,
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))

# alpha labels
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(16)
    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))


class ob(object):
    """docstring for ob"""
    def __init__(self, x, y):
        self.x = x
        self.y = y


class missile(ob):
    """docstring for missile"""
    def __init__(self, x, y):
        super(missile, self).__init__(x, y)

    def forward(self, v, target):
        """docstring for forward"""
        if self.x < target.x:
            alpha = np.arctan((target.y - self.y) / (target.x - self.x))
        elif self.x > target.x:
            alpha = np.pi + np.arctan((target.y - self.y) / (target.x - self.x))
        elif self.x == target.x and self.y < target.y:
            alpha = np.pi / 2
        else:
            alpha = -np.pi / 2
        self.x = self.x + v * 0.01 * np.cos(alpha)
        self.y = self.y + v * 0.01 * np.sin(alpha)
        return self.x, self.y

    def distance(self, target):
        """docstring for distance"""
        return np.sqrt((self.x - target.x) ** 2 + (self.y - target.y) ** 2)


class target(ob):
    """docstring for target"""
    def __init__(self, x, y):
        super(target, self).__init__(x, y)

    def newposition(self, x, y):
        """docstring for newposition"""
        self.x = x
        self.y = y

m1 = missile(x_m1, y_m1)
m2 = missile(x_m2, y_m2)
m3 = missile(x_m3, y_m3)
m4 = missile(x_m4, y_m4)

while True: #details
#just a dynamic painting
    if m1.distance(m2) < tolerance or m1.distance(m3) < tolerance or m1.distance(m4) < tolerance:    #In the loop,many points are painted to discribe the trail    
        print "collision"
        plt.plot(x_m1, y_m1, 'o')
        plt.annotate('crash point', xy=(x_m1, y_m1),  xycoords='data',
                     xytext=(+15, +15), textcoords='offset points', fontsize=12,
                     arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
        plt.pause(0.1)
        plt.show()
        break
    elif m3.distance(m2) < tolerance or m3.distance(m4) < tolerance:
        print "collision"
        plt.plot(x_m3, y_m3, 'o')
        plt.annotate('crash point', xy=(x_m3, y_m3),  xycoords='data',
                     xytext=(+15, +15), textcoords='offset points', fontsize=12,
                     arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
        plt.pause(0.1)
        plt.show
        break
    x_m1, y_m1 = m1.forward(v_m1, m2)
    x_m2, y_m2 = m2.forward(v_m2, m3)
    x_m3, y_m3 = m3.forward(v_m3, m4)
    x_m4, y_m4 = m4.forward(v_m4, m1)
    #print alpha, beta
    plt.plot(x_m1, y_m1, 'bx', alpha=.5)
    plt.plot(x_m2, y_m2, 'k*', alpha=.5)
    plt.plot(x_m3, y_m3, 'r.', alpha=.5)
    plt.plot(x_m4, y_m4, 'gp', alpha=.5)
    plt.legend(("missile1", "missile2", "missile3", "missile4"), loc="upper left", prop={'size': 12})

    plt.pause(0.1)

有没有给出任何分辨率?这个程序只是用于动态绘画。绘制一个移动点以显示对象的轨迹。该点的坐标以其正常速度更新。在我的代码中,轨道的所有点都被绘制了,但我只需要一个移动点。就像一辆在路上行驶的汽车,每次你在轨道的不同位置看到一辆移动的汽车。你可以删除“while”循环,如果你能用其他方式来实现我的期望。

【问题讨论】:

  • “详细信息在 while 循环中”没有为任何人提供足够的信息来帮助您。你是什​​么意思“我只想要一个移动点来描述轨迹”?请将您的问题归结为Minimal, Complete, and Verifiable example(此处minimal 中的关键字)
  • 绘制一个移动点以显示对象的轨迹。该点的坐标以其正常速度更新。在我的代码中,轨道的所有点都被绘制了,但我只需要一个移动点。就像一辆在路上奔跑的汽车,每次你在轨道的不同位置看到一辆移动的汽车
  • 如果你可以使用其他方式来达到我的期望,你可以删除“while”循环。
  • 有两种制作动画的方式,例如: here。选择一种方法,坚持下去,你应该直接得到想要的情节。用单个点还是多个点更新绘图都没有关系。

标签: python matplotlib points trail


【解决方案1】:

我仍然不确定我是否理解您的问题,但是:

看起来你陷入了与 90% 的人询问动画和 matplotlib 相同的陷阱,因为你在迭代的每一步都反复调用 plot(),从而创造了新的点(真的,新的 @ 987654323@ objects),而不是更新现有的属性。

动画的一般流程是:

  1. 创建您的图形和所有不需要更新的固定元素
  2. 创建需要更新的艺术家,并保留对他们的引用
  3. 在您的循环中,更新(而不是替换或创建新的艺术家)在上一步中创建的艺术家的属性。

由于您没有得到我关于创建最小 工作示例的提示,让我证明您的 99% 的代码是无用的,您的问题可以像这样简化和解决:

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
# create a placeholder artist object, and keep a reference to it
my_line, = plt.plot([], [], 'bx', alpha=.5)
plt.legend(["my line"], loc="upper left", prop={'size': 12})
plt.xlim([0, 10])
plt.ylim([0, 10])
i = 0

while True:
    # do whatever to get next coordinates
    i = (i + 1) % 10
    new_x, new_y = i, i
    # update artist
    my_line.set_data(new_x, new_y)
    plt.draw()
    plt.pause(0.1)

最后,我将回应@ImportanceOfBeingErnest 的评论,并建议您查看the FuncAnimation module 来制作您的动画,尽管总体策略仍然完全相同。

【讨论】:

  • 是的,你完全明白我的意思。这个分辨率非常适合我。
  • 当我求助于 matplotlib 帮助文档进行解析时,总是看到命令“set_data”。但我几乎没有将它与我的问题联系起来。此外,我对“plt.plot()”非常熟悉.然而,我从来没有想过创建一个像“my_line”这样的对象。您能否提供一些关于在编程中寻找帮助文档或开放思想的建议。
  • 该文档是matplotlib的意思。在某些方面太简短了,找不到某些功能和属性的用法
  • 运行一段时间后,有什么方法可以停止移动点“my_line”再次显示
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
相关资源
最近更新 更多