Python 为什么是Matplotlib的结构';什么颜色的地图不同?

Python 为什么是Matplotlib的结构';什么颜色的地图不同?,python,matplotlib,Python,Matplotlib,我能够使用以下简单的Python脚本绘制一些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 = []

我能够使用以下简单的Python脚本绘制一些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”,但不适用于臭名昭著的“jet”或“prism”或“summer”彩色地图。这是因为(似乎)这些贴图没有“颜色”属性:

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

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

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

我想知道为什么会这样。难道所有的地图在结构上不应该是平等的吗?我如何区分具有“颜色”属性的地图和不具有“颜色”属性的地图?最后,如何从这些“不一致”地图中绘制组件


谢谢。

matplotlib中有两种颜色贴图

  • ListedColormap
    s
  • LinearSegmentedColormap
    s
ListedColormap
s基本上是一个颜色列表。您可以通过
cmap.N
获取颜色数,也可以通过
cmap.colors
获取颜色本身

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

难道所有的地图在结构上不应该是平等的吗

我想他们应该。至少
LinearSegmentedColormap
s还应公开
.colors
属性

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

您可以输入或实例Comparison

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.")
最后,如何从这些“不一致”地图中绘制组件

从colormap获取颜色的一个可能选项,与颜色的类型无关,是使用整数列表/数组调用colormap,有效地索引所有颜色,直到
cmap.N

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

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

如果我导入
matplotlib
并编写
mapa=matplotlib.cm,对我来说效果很好。get_cmap(…
我的错了,我发布了一个错误的脚本版本。原来的脚本有一个“from matplotlib import cm”我只是无缘无故地删除了这一行。我发布了一个更正版本。另请参阅本教程:@Jody Klymak,该教程正是从我开始的地方开始的。但我直到最后才读到“这可能会有所不同。我稍后会仔细看一看。谢谢。如果我没有弄错的话,还有第三种地图。tab10似乎是其中之一。RGB组件是作为元组的元组列表,而不是列表列表(数组)。我想知道为什么。它有
.colors
属性。
tab10
应该与
viridis
相同,例如
ListedColormap
。你有显示它们之间任何差异的代码吗?我验证的是
cm.viridis.colors
显示类似
[[0.267004,0.004874,0.329415],而
cm.tab10.colors
显示
((0.12156862745098039,0.46666667,0.7058823529411765),…
。这显然是一种不同的结构,元组取代了列表。对。没有发生类型转换,
。颜色实际上保持原样。我同意这是不可取的。现在你可以自己转换成numpy数组,
np.array(cmap.colors)