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,一经查实,立即删除!

相关文章

PostgreSQL高可用Patroni安装(超详细)

目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…

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

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

ubuntu下怎么设置机器程序开机自启?

在 Ubuntu 中,可以通过多种方法设置程序或脚本在系统启动时自动运行。以下是几种常见方法: 方法 1:使用 crontab crontab 是一个定时任务管理工具,可以用来设置程序在开机时自动运行。 1. 打开终端,编辑当前用户的 …

从视频帧生成点云数据、使用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,减少…

TDSQL 免密码登录

需求 os用户免密登录tdsql 解决方案 使用mysql自带的 mysql_config_editor 工具 提示:使用这个工具,登录密码不能包含#字符。 操作步骤 建os账号,切换到新账号 [roottdsql1 ~]# useradd jdbc_user [roottdsql1 ~]# su - jdbc_user [jd…

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

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

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

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

某某科技笔试题

(15题,45分钟,闭卷) 一、( 8 分 )请问以下程序输出什么结果? char *getStr(void) 。 { char p[] "hellow world"; return p; } void test(void) { ch…

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

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

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

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

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

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

vue3 + vite + ts 配置 @ 别名

第一步 npm install types/node -D第二步 这是原 vite.config.ts文件import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()], })改成下面这个import { defineConfig } from vite …

Android Framework AMS面试题及参考答案

目录 什么是 AMS? AMS 在 Android 系统中的作用? AMS 是如何启动的? Zygote、SystemServer 与 AMS 之间的关系? AMS 如何与其他系统服务(如 PackageManagerService、WindowManagerService、WMS)交互? AMS 如何使用 Binder 完成通信? AMS 如何管理系统服务的启动…

从零开始学习 sg200x 多核开发之 eth0 dhcpc 配置

前面已经介绍过 sophpi 的启动过程和 eth0 静态 IP 地址配置。不过静态 IP 在使用的时候比较不通用,本文介绍 eth0 自动使能并配置 dhcp 功能。 udhcpc udhcpc 是 BusyBox 工具集中的一个组件,用于从 DHCP 服务器获取网络配置信息,如 IP 地…

开源vs闭源:你更看好哪一方?

开源vs闭源:你更看好哪一方? 引言 你有没有想过,在当今人工智能(AI)蓬勃发展的时代,开源大模型与闭源大模型之间的竞争竟然如此激烈?这仿佛就像是两位骑士在同一片战场上,争夺你我心目中“最强武器”的荣耀。在这场有趣又复杂的较量中,数据隐私、商业应用与社区参与…

华为eNSP:MSTP

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

利用python 检测当前目录下的所有PDF 并转化为png 格式

以下是一个完整的 Python 脚本,用于检测当前目录下的所有 PDF 文件并将每一页转换为 PNG 格式: import os from pdf2image import convert_from_path# 设置输出图像的 DPI(分辨率) DPI 300# 获取当前目录 current_directory os…

24. 正则表达式

一、什么是正则表达式 正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式&…