[ 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')

(一)选择配色方案
一般情况下,只需要重点关注三种不同的配色方案:
- 顺序配色方案:由一组连续的颜色构成的配色方案(如
binary或viridis) - 互逆配色方案:通常由两种互补的颜色构成,表示正反两种含义(如
RdBu或PuOr) - 定性配色方案:随机顺序的一组颜色(如
rainbow或jet)
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')

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

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

- 如果要用两种颜色表示正反两种含义时,可以使用
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数据科学手册》

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

8619

被折叠的 条评论
为什么被折叠?



