【问题标题】:Matplotlib: change colormap after the factMatplotlib:事后更改颜色图
【发布时间】:2013-12-01 04:17:33
【问题描述】:

我正在绘制微分方程求解器(边界值问题)的进度图。每次迭代都会产生一组完整的函数评估 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 的答案中应该很明显,但以防万一。)

非常感谢。

【问题讨论】:

    标签: python colors matplotlib plot


    【解决方案1】:

    您可以考虑的一个技巧是,您可以使用透明度低于 100% 的黑色叠加层来“淡化”过去的绘图,而不是尝试在绘图后更改颜色值,例如10% 的 alpha 会依次降低每个过去绘图的亮度。

    【讨论】:

      【解决方案2】:

      使用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 之间有什么实际区别吗?谢谢。
      • 不错的解决方案。不幸的是,如果绘图已经有一个现有的图例,这也不会改变图例中相应条目的颜色。是否可以扩展方法以更改图例条目的颜色?
      • @bluenote10 在颜色更新后致电ax.legend()
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-03-17
        • 2013-07-21
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        相关资源
        最近更新 更多