目录
1.色彩映射表(Colormaps)是什么?
2.Matplotlib中的色彩映射表类型
2.1同色渐变(Sequential Colormaps)
2.2双色渐变(Divergence Colormaps)
2.3定性色彩(Qualitative Colormaps)
2.4多色渐变(Perceptually Uniform Sequential)
2.5大杂烩(Miscellaneous)
3.如何选择合适的色彩渐变
4.自定义色彩映射表
4.1 使用 LinearSegmentedColormap
4.2 使用 ListedColormap
4.3 修改现有色彩映射表
5.色彩映射表的高级应用
5.1 离散化色彩映射表
5.2 多维数据的色彩映射
5.3 色彩映射表的动画效果
6.色彩映射表在不同类型图表中的应用
6.1 热图(Heatmap)
6.2 等高线图(Contour Plot)
6.3 三维表面图(3D Surface Plot)
7.色彩映射表的性能考虑
8.色彩映射表的最佳实践
9.结论
10.参考文献
Colormaps(色彩映射表)是Python的一个颜色映射或调色板集合库,通常由颜色之间的渐变来表示数据的变化,常见的Colormap包括线性渐变、离散渐变和周期性渐变等,常见于Matplotlib中的Colormap模块和Seaborn库中的Colormap模块中。
【有代码没在文中体现的请留言私信】
1.色彩映射表(Colormaps)是什么?
色彩映射表是一种将数值数据映射到颜色的方法。它定义了一系列颜色,这些颜色按照特定的顺序排列,用于表示数据的不同值或范围。在数据可视化中,色彩映射表可以帮助我们更直观地理解数据的分布、趋势和模式。
首先,我们用一个简单的例子来展示如何使用色彩映射表来可视化一个二维数组:
cmap取值为viridis
import matplotlib.pyplot as plt
import numpy as np
# 创建一个简单的二维数组
data = np.random.rand(10, 10)
# 使用 'viridis' 色彩映射表绘制热图
plt.imshow(data, cmap='viridis')
plt.colorbar(label='Value')
plt.title('Simple Heatmap with Viridis Colormap')
plt.show()
根据需要对cmap取值进行修改,如果cmap取值为CMRmap_r,可以得到以下绘图:
我们可以将colormap理解为:matplotlib中的一种颜色集合。
2.Matplotlib中的色彩映射表类型
Matplotlib提供了多种类型的色彩映射表,每种类型都有其特定的用途和优势。以下是主要的色彩映射表类型:
2.1同色渐变(Sequential Colormaps)
同色渐变适用于表示从低到高或从高到低的连续数据。这些色图是近似平滑变化的单色色图,通常从低饱和度(例如白色)渐变到高饱和度(例如明亮的蓝色)。顺序色图非常适合大多数数据,因为它们非常清晰得展示了数据从低到高变化的过程。
具体颜色表现为:
绘图示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建一个简单的数据集
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 使用 'Blues' 顺序色彩映射表
plt.scatter(x, y, c=y, cmap='Blues')
plt.colorbar(label='sin(x)')
plt.title('Sequential Colormap Example (Blues)')
plt.show()
这个例子使用 ‘Blues’ 顺序色彩映射表来可视化 sin 函数。颜色从浅蓝色(低值)渐变到深蓝色(高值),清晰地展示了函数值的变化。
2.2双色渐变(Divergence Colormaps)
双色渐变适用于具有明确中心点或零点的数据,例如正负值或偏差数据。这些colormaps具有中间色调(通常是浅色),并且在高低值之间会平滑转换为不同的色调,当数据需要从中间分隔开时,Divergence色图是理想的选择(例如中间值为0,正值和负值分别表示为色图中的不同颜色)。
具体颜色表现为:
绘图示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建一个包含正负值的数据集
x = np.linspace(-5, 5, 100)
y = x**3
# 使用 'RdBu' 发散色彩映射表
plt.scatter(x, y, c=y, cmap='RdBu')
plt.colorbar(label='y = x^3')
plt.title('Diverging Colormap Example (RdBu)')
plt.axhline(y=0, color='k', linestyle='--')
plt.axvline(x=0, color='k', linestyle='--')
plt.show()
在这个例子中,我们使用 ‘RdBu’ 发散色彩映射表来可视化 y = x^3 函数。负值用蓝色表示,正值用红色表示,零点附近使用白色,清晰地展示了函数值的正负变化。
2.3定性色彩(Qualitative Colormaps)
定性色彩映射表适用于表示离散的、无序的类别数据。它们使用一组互不相同的颜色,每种颜色代表一个类别。这些colormaps的颜色变化非常快,适合用来选取一些离散的颜色。
具体颜色表现为:
绘图示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建类别数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
# 使用 'Set3' 定性色彩映射表
colors = plt.cm.Set3(np.linspace(0, 1, len(categories)))
plt.bar(categories, values, color=colors)
plt.title('
Qualitative Colormap Example (Set3)')
plt.ylabel('Value')
plt.show()
在这个例子中,我们使用 ‘Set3’ 定性色彩映射表来为不同类别的条形图着色。每个类别都有一个独特的颜色,使得各个类别之间易于区分。
2.4多色渐变(Perceptually Uniform Sequential)
几种颜色间渐变,具体颜色表现为:
2.5大杂烩(Miscellaneous)
不属于以上几种的colormaps,具体颜色表现为:
3.如何选择合适的色彩渐变
选择合适的色彩映射表对于有效传达数据信息至关重要。
以下是一些选择色彩映射表的建议:
1.考虑数据类型:
-
对于连续数据,使用同色渐变(顺序色彩映射表)
-
对于有中心点的数据,使用双色渐变(发散色彩映射表)
-
对于类别数据,使用定性(色彩映射表)
2.考虑色觉障碍:选择对色盲友好的色彩映射表,如 ‘viridis’、’plasma’ 或 ‘cividis’
3.考虑打印效果:如果图表需要打印,选择在灰度下仍有良好区分度的色彩映射表
4.避免彩虹色彩映射表:虽然 ‘jet’ 等彩虹色彩映射表看起来很吸引人,但它们可能会误导读者,不建议使用
以下是一个比较不同色彩映射表的示例:
绘图示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 比较不同的色彩映射表
cmaps = ['viridis', 'plasma', 'inferno', 'magma']
fig, axs = plt.subplots(2, 2, figsize=(12, 10))
for i, cmap in enumerate(cmaps):
ax = axs[i//2, i%2]
scatter = ax.scatter(x, y, c=y, cmap=cmap)
ax.set_title(f'{cmap.capitalize()}')
plt.colorbar(scatter, ax=ax, label='sin(x)')
plt.tight_layout()
plt.show()
这个例子比较了四种不同的色彩映射表(viridis、plasma、inferno 和 magma),它们都是对色盲友好的选择。通过比较,你可以选择最适合你的数据和目标受众的色彩映射表。
4.自定义色彩映射表
除了使用 Matplotlib 内置的色彩映射表,你还可以创建自定义的色彩映射表以满足特定需求。以下是几种创建自定义色彩映射表的方法:
4.1 使用 LinearSegmentedColormap
LinearSegmentedColormap 允许你通过定义颜色锚点来创建自定义的色彩映射表。
示例代码:
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
# 定义颜色锚点
colors_list = ['#ff0000', '#00ff00', '#0000ff']
# 红、绿、蓝
n_bins = 100
# 颜色数量
cmap = colors.LinearSegmentedColormap.from_list('How2matplotlib_custom', colors_list, N=n_bins)
# 创建数据
data = np.random.rand(10, 10)
# 使用自定义色彩映射表
plt.imshow(data, cmap=cmap)
plt.colorbar(label='Value')
plt.title('Custom Linear Segmented Colormap')
plt.show()
这个例子创建了一个从红色到绿色再到蓝色的自定义色彩映射表。你可以根据需要调整颜色锚点和颜色数量。
4.2 使用 ListedColormap
ListedColormap 允许你直接指定一系列颜色来创建色彩映射表,适合于创建离散的色彩映射表。
示例代码:
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
# 定义颜色列表
color_list = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
cmap = colors.ListedColormap(color_list)
# 创建类别数据
categories = ['A', 'B', 'C', 'D']
values = [1, 2, 3, 4]
# 使用自定义色彩映射表
plt.bar(categories, values, color=cmap(np.linspace(0, 1, len(categories))))
plt.title('Custom Listed Colormap')
plt.ylabel('Value')
plt.show()
这个例子创建了一个包含四种颜色的离散色彩映射表,适用于表示类别数据。
4.3 修改现有色彩映射表
你还可以通过修改现有的色彩映射表来创建新的色彩映射表,例如反转颜色顺序或调整亮度。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 修改现有色彩映射表
original_cmap = plt.cm.viridis
reversed_cmap = original_cmap.reversed()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 原始色彩映射表
scatter1 = ax1.scatter(x, y, c=y, cmap=original_cmap)
ax1.set_title('Original Viridis')
plt.colorbar(scatter1, ax=ax1, label='sin(x)')
# 反转后的色彩映射表
scatter2 = ax2.scatter(x, y, c=y, cmap=reversed_cmap)
ax2.set_title('Reversed Viridis')
plt.colorbar(scatter2, ax=ax2, label='sin(x)')
plt.tight_layout()
plt.show()
这个例子展示了如何反转 ‘viridis’ 色彩映射表,创建一个新的色彩映射表。
5.色彩映射表的高级应用
除了基本的应用外,色彩映射表还有一些高级用法,可以进一步增强数据可视化的效果。
5.1 离散化色彩映射表
有时,我们需要将连续的色彩映射表离散化,以便更清晰地区分不同的数值范围。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm
# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 定义离散化的边界和规范化
levels = [-1, -0.5, 0, 0.5, 1]
norm = BoundaryNorm(levels, plt.cm.viridis.N)
# 绘制离散化的散点图
plt.scatter(x, y, c=y, cmap='viridis', norm=norm)
plt.colorbar(label='sin(x)', ticks=levels)
plt.title('Discretized Colormap')
plt.show()
这个例子将 ‘viridis’ 色彩映射表离散化为四个区间,使得数据的分类更加明显。
5.2 多维数据的色彩映射
对于多维数据,我们可以使用多个色彩映射表来表示不同的维度。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建三维数据
x = np.random.rand(50)
y = np.random.rand(50)
size = np.random.rand(50) * 500
color = np.random.rand(50)
# 使用多个色彩映射表
plt.scatter(x, y, s=size, c=color, cmap='viridis', alpha=0.7)
plt.colorbar(label='Color Value')
plt.title('Multi-dimensional Data Visualization')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
在这个例子中,我们使用点的大小表示一个维度,颜色表示另一个维度,从而在二维平面上展示四维数据。
5.3 色彩映射表的动画效果
通过动画,我们可以展示色彩映射表随时间变化的效果,这对于展示时间序列数据特别有用。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
# 创建初始数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
fig, ax = plt.subplots()
scatter = ax.scatter(x, y, c=y, cmap='viridis')
plt.colorbar(scatter)
# 更新函数
def update(frame):
y = np.sin(x + frame/10)
scatter.set_offsets(np.c_[x, y])
scatter.set_array(y)
ax.set_title(f'Frame {frame}')
return scatter,
# 创建动画
anim = FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.show()
这个例子创建了一个动画,展示了正弦波随时间变化的过程,色彩映射表随之动态更新。
6.色彩映射表在不同类型图表中的应用
色彩映射表可以应用于多种类型的图表,以下是一些常见的应用示例:
6.1 热图(Heatmap)
热图是色彩映射表最常见的应用之一,用于可视化二维数据的分布。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
data = np.random.rand(10, 12)
# 绘制热图
plt.imshow(data, cmap='YlOrRd')
plt.colorbar(label='Value')
plt.title('Heatmap Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
这个例子使用 ‘YlOrRd’ 色彩映射表创建了一个热图,展示了随机数据的分布情况。
6.2 等高线图(Contour Plot)
等高线图使用色彩映射表来表示三维数据在二维平面上的投影。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
# 绘制等高线图
plt.contourf(X, Y, Z, cmap='coolwarm')
plt.colorbar(label='Z Value')
plt.title('Contour Plot Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
这个例子使用 ‘coolwarm’ 色彩映射表创建了一个等高线图,展示了 Z = sin(X) * cos(Y) 函数的等高线。
6.3 三维表面图(3D Surface Plot)
色彩映射表也可以应用于三维图表,增强立体效果。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# 创建数据
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 绘制三维表面图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
fig.colorbar(surf, label='Z Value')
ax.set_title('3D Surface Plot Example')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
这个例子使用 ‘viridis’ 色彩映射表创建了一个三维表面图,展示了 Z = sin(sqrt(X^2 + Y^2)) 函数的三维形态。
7.色彩映射表的性能考虑
在处理大型数据集时,色彩映射表的选择可能会影响可视化的性能。一些建议包括:
-
对于大型数据集,考虑使用更简单的色彩映射表,如 ‘gray’ 或 ‘binary’
-
使用
plt.colormaps()
查看所有可用的色彩映射表,选择适合你数据的最简单选项 -
如果需要自定义色彩映射表,尽量使用较少的颜色锚点
8.色彩映射表的最佳实践
为了创建有效的数据可视化,以下是一些使用色彩映射表的最佳实践:
-
始终为色彩映射表添加颜色条(colorbar),并标明其代表的含义
-
考虑你的目标受众,选择直观且易于理解的色彩映射表
-
对于科学出版物,选择可打印友好的色彩映射表
-
避免使用可能引起误解的色彩映射表,如彩虹色彩映射表
-
在可能的情况下,使用感知均匀的色彩映射表,如 ‘viridis’ 系列
9.结论
Matplotlib 的色彩映射表是一个强大的工具,可以大大提升数据可视化的效果和信息传达能力。通过理解不同类型的色彩映射表,掌握选择和自定义的方法,以及在各种图表中的应用技巧我们可以创建出更加专业、有效的数据可视化作品。
重要的是,选择合适的色彩映射表不仅仅是为了美观,更重要的是要准确、清晰地传达数据信息。
10.参考文献
1.The misuse of colour in science communication | Nature Communications
2. Scientific Colormaps - Colormaps
3.https://matplotlib.org/stable/users/explain/colors/colormaps.html