Matplotlib:事后更改色图

8
我正在跟踪求解微分方程求解器(边界值问题)的进展情况。每次迭代都会产生完整的函数评估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个回答

8

您还可以使用plt.set_cmap,请参见此处或(更详细地,请向下滚动)此处

import numpy as np
import matplotlib.pyplot as plt

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

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

太棒了。该函数可以轻松修改以将行数和色图作为选项,这解决了我的第二个问题。只有一个快速的后续问题,import pylab as plimport matplotlib.pyplot as plt 之间是否存在任何实际差异?谢谢。 - bongbang
1
不错的解决方案。不过,如果图表已经有现有的图例,这种方法不会改变图例中相应条目的颜色。是否可能扩展该方法以同时更改图例条目的颜色? - bluenote10
在颜色更新后,@bluenote10调用ax.legend() - Guimoute

1

您可以考虑的一个技巧是,在绘图后不尝试更改颜色值,而是使用带有不到100%透明度的黑色覆盖层来“淡化”过去的绘图,例如10%的 alpha 将逐个降低每个过去绘图的亮度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接