在 matplotlib 中获取样本颜色

Getting a sample color in matplotlib

是否可以通过在 python 中提供原始 RGB 值(或其他颜色图,如 RdYlBu)来了解绘图中会出现什么颜色?目前我必须首先使用转换浮点数 cm.RdYlBu(x) 并绘制图表以查看颜色如何显示。但是有没有快速检查颜色的方法呢?不一定在 python 中,但任何根据颜色图获取值和 returns 颜色的网站都可以。

the color converter here。它以 RGB 值作为输入。

快速签入 python 控制台

您可以使用 python 本身来快速显示具有 matplotlib 颜色图中相应颜色的图形。

例如写一个函数

def c(x):
   col = plt.cm.RdYlBu(x)
   fig, ax = plt.subplots(figsize=(1,1))
   fig.set_facecolor(col)
   ax.axis("off")
   plt.show()

然后用感兴趣的号码调用它,例如c(0.4).

在 jupyter 控制台中的示例:

颜色图查看器

当然也可以用matplotlib写一些彩色地图查看器。例如:

import sys
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.widgets

class CMViewer():
    def __init__(self, cmap, valinit=0.5):
        self.cmap = plt.get_cmap(cmap)
        col = self.cmap(valinit)
        self.fig, axes = plt.subplots(nrows=4, figsize=(5,3), num=cmap,
                                      gridspec_kw={"height_ratios" : [0.3,1,1,1]})
        self.fig.subplots_adjust(right=0.85)
        self.sliderax, self.cax, self.fax, self.lax = axes
        
        self.slider = matplotlib.widgets.Slider(self.sliderax, cmap, 0., 1., 
                                                valinit=valinit)
        self.slider.on_changed(self.update)
        self.slider.vline.set_color("k")
        
        x = np.linspace(0.,1.,256)
        self.cax.imshow(x[np.newaxis, :], cmap=cmap, aspect="auto")
        ta = dict(axis="both", bottom=0, left=0, labelbottom=0, labelleft=0)
        self.cax.tick_params(**ta)
        self.fax.tick_params(**ta)
        self.lax.tick_params(**ta)
        
        x = np.array([0,0,1,2,2])
        self.lax.imshow(x[np.newaxis, :], cmap="gray", aspect="auto", 
                        extent=[0,1,-0.2,1.2])
        self.lines = []
        for i in range(5):
            line = self.lax.plot([0,1],[i/4.,i/4.], alpha=0.2+i/5., color=col)[0]
            self.lines.append(line)
        
        self.update(0)
        plt.show()
        
    def fmtcol(self, col):
        return "{:.3f}  |  {:.3f}  |  {:.3f}".format(*col)

    def update(self, val):
        x = self.slider.val
        col = self.cmap(x)
        self.fax.set_facecolor(col)
        for line in self.lines:
            line.set_color(col)
        self.slider.poly.set_color(col)
        self.slider.vline.set_xdata(x)
        self.lax.set_xlabel(self.fmtcol(col))
        self.fig.canvas.draw_idle()

if __name__ == "__main__":
    if len(sys.argv) > 1:     
        CMViewer(sys.argv[1])
    else:
        CMViewer("RdYlBu")

如果将其保存为 CMViewer.py,它可能会 运行 像

这样的脚本
> python CMViewer.py 

或指定颜色图,

> python CMViewer.py viridis