我使用matplotlib为星球周围的行星运动制作动画。 我绘制了一个代表行星的简单小圆圈然后我使用funcanimation和animate()函数每次更改圆心,如本网站上所做的那样:https://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html。
现在我试图使用图像文件而不是圆圈,但我几乎不知道如何在图上绘制图像,真的不知道如何让它在它上面移动
有什么想法吗?
由于
答案 0 :(得分:1)
这样的事情会起作用:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import BboxImage
from matplotlib.transforms import Bbox, TransformedBbox
# make figure + Axes
fig, ax = plt.subplots()
# make initial bounding box
bbox0 = Bbox.from_bounds(0, 0, 1, 1)
# use the `ax.transData` transform to tell the bounding box we have given
# it position + size in data. If you want to specify in Axes fraction
# use ax.transAxes
bbox = TransformedBbox(bbox0, ax.transData)
# make image Artist
bbox_image = BboxImage(bbox,
cmap=plt.get_cmap('winter'),
norm=None,
origin=None,
**kwargs
)
# shove in some data
a = np.arange(256).reshape(1, 256)/256.
bbox_image.set_data(a)
# add the Artist to the Axes
ax.add_artist(bbox_image)
# set limits
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
# loop over new positions
for j in range(50):
x = j % 10
y = j // 10
# make a new bounding box
bbox0 = Bbox.from_bounds(x, y, 1, 1)
bbox = TransformedBbox(bbox0, ax.transData)
bbox_image.bbox = bbox
# re-draw the plot
plt.draw()
# pause so the gui can catch up
plt.pause(.1)
它可能比它需要的要复杂得多,你真的应该使用动画框架而不是pause
。
答案 1 :(得分:0)
我想给你一个+1,但我的名声还没有允许。 感谢很多代码,我成功地通过修改这一行将导入的图像放入你使用的艺术家中:
bbox_image.set_data(mpimg.imread("C:\\image.png"))
注意我也添加了这个
Import matplotlib.image as mpimg
但是,当我尝试使用funcanimation来设置动画时,我仍然会出现问题,我收到了错误,这是我的代码(您已经修改过):
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import BboxImage
from matplotlib.transforms import Bbox, TransformedBbox
import matplotlib.image as mpimg
from matplotlib import animation
# make figure + Axes
fig, ax = plt.subplots()
# make initial bounding box
bbox0 = Bbox.from_bounds(0, 0, 1, 1)
# use the `ax.transData` transform to tell the bounding box we have given
# it position + size in data. If you want to specify in Axes fraction
# use ax.transAxes
bbox = TransformedBbox(bbox0, ax.transData)
# make image Artist
bbox_image = BboxImage(bbox,
cmap=plt.get_cmap('winter'),
norm=None,
origin=None
)
bbox_image.set_data(mpimg.imread("C:\\icon-consulting.png"))
# add the Artist to the Axes
ax.add_artist(bbox_image)
# set limits
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
def animate(i):
bbox0 = Bbox.from_bounds(i, i, 1, 1)
bbox = TransformedBbox(bbox0, ax.transData)
bbox_image.bbox = bbox
return bbox_image
anim = animation.FuncAnimation(fig, animate,
frames=100000,
interval=20,
blit=True)
plt.show()
它告诉我错误:' BboxImage'对象不可迭代 我想只应返回此BboxImage的位置部分 我习惯于通过添加昏迷来使用Line2D对象执行此操作,例如:return lineobject, 这意味着只返回元组的第一个元素,但我不知道如何用BboxImage完成它
事实上我可以像你第一次那样简单地使用循环,但也许你知道如何使它适应funcanimation?
编辑:
我使用bbox方法再次修改了代码:
for j in range(5000):
x = 2*np.sin(np.radians(j))
y = 2*np.cos(np.radians(j))
# make a new bounding box
bbox0.set_points([[x,y],[x+1,y+1]])
# re-draw the plot
plt.draw()
# pause so the gui can catch up
plt.pause(0.1)
然后我可以将此转换为使用funcanimation:
def animate(i):
x = 2*np.sin(np.radians(i))
y = 2*np.cos(np.radians(i))
# make a new bounding box
bbox0.set_points([[x,y],[x+1,y+1]])
return bbox0.get_points()
anim = animation.FuncAnimation(fig, animate,
frames=100000,
interval=20,
blit=True)
plt.show()
这给了我一个错误:' list'对象没有属性'轴' 它是我在动画函数中做的回归,返回的值应该以某种方式转换我猜...你知道我怎么做吗?感谢