2013-11-18 3 views
6

Я определяю ход решения дифференциального уравнения (проблема с граничными значениями). Каждая итерация дает полный набор оценок функций f (x), которые затем могут быть построены по отношению к x. Каждый граф (предположительно) ближе к правильному решению, чем последний, до достижения конвергенции. Последовательная цветовая палитра используется для того, чтобы предыдущие графики исчезли, а затем насыщенные.Matplotlib: изменение цветовой схемы после факта

Это прекрасно работает, когда число итераций предопределено:

import matplotlib.pyplot as plt 

ax = plt.subplot(111) 
cm = plt.get_cmap('OrRd') 
ax.set_color_cycle([cm(1.*i/(iter+1)) for i in range(1,iter+2)]) 

ax.plot(x,y) 
for k in range(iter): 
    # iterative solve 
    ax.plot(x,y) 

Однако, если я использую критерий сходимости вместо заранее определенное количество итераций, я не буду иметь возможности set_color_cycle заранее. И установка этой строки после цикла не работает.

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

Итак, вот мои вопросы: 1. Как изменить цветную диаграмму существующих графиков после построения графика? (Это легко в MATLAB.) 2. Как мне сделать то же самое с другим набором графиков на том же участке (например, из другого исходного предположения, сходящегося к другому решению), не нарушая первый сбор, поэтому что две цветовые карты различают коллекции друг от друга. (Это должно быть очевидно с ответом на вопрос 1, но на всякий случай.)

Большое спасибо.

ответ

3

Используйте update_colors() для обновления цвета всех линий:

import pylab as pl 
import numpy as np 
cm = pl.get_cmap('OrRd') 

x = np.linspace(0, 1, 100) 

def update_colors(ax): 
    lines = ax.lines 
    colors = cm(np.linspace(0, 1, len(lines))) 
    for line, c in zip(lines, colors): 
     line.set_color(c) 

fig, ax = pl.subplots() 
for i in range(10): 
    ax.plot(x, x**(1+i*0.1)) 
    update_colors(ax) 
+0

Brilliant. Функция может быть легко изменена, чтобы принимать количество строк и цветов в качестве параметров, которые удовлетворяют моему второму вопросу. Просто одно быстрое наблюдение, существуют ли какие-либо практические различия между «import pylab as pl» и «import matplotlib.pyplot as plt»? Благодарю. – bongbang

+1

Хорошее решение. К сожалению, если сюжет уже имеет существующую легенду, это не изменяет цвет соответствующей записи в легенде. Можно ли расширить подход, чтобы изменить цвет записи легенды? – bluenote10

0

Один трюк, который вы могли бы рассмотреть, вместо того, чтобы пытаться изменить значения цвета после построения графика, вы можете использовать черный наложение с прозрачностью менее 100%, чтобы «угасать» прошлые графики, например. альфа 10% уменьшила бы яркость каждого прошлого графика последовательно.

2

Вы также можете использовать plt.set_cmap см here или (более подробно, прокрутите вниз) here:

import numpy as np 
import matplotlib.pyplot as plt 

plt.imshow(np.random.random((10,10)), cmap='magma') 
plt.colorbar() 
plt.set_cmap('viridis')