在matplotlib图上操作和动画图像

时间:2015-03-24 19:46:49

标签: python animation matplotlib

我使用matplotlib为星球周围的行星运动制作动画。 我绘制了一个代表行星的简单小圆圈然后我使用funcanimation和animate()函数每次更改圆心,如本网站上所做的那样:https://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

现在我试图使用图像文件而不是圆圈,但我几乎不知道如何在图上绘制图像,真的不知道如何让它在它上面移动

有什么想法吗?

由于

2 个答案:

答案 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'对象没有属性'轴' 它是我在动画函数中做的回归,返回的值应该以某种方式转换我猜...你知道我怎么做吗?感谢