【问题标题】:Animating a 2D array with changing colors using scatter (matplotlib)使用 scatter (matplotlib) 为 2D 数组设置动画并改变颜色
【发布时间】:2020-07-22 17:01:01
【问题描述】:

我想为一个二维数组(带有固定点)制作动画,其中点的颜色会发生变化。出于其他原因,我正在使用具有 x 坐标、y 坐标和属性颜色的类 Individual。我的代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

N = 100

class Individual:
    def __init__(self, x_axis, y_axis, color):
        self.x_axis = x_axis
        self.y_axis = y_axis
        self.color = color

population = np.empty([N], dtype=Individual)

i = 0
while i < 10:
    population[i] = Individual(np.random.uniform(0, 1), np.random.uniform(0, 1), "red")
    i = i + 1

i = 10
while i < N:
    population[i] = Individual(np.random.uniform(0, 1), np.random.uniform(0, 1), "blue")
    i = i + 1

fig, ax = plt.subplots()
scat = ax.scatter([i.x_axis for i in population], [i.y_axis for i in population], 
                  c=[i.color for i in population])
ax.set_xlim((0, 1))
ax.set_ylim((0, 1))
ax.grid(b=True, which='major', color='k', linestyle='--')

def init():
    scat = ax.scatter([i.x_axis for i in population], [i.y_axis for i in population], 
                      c=[i.state for i in population])
    return scat,

def animate(i):
    for i in population:   # only exemplary update
        if i.state == 'red':
            i.state = 'blue'
        else:
            i.state = 'red'
    c = [i.state for i in population]
    scat.set_array(c) # this is supposed to update the colors
    return scat,

anim = animation.FuncAnimation(scat, animate, init_func=init, frames=200, 
                               interval=20, blit=True)
plt.show()

我收到以下错误消息:

Traceback (most recent call last):
  File "C:/Users/benno/PycharmProjects/AnimationTests/Animation.py", line 50, in <module>
    anim = animation.FuncAnimation(scat, animate, init_func=init, frames=200, interval=20, blit=True)
  File "C:\Users\benno\AppData\Local\Programs\Python\Python37-32\lib\site-packages\matplotlib\animation.py", line 1696, in __init__
    TimedAnimation.__init__(self, fig, **kwargs)
  File "C:\Users\benno\AppData\Local\Programs\Python\Python37-32\lib\site-packages\matplotlib\animation.py", line 1433, in __init__
    event_source = fig.canvas.new_timer()
AttributeError: 'PathCollection' object has no attribute 'canvas'

我做错了什么吗?

【问题讨论】:

    标签: python matplotlib animation scatter-plot


    【解决方案1】:

    matplotlib.animation.FuncAnimation 期望 matplotlib.figure.Figure 实例作为第一个位置参数,而不是 matplotlib.artist。在您的代码中,scatartistfigFigure 实例。线

    anim = animation.FuncAnimation(scat, animate, init_func=init, frames=200, 
                                   interval=20, blit=True)
    

    应该是

    anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, 
                                   interval=20, blit=True)
    

    【讨论】:

    • 谢谢,我仍然收到一个错误(我认为),因为 ``` scat.set_array(c) ``` 如何将保存在 c 中的颜色提供给函数set_array() 正确吗?
    • @MATH101 你应该使用set_color 来设置颜色。
    猜你喜欢
    • 2015-04-10
    • 2017-07-16
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多