[Python3] Matplotlib —— (八) 配置颜色条

本文介绍了Matplotlib中颜色条的配置,包括选择配色方案,如顺序、互逆和定性方案,以及如何设置颜色条刻度的限制和扩展功能。还探讨了离散型颜色条的创建,并提供了相关示例。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本


[ Matplotlib version: 3.2.1 ]


九、配置颜色条

图例通过离散的标签标示离散的图形元素,然而,对于图形中由彩色的点、线、面构成的连续标签,用颜色条来表示的效果比较好。

在Matplotlib中,颜色条是一条独立的坐标轴,可以指明图形中颜色的含义。

通过colorbar()函数可以创建最简单的颜色条

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib inline

# 简易颜色条图例
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])

plt.imshow(I)
plt.colorbar()

在这里插入图片描述

可以通过cmap参数为图形设置颜色条的配色方案

  • plt.cm.<Tab>查看所有可用配色方案
plt.imshow(I, cmap='gray')

在这里插入图片描述

(一)选择配色方案

一般情况下,只需要重点关注三种不同的配色方案:

  • 顺序配色方案:由一组连续的颜色构成的配色方案(如binaryviridis
  • 互逆配色方案:通常由两种互补的颜色构成,表示正反两种含义(如RdBuPuOr
  • 定性配色方案:随机顺序的一组颜色(如rainbowjet
  1. jet配色方案与非等差的渐变亮度
    jet是一种定性配色方案,曾是Matplotlib 2.0之前所有版本的默认配色方案
    – 缺点:定性配色方案在对定性数据进行可视化时的选择空间非常有限。随着图形亮度的提高,经常会出现颜色无法区分的问题
    – 灰度图里比较亮的部分条纹:这些亮度变化不均匀的条纹在彩色图中对应某一段彩色区间,由于色彩太接近容易凸显出数据集中不重要的部分,导致眼睛无法识别重点
from matplotlib.colors import LinearSegmentedColormap


def grayscale_cmap(cmap):
    """为配色方案显示灰度图"""
    cmap = plt.cm.get_cmap(cmap)
    colors = cmap(np.arange(cmap.N))

    # 将RGBA色转换为不同亮度的灰度值
    RGB_weight = [0.299, 0.587, 0.114]
    luminance = np.sqrt(np.dot(colors[:, :3] ** 2, RGB_weight))
    colors[:, :3] = luminance[:, np.newaxis]

    return LinearSegmentedColormap.from_list(cmap.name + '_gray', colors, cmap.N)


def view_colormap(cmap):
    """用等价的灰度图表示配色方案"""
    cmap = plt.cm.get_cmap(cmap)
    colors = cmap(np.arange(cmap.N))

    cmap = grayscale_cmap(cmap)
    grayscale = cmap(np.arange(cmap.N))

    fig, ax = plt.subplots(2, figsize=(6, 2),
                           subplot_kw=dict(xticks=[], yticks=[]))
    ax[0].imshow([colors], extent=[0, 10, 0, 1])
    ax[1].imshow([grayscale], extent=[0, 10, 0, 1])


view_colormap('jet')

在这里插入图片描述

  1. 更好的配色方案viridis(Matplotlib 2.0默认配色方案)
    – 采用的亮度渐变方式,不仅便于视觉观察,而且转换成灰度图后也更清晰
# viridis配色方案和渐变亮度scale
view_colormap('viridis')

在这里插入图片描述

  1. 彩虹效果的配色方案cubehelix
# cubehelix配色方案和渐变亮度
view_colormap('cubehelix')

在这里插入图片描述

  1. 如果要用两种颜色表示正反两种含义时,可以使用RdBu双色配色方案(红色-蓝色,Red-Blue简称)
    – 缺点:用红色、蓝色表示的正反两种信息在灰度图上看不出差别
# RdBu配色方案和渐变亮度
view_colormap('RdBu')

在这里插入图片描述

(二)颜色条刻度的限制与扩展功能的设置

设置颜色条扩展属性

  • 可以将颜色条本身仅看作是一个plt.Axes实例,因此所有关于坐标轴和刻度值的格式配置技巧均可用
  • 颜色条有一些有趣的特性:如,可以缩短颜色取值上下限,对于超出上下限的数据通过extend参数用三角箭头表示比上限大的数或比下限小的数
# 为图形像素设置1%噪点
speckles = (np.random.random(I.shape) < 0.01)
I[speckles] = np.random.normal(0, 3, np.count_nonzero(speckles))

plt.figure(figsize=(10, 3.5))

plt.subplot(1, 2, 1)
plt.imshow(I, cmap='RdBu')
plt.colorbar()

plt.subplot(1, 2, 2)
plt.imshow(I, cmap='RdBu')
plt.colorbar(extend='both')
plt.clim(-1, 1)

在这里插入图片描述

  • 左图是用默认的颜色条刻度限制实现的效果,噪点的范围完全覆盖了我们感兴趣的数据
  • 而右图设置了颜色条的刻度上下限,并在上下限之外增加了扩展功能,这样的数据可视化图形更有效果

(三)离散型颜色条

虽然颜色条默认都是连续的,但有时也需要表示离散数据。

使用plt.cm.get_cmap()函数,将适当的配色方案的名称以及需要的区间数量传进去即可

plt.imshow(I, cmap=plt.cm.get_cmap('Blues', 6))
plt.colorbar()
plt.clim(-1, 1)

在这里插入图片描述


Matplotlib 相关阅读:

[Python3] Matplotlib —— (一) 入门基础
[Python3] Matplotlib —— (二) 简易线形图
[Python3] Matplotlib —— (三) 简易散点图
[Python3] Matplotlib —— (四) 可视化异常处理
[Python3] Matplotlib —— (五) 密度图与等高线图
[Python3] Matplotlib —— (六) 频次直方图、数据区间划分和分布密度
[Python3] Matplotlib —— (七) 配置图例


总结自《Python数据科学手册》

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值