Matplotlib:在th之后更改颜色映射

2024-05-16 19:55:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在绘制微分方程求解器(边值问题)的进度图。每次迭代都会产生一组完整的函数求值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。把这条线放在循环之后是行不通的。

我知道我可以存储我的中间结果,并且只有在达到收敛之后才能进行绘图,但是这让我觉得很难,因为除了在绘图上看到它们之外,我真的对所有的中间结果都没有用处。

下面是我的问题: 一。如何在绘制后更改现有图形的颜色映射?(这在MATLAB中很简单。) 2。如何在不干扰第一个集合的情况下,对同一个plot上的另一个图形集合(例如,来自不同的初始猜测,收敛到不同的解决方案)执行相同的操作,以便两个颜色映射区分集合。(问题1的答案应该很明显,但只是以防万一。)

非常感谢。


Tags: inforplot颜色绘制cmrangeplt
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)

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

你可以考虑的一个技巧是不要在绘图后试图更改颜色值,你可以使用透明度小于100%的黑色覆盖来“淡入”过去的绘图,例如,10%的alpha将按顺序降低每个过去绘图的亮度。

相关问题 更多 >