Пиплот меняет цвет по очереди не работает - PullRequest
1 голос
/ 12 января 2020

Итак, я скопировал этот код из Анимация, основанная только на обновлении цветов на графике , и сделал некоторые небольшие корректировки. У меня есть сюжет и я хотел бы изменить цвет одной строки в каждом кадре. Код выглядит следующим образом:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection
import matplotlib.animation as animation

lines=[]
points=[(1,2),(5,4),(1,3),(2,1),(3,5)]
for i in range(len(points)-1):
        lines.append([points[i],points[i+1]])
fig, ax = plt.subplots()

colors = np.array([0.1,0.1,0.1,0.9])
col = LineCollection(lines, array=colors, cmap=plt.cm.bwr)
ax.add_collection(col)
ax.autoscale()
print(colors)
def update(i):
    colors[i%4]=np.random.random()
    col.set_array(colors)
    return col,
ani = animation.FuncAnimation(fig, update, interval=2000, blit=True, 
                              init_func=lambda: [col])
plt.show()

Хотя он и работает, если я оставлю его таким, я изначально хочу, чтобы все строки имели одинаковый цвет. Когда я изменяю начальные цвета на

colors = np.array([0.9,0.9,0.9,0.9]) 

вместо

colors = np.array([0.1,0.1,0.1,0.9])

, график просто перестает обновляться и остается один цвет все время. Если я изменю только одно число из массива цветов, это работает. Почему это так и что я должен изменить, чтобы он работал?

1 Ответ

0 голосов
/ 12 января 2020

Вам нужно будет указать LineCollection, какой диапазон значений должен быть сопоставлен с цветами цветовой карты. Если вы используете все те же числа, что и в исходном массиве, коллекция даже не сможет догадаться об этом диапазоне, в то время как если вы вначале примете разные значения, она будет использовать минимум и максимум из них.

В любом случае лучше определить этот диапазон явно. Например, чтобы отобразить диапазон [0,1], используйте norm=plt.Normalize(0,1).

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection
import matplotlib.animation as animation

lines=[]
points=[(1,2),(5,4),(1,3),(2,1),(3,5)]
for i in range(len(points)-1):
        lines.append([points[i],points[i+1]])
fig, ax = plt.subplots()

colors = np.array([0.1,0.1,0.1,0.1])
col = LineCollection(lines, array=colors, cmap=plt.cm.bwr, norm=plt.Normalize(0,1))
ax.add_collection(col)
ax.autoscale()
print(colors)
def update(i):
    colors[i%4]=np.random.random()
    col.set_array(colors)
    return col,
ani = animation.FuncAnimation(fig, update, interval=20, blit=True, 
                              init_func=lambda: [col])
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...