2017-03-27 9 views
1

私はこのアニメーションの各点で異なる色を取得しようとしています。私は各点のhsv-tupleの色相値として配列c_stateを渡したいと思います。これまで私が試みたものはすべて失敗しました。私はアニメーション関数でこれを使用しようとしました:しかし、length-1配列だけがスカラーに変換できることを警告しています。 また、np.randomを使って長さ3の配列を作成しようとしましたが、それらをrgb-tuplesに変換しようとしましたが、どちらもうまくいきませんでした。 ax.plotの色変数に渡す正しいデータ構造を見つけるのが難しいです。 色は一度設定するだけで済み、アニメーション中に変更する必要はありません。matplotlibアニメーションの配列と異なる色の点

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

を*は、それはこれまでのところ、失敗した方法*:次のように

enter image description here

完全なコードが見えるでしょうか? – SiHa

+0

質問を編集しました。 – Ebo

答えて

1

matplotlibのラインプロットplt.plot()は、正確には1色です。セグメントに異なる色を設定することはできません。

散布図は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を使用して散布図は、これらの値はcmap引数で指定されhsvカラーマップを使用して、HSV色にマッピングされる0と1の間の値の1次元配列であろう更新することができます散布へ。

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

関連する問題