Python自学之Colormaps指南

news2024/11/20 11:34:23

目录

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.coloradmin.cn/o/2244006.html

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

相关文章

CentOS 环境下通过 YUM 安装软件

操作场景 为提升用户在云服务器上的软件安装效率,减少下载和安装软件的成本,腾讯云提供了 YUM 下载源。在 CentOS 环境下,用户可通过 yum 命令快速安装软件。对于 YUM 下载源,用户不需要添加软件源,可以直接安装软件包…

手机远程控制电脑,让办公更快捷

在数字化办公的浪潮下,远程控制软件已成为连接工作与生活的桥梁。它使得用户能够通过一台设备(主控端)来操作另一台设备(被控端),无论它们是否位于同一局域网内。这种软件广泛应用于远程办公、手机远程控制…

WebRTC实现双端音视频聊天(Vue3 + SpringBoot)

目录 概述 相关概念 双端连接整体实现步骤概述 文章代码实现注意点 STUN和TURN服务器的搭建 开发过程描述 后端开发流程 前端开发流程 效果演示 Gitee源码地址 概述 文章描述使用WebRTC技术实现一对一音视频通话。 由于设备摄像头限制(一台电脑作测试无法…

[C++]:C++11(二)

1. 左值与右值 1.1 左值与右值的概念 左值:左值本质上是一个表示数据的表达式,常见的如变量名或者解引用后的指针等形式。它具备以下显著特点: 可被取地址:能够通过取地址操作符 & 获取其内存地址,这意味着它在内…

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书: Acme PHP | Rob…

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…

Cargo Rust 的包管理器

Cargo->Rust 的包管理器 Cargi简介Cargo 的主要功能1. 创建项目2. 管理依赖3. 构建项目4. 运行项目5. 测试代码6. 检查代码7. 生成文档8. 发布和分享包 Cargo 的核心文件1. Cargo.toml2. Cargo.lock **Cargo 的生态系统** 常用命令总结Hello, Cargo! 示例 Cargi简介 Cargo …

代码随想录算法训练营第三十五天| 01背包问题 二维 、01背包问题 一维、416. 分割等和子集 。c++转java

背包理论基础 视频地址&#xff1a; 带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili 01背包问题 二维 题目我是在Acwing上面做的&#xff0c;思路可以…

亚马逊云科技宣布新推出Elasticahe for Redis的 Valkey缓存

Amazon ElastiCache 宣布支持 Valkey&#xff0c;与其他支持的引擎相比&#xff0c;无服务器的价格低 33%&#xff0c;基于节点的价格低 20%。使用 ElastiCache Serverless for Valkey&#xff0c;客户可以在一分钟内创建缓存&#xff0c;并且起步价低至每月 6 USD。Valkey 是由…

SpringBoot3.x.x整合Ehcache3 实例(入门踩坑教程)

近期尝试了一下 SpringBoot 3.3.5 JDK17 Ehcache3.10.8整合 注意&#xff0c;这个版本的boot&#xff0c;提出了公用的缓存模板&#xff0c;Spring官网有相关介绍&#xff0c;整合ehcache需要使用jcache。 老版本的3.0版本以下整合&#xff0c;我这里就不参与了&#xff0c;可以…

跨平台WPF框架Avalonia教程 十六

SelectableTextBlock 可选文本块 SelectableTextBlock 块是一个用于显示文本的标签&#xff0c;允许选择和复制文本。它可以显示多行&#xff0c;并且可以完全控制所使用的字体。 有用的属性​ 您可能最常使用这些属性&#xff1a; 属性描述SelectionStart当前选择的起始字…

每日一练:【优先算法】双指针之移动零(easy)

双指针概念介绍 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端开始&#xff0c;然后逐渐…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

【JAVA】使用mybatis plus查询数据库中的geometry字段为null

目录 问题描述&#xff1a; 原码&#xff1a; 实体类&#xff1a; 接口&#xff1a; 解决方法&#xff1a; 1、创建Handle 2、配置handle让mybatis-plus能够识别 相关代码&#xff1a; 问题描述&#xff1a; 在 MyBatis Plus 中&#xff0c;查询的 geometry 字段在数据库…

51c自动驾驶~合集28

我自己的原文哦~ https://blog.51cto.com/whaosoft/12030824 #自动驾驶建图的统一矢量先验地图编码 高德地图&西交 | 先验驾驶 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 写在前面&笔者的个人理解 最近出现了很多先验地图的论文&#xff0c;高德地图…

【全面解读】Apache SeaTunnel常见问题全攻略

使用SeaTunnel需要安装Spark或者Flink这样的引擎么&#xff1f; 不需要&#xff0c;SeaTunnel 支持 Zeta、Spark 和 Flink 作为同步引擎的选择&#xff0c;您可以选择之一就行&#xff0c;社区尤其推荐使用 Zeta 这种专为同步场景打造的新一代超高性能同步引擎。Zeta 被社区用…

Spring Boot3.x自动配置不生效的排查与解决:IDEA 文件夹命名导致的问题

在使用Spring Boot搭建多模块项目时&#xff0c;需要使用到自动配置功能&#xff0c;把一些通用功能封装成模块后通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件注册配置类。然而&#xff0c;最近遇到一个奇怪的问题&#xff1a…

JavaSE(十四)——文件操作和IO

文章目录 文件操作和IO文件相关概念Java操作文件文件系统操作文件内容操作字节流FileOutputStreamFileInputStream代码演示 字符流FileWriterFileReader代码演示 缓冲流转换流 案例练习 文件操作和IO 文件相关概念 文件 通常指的是包含用户数据的文件&#xff0c;如文本文件、…

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…

Vue.js 插槽 Slots 实际应用 最近重构项目的时候遇到的...

前端开发中 插槽 Slots 是一个重要的概念 我们可以查看一下vue.js的官方文档 https://cn.vuejs.org/guide/components/slots 类似于连接通道一样 可以把核心代码逻辑搬到另外的地方 做一个引用 而原先的地方可能并不能这样书写 对于这个概念我在vue的官方文档里面找到了…