2017-03-27 87 views
1

我试图在此动画中为每个点获取不同的颜色。我想传递数组c_state作为每个点的hsv元组的hue值。到目前为止,我尝试过的一切都失败我在animate函数尝试使用这样的:matplotlib动画中的数组的不同颜色点

particles.set_color(pbox.color[:,0],1.0,1.0) 

但我得到警告说,只有长度为1的阵列可以转换为标量。 我也尝试使用np.random制作长度为3的数组,并试图将它们转换为rgb-tuples,但那也不起作用。我很难找到正确的数据结构传递给ax.plot的颜色变量。 颜色只需设置一次,在动画过程中不需要更改。

import matplotlib.pyplot as plt 
import matplotlib.animation as anim 
import numpy as np 
import colorsys 
from random import random 

n = 250 

class ParticleBox: 

    def __init__(self,i_state,c_state): 
     self.i_state = np.asarray(i_state, dtype=float) 
     self.c_state = np.asarray(c_state, dtype=float) 

     self.state = self.i_state.copy() 
     self.color = self.c_state.copy() 

i_state = -5 + 10 * np.random.random((n, 2)) 
c_state = np.random.random((n, 1)) 

pbox = ParticleBox(i_state, c_state) 

fig = plt.figure() 
ax = fig.add_subplot(111, xlim=(-10,10), ylim=(-10,10)) 

particles, = ax.plot([], [], 'o', ms=5) 

def init(): 
    global pbox 
    particles.set_data([],[]) 

    return particles, 

def animate(i): 
    global pbox, ax, fig 
    particles.set_data(pbox.state[:,0],pbox.state[:,1]) 

    return particles, 

ani = anim.FuncAnimation(fig, animate, frames = 500, 
         interval = 10, blit=True, 
         init_func=init) 
plt.show() 
+1

*如何*已经失败了,那么远? – SiHa

+0

我编辑了这个问题。 – Ebo

回答

1

线图plt.plot()在matplotlib有且只有一种颜色。您无法为其细分设置不同的颜色。你需要的是散点图plt.scatter。可以更新在这种情况下使用

sc = plt.scatter(x,y, c=.., s =.., cmap="hsv") 
sc.set_offsets(np.c_[x,y]) # set positions 
sc.set_array(color) # set color 

color将值0和1的那些值之间的一维数组的散点图将被映射到使用hsv颜色表,这是在cmap参数指定HSV颜色分散。

enter image description here

完整代码将如下所示:

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

n = 140 

class ParticleBox: 
    def __init__(self,i_state,c_state): 
     self.i_state = np.asarray(i_state, dtype=float) 
     self.c_state = np.asarray(c_state, dtype=float) 
     self.state = self.i_state.copy() 
     self.color = self.c_state.copy() 
    def iterate(self): 
     self.state += (np.random.random((n, 2))-0.5)/3. 
     self.state[self.state > 10.] = 10 
     self.state[self.state < -10] = -10 
     self.color += (np.random.random(n)-0.5)/89. 
     self.color[self.color>1.] = 1. 
     self.color[self.color<0] = 0. 


i_state = -5 + 10 * np.random.random((n, 2)) 
c_state = np.random.random(n) 

pbox = ParticleBox(i_state, c_state) 

fig = plt.figure() 
ax = fig.add_subplot(111, xlim=(-10,10), ylim=(-10,10)) 

particles = ax.scatter([], [], c=[],s=25, cmap="hsv", vmin=0, vmax=1) 

def animate(i): 
    pbox.iterate() 
    particles.set_offsets(pbox.state) 
    particles.set_array(pbox.color) 
    return particles, 

ani = anim.FuncAnimation(fig, animate, frames = 140, 
         interval = 10, blit=True) 

plt.show() 
+0

非常好,这正是我一直在寻找的!谢谢! – Ebo

+0

我如何去做粒子大小的动态呢?我试过传递另一个'set_array()',但是这使得所有的粒子真的很小。 – Ebo

+0

'.set_array()'确定颜色。大小使用'.set_sizes()'。 – ImportanceOfBeingErnest

相关问题