一、colormap的基础概念
在matplotlib中,colormap(颜色映射)是一个非常重要的概念,它是一系列颜色的集合,可以将数据映射为颜色。在matplotlib中,通过调用函数plt.cm.get_cmap()可以得到colormap对象。Matplotlib中的所有colormap都可以被抽象成一个名为matplotlib.colors.Colormap的类。其中plt.cm.get_cmap()返回的是一个colormap,类型为matplotlib.colors.ListedColormap。
通常,colormap会被应用在某些无法直接观察的数据上,比如通过某些物理或数学模型得到的数据。使用colormap,可以将数据转化为颜色信息,从而方便用户观察数据的规律。colormap可以用于色彩渐变的表达,如黑白灰度图、彩虹图等,可视化数据最为常用的方式是ColorMap和ColorBar。
下面是一个简单的绘制Colormap的示例:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 1000) y = np.sin(x) plt.figure() plt.plot(x, y, color=plt.cm.get_cmap('viridis')(0.5)) plt.show()
在上述代码中,我们使用了viridis这个colormap,将sin函数绘制出来,并映射为颜色信息。其中,viridis是matplotlib库中的一个colormap,用来表示从深色到亮色的颜色渐变。我们调用函数plt.cm.get_cmap(‘viridis’)可以得到一个颜色渐变对象,x轴上的点的颜色就是由这个颜色渐变对象提供的。
二、colormap的典型类型
1. 离散映射 colormap
离散映射colormap表示颜色被分成了几个不同的区域,每个区域都分配了固定的颜色。这种映射是一种非常常见的方式,可以让人们更快速和准确地理解数据的分布情况。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2 * np.pi, 20) y = np.linspace(0, 2 * np.pi, 20).reshape(-1, 1) data = np.sin(x) + np.cos(y) plt.figure() plt.pcolor(data, cmap=plt.cm.get_cmap('Blues', 6)) plt.colorbar() plt.show()
在上述代码中,我们使用函数plt.pcolor()将离散数据绘制为颜色块。其中,我们指定了colormap为Blues,并且将颜色分成了6份。在使用plt.colorbar()函数时,我们可以看到颜色条上标注了6个不同颜色。
2. 连续映射 colormap
连续映射colormap通常是一条连续渐变的颜色条,颜色的深浅代表数据值的不同。通过查看颜色条,用户可以快速了解数据分布情况。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 1000) y = np.sin(x) plt.figure() plt.plot(x, y, color=plt.cm.get_cmap('plasma')(0.5)) plt.colorbar() plt.show()
在上述代码中,我们使用函数plt.plot()将连续的sin函数绘制为颜色块。我们指定了colormap为plasma,并将sin函数某一位置的颜色设置为0.5。在使用plt.colorbar()函数时,我们可以看到颜色条上颜色的连续渐变,代表了sin函数的连续变化。
3. 均匀型 colormap
均匀型colormap通常会将使用者指定的颜色均匀地分配给colormap上的不同位置。这种colormap非常适合数据分段显示的场景。
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0,2*np.pi,1000) y1 = np.sin(x) y2 = np.sin(x-np.pi/2) y3 = np.sin(x-np.pi) y4 = np.sin(x-np.pi*3/2) y5 = np.sin(x-np.pi*2) color = ['#00008B', '#B8860B', '#708090', '#FFD700', '#8B0000'] plt.figure() plt.plot(x, y1, color=color[0], label='y=sin(x)') plt.plot(x, y2, color=color[1], label='y=sin(x-pi/2)') plt.plot(x, y3, color=color[2], label='y=sin(x-pi)') plt.plot(x, y4, color=color[3], label='y=sin(x-3pi/2)') plt.plot(x, y5, color=color[4], label='y=sin(x-2pi)') plt.legend(loc='lower left') plt.show()
在上述代码中,我们使用函数plt.plot()将五条sin函数曲线绘制出来,我们指定了它们的颜色,使用向量color存储了五种颜色。其中,每种颜色都均匀地分配给了五条sin函数曲线的不同位置。
三、colormap的应用实例
1. 2D heatmap
2D heatmap通常会将colormap应用在比较大的数据集上,通常表示矩阵数据的密集程度。
import matplotlib.pyplot as plt import numpy as np data = np.random.rand(4, 6) * 4 plt.figure() plt.imshow(data, cmap='YlGn') plt.colorbar() plt.show()
在上述代码中,我们使用函数plt.imshow()将随机生成的4\*6的数据绘制为heatmap。我们指定了colormap为YlGn,并使用plt.colorbar()将颜色条添加到图像中。
2. 3D图形中的colormap
colormap可以被应用于3D图形中,帮助用户快速了解数据中三维变量的变化。
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') x = np.random.standard_normal(100) y = np.random.standard_normal(100) z = np.random.standard_normal(100) sc = ax.scatter(x, y, z, c=z, s=50, cmap='Blues') plt.colorbar(sc) plt.show()
在上述代码中,我们使用函数ax.scatter()将三个100个随机数序列分别绘制在了三个坐标轴上。我们指定了颜色参数为z,即z轴的数据。将颜色参数设置为z的原因是,我们希望颜色随着z轴的变化而发生变化。我们使用参数cmap='Blues'指定colormap为Blues,并使用plt.colorbar()添加了颜色条到图像中。
3. 带多个坐标轴的colormap
某些场景下,我们可能需要在同一个图像中绘制带有多个坐标轴的colormap。
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locatable fig, ax = plt.subplots() x, y = np.meshgrid(np.arange(0, 2 * np.pi, 0.1), np.arange(0, 2 * np.pi, 0.1)) z = (np.sin(x) * np.cos(y)) im = ax.imshow(z) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) plt.colorbar(im, cax=cax) ax2 = ax.twinx() ax2.plot(np.sin(x), color='r') plt.show()
在上述代码中,我们使用函数ax.imshow()将生成的数据绘制为图像。在添加颜色条时,我们使用了mpl_toolkits.axes_grid1模块中的make_axes_locatable()函数创建了一个axis locator对象,并以此创建了一个新的轴,cax。将颜色条的位置设置在了图像的右边。
在同一个图像中,我们还绘制了另一个ax2轴,plot了一个sin函数。可以看到,两个轴之间并不发生重叠,可以同时显示。
四、conclusion
本文对matplotlibcolormap做了全方位的介绍,包括colormap的概念、colormap的类型和colormap的应用实例。希望读者通过本文的介绍,能够熟练掌握matplotlib中colormap的使用方法,突破数据可视化的瓶颈。