matplotlib动画中数组的不同颜色点

时间:2017-03-27 10:55:07

标签: python arrays matplotlib colors

我试图为此动画中的每个点获取不同的颜色。我想将数组c_state作为每个点的hsv-tuple的hue值传递。到目前为止,我尝试的一切都失败了我已尝试在动画功能中使用它:

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 个答案:

答案 0 :(得分:1)

matplotlib中的线图plt.plot()只有一种颜色。您不能为其细分设置不同的颜色。

您需要的是散点图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颜色映射映射到hsv颜色,cmap颜色映射在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() 中指定分散的论据。

enter image description here

完整代码如下所示:

location /ws/{

    proxy_pass http://127.0.0.1:3000/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $remote_addr;
}