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

2024-04-13

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

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”,但不适用于臭名昭著的“jet”、“prism”或“summer”彩色贴图。发生这种情况是因为(似乎)这些地图没有“颜色”属性:

runfile('F:/Documents/Programs/Python/Colourmap_Plot.py', wdir='F:/Documents/Programs/Python') 回溯(最近调用 最后的):

文件“F:\Documents\Programs\Python\Colourmap_Plot.py”,第 37 行,位于 对于mapa.colors中的项目:

AttributeError:“LinearSegmentedColormap”对象没有属性 '颜色'

我想知道为什么会发生这种情况。所有地图的结构不都应该相同吗?我如何区分具有“颜色”属性的地图和不具有“颜色”属性的地图?最后,如何从这些“不合格”地图之一中绘制组件?


matplotlib 中有两种类型的颜色图

  • ListedColormaps
  • LinearSegmentedColormaps

ListedColormaps 基本上是颜色列表。您可以通过以下方式获取颜色数量cmap.N你可以通过以下方式获得颜色本身cmap.colors.

LinearSegmentedColormaps 通过插值来定义。它们将一些采样点存储在字典中,并可以根据所需的颜色数量在这些采样点之间进行插值。当前的颜色数量同样可以通过cmap.N.

所有地图的结构不都应该相同吗?

我想他们应该。至少LinearSegmentedColormaps 应该暴露一个.colors属性也是如此。

我如何区分具有“颜色”属性的地图和不具有“颜色”属性的地图?

您可以以类型或实例进行比较。

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.")

最后,如何从这些“不合格”地图之一中绘制组件?

从颜色图中获取颜色(与颜色类型无关)的一个可能选项是使用以下列表/数组来调用颜色图:integers,有效地索引所有颜色cmap.N:

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

colors现在是一个N by 4地图 RGBA 颜色的形状数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Matplotlib 颜色图的结构不同? 的相关文章

随机推荐