使用 Python Matplotlib 自定义颜色图
- 在 Python 中使用 Matplotlib 创建自定义颜色图
-
在 Python 中使用 Matplotlib 的
get_cmap()
方法访问颜色图及其值 -
在 Python 中使用
ListedColormap
对象的colors
属性创建自定义列出的颜色图 - 在 Python 中如何创建自定义线性分段颜色图
- 结论
颜色图是显示图形中连续值和离散值之间变化的最有效方法之一。本文将讨论在 Python 中使用 Matplotlib 创建自定义颜色图。
在 Python 中使用 Matplotlib 创建自定义颜色图
matplotlib
库提供各种内置颜色图。但是,假设你想要操作颜色图或创建自定义颜色图。在这种情况下,你可以使用 matplotlib
库中定义的 ListedColormap
类或 LinearSegmentedColormap
类来完成。
在创建自定义颜色图之前,让我们首先讨论如何访问 Matplotlib 颜色图中的值以了解颜色图的实现。它将使我们能够创建自己选择的自定义颜色图。
在 Python 中使用 Matplotlib 的 get_cmap()
方法访问颜色图及其值
Matplotlib 模块中定义了各种颜色图。每个颜色图都被分配了唯一的名称。我们可以使用 matplotlib
库的 cm
模块中的 get_cmap()
方法访问颜色图。
get_cmap()
方法的语法如下。
matplotlib.cm.get_cmap(name=None, lut = None)
name
参数接受颜色图的名称作为字符串或matplotlib.colors
模块中定义的Colormap
对象。它的默认值为None
。如果我们没有为参数名称指定任何输入,get_cmap()
方法将返回viridis
颜色图。- 如果在 Matplotlib 库中定义了具有指定名称的颜色图,则
get_cmap()
方法返回一个Colormap
实例。 - 参数
lut
的默认值为None
。如果lut
不是None
,它应该是一个整数,指定用于定义颜色图的列表中的颜色数。 - 如果
name
不是有效的颜色图并且lut
不是None
,则重新采样颜色图以在查找表中输入lut
值。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
cm.get_cmap('viridis', 8)
输出:
以上代码已经在 Jupyter Notebook 的交互式 shell 中运行。如果你尝试在不同的 IDE 中执行它,你可能会或可能不会将上述图像作为输出。
get_cmap()
方法返回的颜色图是可调用的。当我们将一个介于 0 和 1 之间的值传递给颜色图对象时,它会返回一个 RGBA 值。
你可以在此示例中观察到这一点。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
viridis=cm.get_cmap('viridis', 8)
print(viridis(0.56))
输出:
(0.122312, 0.633153, 0.530398, 1.0)
在 Python 中使用 ListedColormap
对象的 colors
属性创建自定义列出的颜色图
要创建自定义 ListedColormap
,让我们首先看看颜色是如何存储在 ListedColormap
中的。为此,我们可以使用 ListedColormap
对象的 colors
属性。
例如,viridis
是一个 ListedColormap
。我们可以使用 viridis
颜色图的颜色属性来观察颜色值,如下例所示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
viridis=cm.get_cmap('viridis', 8)
print(viridis.colors)
输出:
[[0.267004 0.004874 0.329415 1. ]
[0.275191 0.194905 0.496005 1. ]
[0.212395 0.359683 0.55171 1. ]
[0.153364 0.497 0.557724 1. ]
[0.122312 0.633153 0.530398 1. ]
[0.288921 0.758394 0.428426 1. ]
[0.626579 0.854645 0.223353 1. ]
[0.993248 0.906157 0.143936 1. ]]
在这里,你可以看到颜色存储在 Nx4
数组中。你还可以通过使用所需的序列作为输入参数调用颜色图名称来访问 ListedColormap
的指定行数,如下所示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
viridis=cm.get_cmap('viridis', 8)
print(viridis(range(0,8)))
输出:
[[0.267004 0.004874 0.329415 1. ]
[0.275191 0.194905 0.496005 1. ]
[0.212395 0.359683 0.55171 1. ]
[0.153364 0.497 0.557724 1. ]
[0.122312 0.633153 0.530398 1. ]
[0.288921 0.758394 0.428426 1. ]
[0.626579 0.854645 0.223353 1. ]
[0.993248 0.906157 0.143936 1. ]]
如你所见,ListedColormap
使用列表表示。因此,要在 Python 中创建自定义 ListedColormap
,我们必须创建一个表示颜色图颜色的列表。
在 Python 中使用颜色名称创建自定义列出的颜色图
我们可以使用 ListedColormap()
方法创建自定义列表颜色图。ListedColormap()
方法的语法如下。
matplotlib.colors.ListedColormap(colors, name='from_list', N=None)
- 参数
colors
采用颜色名称或表示 RGBA 值的数值的数组或列表。 - 参数
name
用于为创建的自定义颜色图指定特定名称。它有一个默认值from_list
。 - 参数 N 表示颜色图中的条目数。它的默认值为
None
。当 N 的值为 None 时,colors
列表中的每种颜色都应该有一个颜色图条目。
要使用 ListedColormap()
方法和颜色列表创建自定义列出的颜色图,你可以将四种颜色的名称传递给 ListedColormap()
方法。它将返回一个 Colormap
对象。
之后,你可以使用 Colormap
对象绘制数据,如下所示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata=[1,2,3,4,5,6,7,8,9,10,11,12]
ydata=[x*x for x in xdata]
norm=plt.Normalize(1,150)
cmap = ListedColormap(["darkorange", "gold", "lawngreen", "lightseagreen"])
c=np.linspace(0,150,12)
plt.scatter(xdata,ydata,c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
输出:
在 Python 中使用 RGBA 值创建自定义列出的颜色图
你可以使用具有 RGBA 值的数组来创建颜色图,而不是使用颜色名称,如下所示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata=[1,2,3,4,5,6,7,8,9,10,11,12]
ydata=[x*x for x in xdata]
norm=plt.Normalize(1,150)
colorarray=[[.57647055, 0.4116, 0.27107143 ,1 ],[0, 0.4116, 0.27107143 ,1 ],[.57647055, 0, 0.27107143 ,1 ]]
cmap = ListedColormap(colorarray)
c=np.linspace(0,150,12)
plt.scatter(xdata,ydata,c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
输出:
在 Python 中如何创建自定义线性分段颜色图
在创建自定义线性分段颜色图之前,让我们观察颜色值如何存储在线性分段颜色图中。
线性分段颜色图没有 color
属性。但是,我们可以调用带有所需序列的颜色图名称作为输入参数来观察颜色值。
例如,我们可以如下查看 copper
颜色图的颜色值。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
copper = cm.get_cmap('copper', 8)
print(copper(range(0,8)))
输出:
[[0. 0. 0. 1. ]
[0.17647055 0.1116 0.07107143 1. ]
[0.35294109 0.2232 0.14214286 1. ]
[0.52941164 0.3348 0.21321429 1. ]
[0.70588219 0.4464 0.28428571 1. ]
[0.88235273 0.558 0.35535714 1. ]
[1. 0.6696 0.42642857 1. ]
[1. 0.7812 0.4975 1. ]]
Python Matplotlib 中的 cdict
是什么
LinearSegmentedColormap
类使用在其间插入 RGBA 值的锚点来定义线性分段颜色图。
- 每个锚点都被指定为
[x[i] yleft[i] yright[i]]
形式的矩阵中的一行。x[i]
是锚点,yleft[i]
和yright[i]
是锚点两侧的颜色值。 - 如果颜色图在锚点处不连续,则
yleft[i]
和yright[i]
将具有不同的值。否则,yleft[i]
和yright[i]
具有相同的值。 - 锚点存储在颜色字典中,通常称为
cdict
。字典的键是red
、green
和blue
,对应的值是指定为[x[i] yleft[i] yright[i]] 形式矩阵中的行的锚点
。在cdict
的每个条目中,x[i]
值必须从 0 单调增加到 1。
你可以按如下方式创建颜色字典。
cdict = {'blue': [[0.0, 0.0, 0.0],
[0.5, 1.0, 1.0],
[1.0, 1.0, 1.0]],
'red': [[0.0, 0.0, 0.0],
[0.25, 0.0, 0.0],
[0.75, 1.0, 1.0],
[1.0, 1.0, 1.0]],
'green': [[0.0, 0.0, 0.0],
[0.5, 0.0, 0.0],
[1.0, 1.0, 1.0]]}
在 Python 中使用锚点创建自定义线性分段颜色图
创建 cdict
后,你可以使用 LinearSegmentedColormap()
方法创建线性分段颜色图。LinearSegmentedColormap()
方法的语法如下。
matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)
name
参数表示颜色图的名称。它必须是一个字符串。- 参数
segmentdata
将cdict
作为输入参数。 - 参数 N 表示颜色图查找表中的点数。它的默认值为 256。
- 参数
gamma
表示用于 x 坐标的缩放。它的默认值为 1.0。
如下所示,我们可以使用 LinearSegmentedColormap()
方法创建线性分段颜色图。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata=[1,2,3,4,5,6,7,8,9,10,11,12]
ydata=[x*x for x in xdata]
norm=plt.Normalize(1,150)
cdict = {'blue': [[0.0, 0.0, 0.0],
[0.5, 1.0, 1.0],
[1.0, 1.0, 1.0]],
'red': [[0.0, 0.0, 0.0],
[0.25, 0.0, 0.0],
[0.75, 1.0, 1.0],
[1.0, 1.0, 1.0]],
'green': [[0.0, 0.0, 0.0],
[0.5, 0.0, 0.0],
[1.0, 1.0, 1.0]]}
newcmp = LinearSegmentedColormap('testCmap', segmentdata=cdict, N=256)
c=np.linspace(0,80,12)
plt.scatter(xdata,ydata,c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()
输出:
在 Python 中使用颜色名称创建自定义线性分段颜色图
除了使用 cdict
,我们还可以使用颜色列表来创建自定义颜色图。为此,我们可以使用 LinearSegmentedColormap.from_list()
方法。from_list()
方法的语法如下。
from_list(name, colors, N=256, gamma=1.0)
这里,参数 colors
将颜色列表作为输入参数。所有其他参数都类似于 LinearSegmentedColormap()
方法。
你可以使用 from_list()
方法创建线性分段颜色图,如下所示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors
xdata=[1,2,3,4,5,6,7,8,9,10,11,12]
ydata=[x*x for x in xdata]
norm=plt.Normalize(1,150)
colorlist=["darkorange", "gold", "lawngreen", "lightseagreen"]
newcmp = LinearSegmentedColormap.from_list('testCmap', colors=colorlist, N=256)
c=np.linspace(0,80,12)
plt.scatter(xdata,ydata,c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()
输出:
结论
本文讨论了在 Python 中使用 Matplotlib 创建自定义颜色图的不同方法。我们创建了列出的颜色图和线性分段颜色图,并使用颜色图绘制了一些数据。