Python自学之Colormaps指南

目录

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.色彩映射表的性能考虑

在处理大型数据集时,色彩映射表的选择可能会影响可视化的性能。一些建议包括:

  1. 对于大型数据集,考虑使用更简单的色彩映射表,如 ‘gray’ 或 ‘binary’

  2. 使用 plt.colormaps() 查看所有可用的色彩映射表,选择适合你数据的最简单选项

  3. 如果需要自定义色彩映射表,尽量使用较少的颜色锚点


8.色彩映射表的最佳实践

为了创建有效的数据可视化,以下是一些使用色彩映射表的最佳实践:

  1. 始终为色彩映射表添加颜色条(colorbar),并标明其代表的含义

  2. 考虑你的目标受众,选择直观且易于理解的色彩映射表

  3. 对于科学出版物,选择可打印友好的色彩映射表

  4. 避免使用可能引起误解的色彩映射表,如彩虹色彩映射表

  5. 在可能的情况下,使用感知均匀的色彩映射表,如 ‘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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求: 要求在任务截止日期的前3天时,系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单,没有使用消息列队,也不能使用延时队列来做。 用Timer的话开销还挺大的&a…

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错,今天就给大家推荐 GitHub…

大数据学习16之Spark-Core

1. 概述 1.1.简介 Apache Spark 是专门为大规模数据处理而设计的快速通用的计算引擎。 一种类似 Hadoop MapReduce 的通用并行计算框架,它拥有MapReduce的优点,不同于MR的是Job中间结果可以缓存在内存中,从而不需要读取HDFS,减少…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中,桌面应用开发一直是一个备受关注的领域。今天,我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview,它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架,你将能够轻…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。大致可以分为:Bagging,Boosting 和 Stacking 三大类型。 (1)每次有放回地从训练集中取出 n 个训练样本&…

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

跨越网络边界:IPv6与零信任架构的深度融合

2024年,工信部发布了《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》,加速了国内网络由IPv4向IPv6的转型步伐。未来,各行各业将逐步去NAT,逐步向IPv6迁移。在此过程中,网络安全解决方案和产品能力将面…

从大数据到大模型:现代应用的数据范式

作者介绍:沈炼,蚂蚁数据部数据库内核负责人。2014年入职蚂蚁,承担蚂蚁集团的数据库架构职责,先后负责了核心链路上OceanBase,OceanBase高可用体系建设、NoSQL数据库产品建设。沈炼对互联网金融、数据库内核、数据库高可…

华为eNSP:MSTP

一、什么是MSTP? 1、MSTP是IEEE 802.1S中定义的生成树协议,MSTP兼容STP和RSTP,既可以快速收敛,也提供了数据转发的多个冗余路径,在数据转发过程中实现VLAN数据的负载均衡。 2、MSTP可以将一个或多个VLAN映射到一个Inst…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章,本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状,我们会从国内大户型和小户型的网络说起&…

Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】

下面是项目级完整配置1➡eslint:【吐血分享,博主踩过的坑你跳过去!!跳不过去?太过分了给博主打钱】 浏览器自动打开项目: 你想释放双手吗?你想每天早上打开电脑运行完项目自动在浏览器打开吗&a…

【SQL】E-R模型(实体-联系模型)

目录 一、介绍 1、实体集 定义和性质 属性 E-R图表示 2. 联系集 定义和性质 属性 E-R图表示 一、介绍 实体-联系数据模型(E-R数据模型)被开发来方便数据库的设计,它是通过允许定义代表数据库全局逻辑结构的企业模式&#xf…

LLM - 计算 多模态大语言模型 的参数量(Qwen2-VL、Llama-3.1) 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143749468 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 影响 (…

基于Java Springboot成都旅游网

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…

【阅读记录-章节1】Build a Large Language Model (From Scratch)

目录 1. Understanding large language models1.1 What is an LLM?补充介绍人工智能、机器学习和深度学习的关系机器学习 vs 深度学习传统机器学习 vs 深度学习(以垃圾邮件分类为例) 1.2 Applications of LLMs1.3 Stages of building and using LLMs1.4…

【WSL+Ubuntu】默认用户被意外变更为 root 后切回原来的默认用户

引言 在使用 Windows Subsystem for Linux (WSL) Ubuntu 时,在 ~ 目录下使用 ls 命令,发现所有文件都消失了,让我误以为文件被清空了。实际上是因为WSL Ubuntu的默认用户被意外地改变为了 root。那么,如何恢复并切回原来的默认用…

模式:每个服务一个数据库

Pattern: Database per service。 背景 如用微服务架构模式开发一个在线商店应用程序。大多数服务需要在某种数据库中持久化数据。如,订单服务存储订单信息,而客户服务存储客户信息。 问题 微服务应用程序中的数据库架构是什么? 驱动力…