Matplotlib颜色条的配置_Python数据分析与可视化

Matplotlib颜色条配置

基本颜色

Matplotlib提供了8种指定颜色的方法:

  • 在0,1中的浮点值的RGB或RGBA元组(例如 (0.1, 0.2, 0.5) 或(0.1, 0.2, 0.5, 0.3))。RGBA是红色,绿色,蓝色,Alpha的缩写;

  • 十六进制RGB或RGBA字符串(例如: #0F0F0F 或者 #0F0F0F0F);

  • 0, 1中浮点值的字符串表示,包括灰度级(例如,0.5);

  • 单字母字符串,例如这些其中之一:{b, g,r, c,m, y, k, w};

  • 一个 X11/CSS4(html)颜色名称,例如:blue;

  • 来自xkcd的颜色调研的名称,前缀为 xkcd:(例如:xkcd:sky blue);

  • 一个 Cn 颜色规范,即C 后跟一个数字,这是默认属性循环的索引(matplotlib.rcParamsaxes.prop_cycle); 索引在艺术家对象创建时发生,如果循环不包括颜色,则默认为黑色;

  • 其中一个 {tab:blue,tab:orange,tab:green,tab:red, tab:purple,tab:brown,tab:pink,tab:gray,tab:olive, tab:cyan},它们是tab10分类调色板中的Tableau颜色(这是默认的颜色循环)。

代码示例:

python 复制代码
t = np.linspace(0.0, 2.0, 201)
s = np.sin(2 * np.pi * t)
fig, ax = plt.subplots(facecolor=(.18, .31, .31))#RGB 元组
ax.set_facecolor('#eafff5')#hex字符串
ax.set_title('Voltage vs. time chart', color='0.7')#灰度字符串
ax.plot(t, s, 'xkcd:crimson')
ax.plot(t, .7*s, color='C4', linestyle='--')#CN颜色选择
ax.tick_params(labelcolor='tab:orange')

效果图

颜色条

颜色的设置应该是在matploblib使用最频繁的配置之一了。matplotlib通过cmap参数为图形设置颜色条的配色方案:

python 复制代码
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
plt.imshow(I, cmap='gray')#采用灰度配色的图形

效果图

matplotlib所有可用的配色方案都在plt.cm命名空间中。在jupyter里通过Tab键 就可以查看所有的配置方案:plt.cm<TAB>

选择配色方案

有了这么多能够选择的配色方案只是第一步,重要的是如何确定用那种方案。一般情况下我们只需要关注三种不同的配色方案:

  • 顺序配色方案,由一组连续的颜色构成的配色方案(例如binary或viridis);

  • 互逆配色方案,通常由两种互补的颜色构成,表示正反两种含义(例如RdBu或PuOr);

  • 定性配色方案,随机顺序的一组颜色(例如rainbow或jet)。

jet是一种定性配色方案,定性配色方案在对定性数据进行可视化时的选择空间非常有限。随着图形亮度的提高,经常会出现颜色无法区分的问题。接下来将演示几个常用的配色方案。

这里通过把jet转换为黑白的灰度图看看:

python 复制代码
from matplotlib.colors import LinearSegmentedColormap
import matplotlib.pyplot as plt
import numpy as np
def grayscale_cmap(cmap):
    """为配色方案显示灰度图"""
    cmap = plt.cm.get_cmap(cmap)
    colors = cmap(np.arange(cmap.N))
    # 将RGBA色转换为不同亮度的灰度值
    # 参考链接http://alienryderflex.com/hsp.html
    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')
plt.show()

效果图

从上图我们观察灰度图里比较亮的那部分条纹。这些亮度变化不均匀的条纹在彩色图中对应某一段彩色区间,由于色彩太接近容易突显出数据集中不重要的部分,导致眼睛无法识别重点。更好的配色方案是viridis,它采用了精心设计的亮度渐变方式,这样不仅便于视觉观察,而且更清晰:

view_colormap('viridis')

还可以使用cubehelix实现彩虹效果,cubehelix配色方案可以可视化连续的数值:

view_colormap('cubehelix')

还有一种可以用两种颜色表示正反两种含义的方案,实现函数为RdBu:

view_colormap('RdBu')

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

Matplotlib提供了丰富的颜色条配置功能。由于可以将颜色条本身仅看作是一个plt.Axes实例,因此前面所学的所有关于坐标轴和刻度值的格式配置技巧都可以派上用场。颜色条有一些有趣的特性。

例如,我们可以缩短颜色取值的上下限,对于超出上下限的数据,通过extend参数用三角箭头表示比上限大的数或者比下限小的数。下面展示一张噪点图:

python 复制代码
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
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()函数,将适当的配色方案的名称以及需要的区间数量传进去即可:

python 复制代码
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
plt.imshow(I, cmap=plt.cm.get_cmap('Blues', 6))
plt.colorbar()
plt.clim(-1, 1);

效果图

相关推荐
学术 学术 Fun1 小时前
研究方向有哪些团队获得过资助?用 NIH RePORTER 梳理项目与研究者
数据分析·科研
张张123y2 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
happylifetree7 小时前
Python67:核心语法-函数进阶-参数类型(函数作为参数)
python
小羊没烦恼!7 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
找方案7 小时前
从用户画像到智能定价:81页方案拆解“大数据决策与支撑平台”怎么落地
大数据·人工智能·数据分析·智慧城市·用户画像
quantdash_cc8 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
镜子AI8 小时前
镜子AI工程实践:用 Python 做 GEO 实体一致性审计,并自动生成 JSON-LD 结构化数据
人工智能·python·json
郝学胜-神的一滴11 小时前
AI 编程智能体 09:零门槛调用教程
人工智能·数据分析·自动化·numpy·pandas·量化投资
SelectDB12 小时前
高并发 BI 看板怎么撑住:隔离与加速配置速查
大数据·数据库·数据分析
2601_9628857212 小时前
如何用 Python 计算 VaR 和 CVaR(在险价值)?
开发语言·python