python 为什么Matplotlib的颜色图结构不同?

iqxoj9l9  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(114)

我能够用这个简单的Python脚本绘制 some Matplotlib的颜色图的RGB分量:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

mapa = cm.get_cmap('viridis', 256)

R = []; G = []; B = []

ind = np.linspace(1,256,256)

for item in mapa.colors:
    R.append(item[0])
    G.append(item[1])
    B.append(item[2])
    
plt.figure(1,figsize=(8,8))

plt.plot(ind,R,'r-')
plt.plot(ind,G,'g-')
plt.plot(ind,B,'b-')

plt.xlabel('$Colour \\ index$', fontsize=16, fontname="Times")
plt.ylabel('$RGB \\ component \\ weight$', fontsize=16, fontname="Times")

plt.show()

一些,但不是全部。它可以与'viridis',但不与臭名昭著的'喷气',或'棱镜',或'夏季'彩色Map。这是因为(看起来)这些Map没有属性'colors':
runfile('F:/Documents/Programs/Python/Colourmap_Plot. py',wdir ='F:/Documents/Programs/Python')Traceback(最近调用最后一次):
文件“F:\Documents\Programs\Python\Colourmap_Plot.py”,第37行,用于mapa.colors中的项目:
属性错误:“LinearSegmentedColormap”对象没有属性“colors”
我想知道为什么会这样。所有的Map在结构上不应该是一样的吗?我如何区分Map有没有“颜色”属性?最后,如何从这些“不符合”的Map中绘制组件?

cclgggtu

cclgggtu1#

matplotlib中有两种类型的色彩Map表

  • ListedColormap s
  • LinearSegmentedColormap s

ListedColormap基本上是一个颜色列表。通过cmap.N获取颜色的数量,通过cmap.colors获取颜色本身。
LinearSegmentedColormap s由插值定义。它们将一些采样点存储在字典中,并且可以根据所需的颜色数量在这些采样点之间进行插值。当前的颜色数量同样可以通过cmap.N访问。
所有的Map在结构上不应该是一样的吗?
我想他们应该。至少LinearSegmentedColormap s还应该公开.colors属性。
我如何区分Map有没有“颜色”属性?
您可以键入或示例比较。

if isinstance(cmap, matplotlib.colors.LinearSegmentedColormap):
    # do something
    print("Is a segmented map")
elif isinstance(cmap, matplotlib.colors.ListedColormap):
    # do something else
    print("Is a listed map")

也可以检查属性是否存在,

if hasattr(cmap, "colors"):
    print("Is a listed map")
else:
    print("Is either not a colormap, or is a segmented one.")

最后,如何从这些“不符合”的Map中绘制组件?
从色彩Map表中获取颜色的一个可能的选项,独立于它们的类型,是用一个 integers 的列表/数组调用色彩Map表,有效地索引到cmap.N的所有颜色:

colors = cmap(np.arange(0,cmap.N))

colors现在是贴图的RGBA颜色的N by 4形状阵列。

相关问题