Matplotlib:事后改变colormap

时间:2013-11-18 05:18:12

标签: python colors matplotlib plot

我正在绘制微分方程求解器的进度(边值问题)。每次迭代产生一组完整的函数评估f(x),然后可以相对于x绘制。每个图(假设)比最后一个图更接近正确的解,直到达到收敛。顺序色图用于使早期的图形褪色,然后使图像饱和。

当预定迭代次数时,这种方法很好:

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

答案 0 :(得分:4)

使用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)

答案 1 :(得分:4)

您也可以使用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')

答案 2 :(得分:0)

您可以考虑的一个技巧是在绘制之后尝试更改颜色值,而不是使用透明度低于100%的黑色覆盖图来“淡化”过去的绘图,例如: 10%的α会逐渐降低每个过去情节的亮度。