python箭头变换_Python中的箭头动画

First of all, I am just starting to learn Python. I have been struggling during the last hours trying to update the arrow properties in order to change them during a plot animation.

After thoroughly looking for an answer, I have checked that it is possible to change a circle patch center by modifying the attribute 'center' such as circle.center = new_coordinates. However, I don't find the way to extrapolate this mechanism to an arrow patch...

The code so far is:

import numpy as np, math, matplotlib.patches as patches

from matplotlib import pyplot as plt

from matplotlib import animation

# Create figure

fig = plt.figure()

ax = fig.gca()

# Axes labels and title are established

ax = fig.gca()

ax.set_xlabel('x')

ax.set_ylabel('y')

ax.set_ylim(-2,2)

ax.set_xlim(-2,2)

plt.gca().set_aspect('equal', adjustable='box')

x = np.linspace(-1,1,20)

y = np.linspace(-1,1,20)

dx = np.zeros(len(x))

dy = np.zeros(len(y))

for i in range(len(x)):

dx[i] = math.sin(x[i])

dy[i] = math.cos(y[i])

patch = patches.Arrow(x[0], y[0], dx[0], dy[0] )

def init():

ax.add_patch(patch)

return patch,

def animate(t):

patch.update(x[t], y[t], dx[t], dy[t]) # ERROR

return patch,

anim = animation.FuncAnimation(fig, animate,

init_func=init,

interval=20,

blit=False)

plt.show()

After trying several options, I thought that the function update could somehow take me closer to the solution. However, I get the error:

TypeError: update() takes 2 positional arguments but 5 were given

If I just add one more patch per step by defining the animate function as shown below, I get the result shown in the image attached.

def animate(t):

patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )

ax.add_patch(patch)

return patch,

I have tried to add a patch.delete statement and create a new patch as update mechanism but that results in an empty animation...

解决方案

Add ax.clear() before ax.add_patch(patch) but will remove all elements from plot.

def animate(t):

ax.clear()

patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )

ax.add_patch(patch)

return patch,

EDIT: removing one patch

using ax.patches.pop(index).

In your example is only one patch so you can use index=0

def animate(t):

ax.patches.pop(0)

patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )

ax.add_patch(patch)

return patch,

using ax.patches.remove(object)

It needs global to get/set external patch with Arrow

def animate(t):

global patch

ax.patches.remove(patch)

patch = plt.Arrow(x[t], y[t], dx[t], dy[t] )

ax.add_patch(patch)

return patch,

BTW: to get list of properties which you can use with update()

print( patch.properties().keys() )

dict_keys(['aa', 'clip_path', 'patch_transform', 'edgecolor', 'path', 'verts', 'rasterized', 'linestyle', 'transform', 'picker', 'capstyle', 'children', 'antialiased', 'sketch_params', 'contains', 'snap', 'extents', 'figure', 'gid', 'zorder', 'transformed_clip_path_and_affine', 'clip_on', 'data_transform', 'alpha', 'hatch', 'axes', 'lw', 'path_effects', 'visible', 'label', 'ls', 'linewidth', 'agg_filter', 'ec', 'facecolor', 'fc', 'window_extent', 'animated', 'url', 'clip_box', 'joinstyle', 'fill'])

so you can use update to change color - `facecolor

def animate(t):

global patch

t %= 20 # get only 0-19 to loop animation and get color t/20 as 0.0-1.0

ax.patches.remove(patch)

patch = patches.Arrow(x[t], y[t], dx[t], dy[t])

patch.update({'facecolor': (t/20,t/20,t/20,1.0)})

ax.add_patch(patch)

return patch,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值