【matplotlib】可视化解决方案——如何正确使用matplotlib颜色系统

概述

matplotlib 库是当前最为流行的数据可视化库,它支持相当多的颜色系统,

支持的颜色

RGB 或者 RBGA

可以传递三个到四个浮点数来指定 RGB 颜色或者 RGBA 颜色,例如 (0.1, 0.2, 0.5) 或者 (0.2, 0.5, 0.3, 0.2)

十六进制字符串

RGB 颜色或者 RGBA 颜色还可以使用基于十六进制的字符串,例如 #0f0f0f 或者 #0f0f0f80

包含灰度级的浮点值的字符串

例如 0.5

一些基本颜色的单字符速记符号

用一些颜色的首字母作为颜色的速记符,例如:

  • 'b' 如蓝色
  • 'g' 作为绿色
  • 'r' 作为红色
  • 'c' 作为青色
  • 'm' 洋红色
  • 'y' 作为黄色
  • 'k' 作为黑色
  • 'w' 作为白色
  • matplotlib 2.0 版本之后,默认颜色不再是之前的 [‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’,…],所以使用 ‘b’ 反而是奇怪的颜色,并不能调出默认颜色 #1f77b4。详情见链接颜色变化
  • 为了与当前配色一致,可以使用 colors = ['C0', 'C1', 'C2', ...]

2.0 版本之后的颜色变化

在这里插入图片描述

X11/CSS4 颜色

不区分大小写的 X11/CSS4 颜色名称。例如 aquamarinemediumseagreen;具体颜色详情见 wiki

xkcd 颜色

自 xkcd 的不区分大小写的颜色名称,带有 'xkcd:' 前缀,例如 'xkcd:sky blue'

在这里插入图片描述

CN 颜色规范

使用 c0~cn 来指定颜色,它是默认属性循环的索引的颜色。

tab 分类调色盘的颜色

tab10分类调色板中的 Tableau 颜色,例如 'tab:blue'

Matplotlib 中 RGB 透明度计算公式:​ R G B n e w = R G B b e l o w ∗ ( 1 − α ) + R G B a r t i s t ∗ α RGB_{new} = RGB_{below} * (1 - \alpha) + RGB_{artist} * \alpha RGBnew=RGBbelow(1α)+RGBartistα

示例

X11/CSS4 与 xkcd 颜色对比

完整代码如下:


import matplotlib.colors as mcolors
import matplotlib.patches as mpatch
import matplotlib.pyplot as plt

overlap = {name for name in mcolors.CSS4_COLORS
           if f'xkcd:{name}' in mcolors.XKCD_COLORS}

fig = plt.figure(figsize=[9, 5])
ax = fig.add_axes([0, 0, 1, 1])

n_groups = 3
n_rows = len(overlap) // n_groups + 1

for j, color_name in enumerate(sorted(overlap)):
    css4 = mcolors.CSS4_COLORS[color_name]
    xkcd = mcolors.XKCD_COLORS[f'xkcd:{color_name}'].upper()

    # Pick text colour based on perceived luminance.
    rgba = mcolors.to_rgba_array([css4, xkcd])
    luma = 0.299 * rgba[:, 0] + 0.587 * rgba[:, 1] + 0.114 * rgba[:, 2]
    css4_text_color = 'k' if luma[0] > 0.5 else 'w'
    xkcd_text_color = 'k' if luma[1] > 0.5 else 'w'

    col_shift = (j // n_rows) * 3
    y_pos = j % n_rows
    text_args = dict(fontsize=10, weight='bold' if css4 == xkcd else None)
    ax.add_patch(mpatch.Rectangle((0 + col_shift, y_pos), 1, 1, color=css4))
    ax.add_patch(mpatch.Rectangle((1 + col_shift, y_pos), 1, 1, color=xkcd))
    ax.text(0.5 + col_shift, y_pos + .7, css4,
            color=css4_text_color, ha='center', **text_args)
    ax.text(1.5 + col_shift, y_pos + .7, xkcd,
            color=xkcd_text_color, ha='center', **text_args)
    ax.text(2 + col_shift, y_pos + .7, f'  {color_name}', **text_args)

for g in range(n_groups):
    ax.hlines(range(n_rows), 3*g, 3*g + 2.8, color='0.7', linewidth=1)
    ax.text(0.5 + 3*g, -0.3, 'X11/CSS4', ha='center')
    ax.text(1.5 + 3*g, -0.3, 'xkcd', ha='center')

ax.set_xlim(0, 3 * n_groups)
ax.set_ylim(n_rows, -1)
ax.axis('off')

plt.show()

画图结果如下:

在这里插入图片描述

CN 颜色选择

Matplotlib 在绘制时将 CN 颜色转换为 RGBA。完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

th = np.linspace(0, 2*np.pi, 128)


def demo(sty):
    mpl.style.use(sty)
    fig, ax = plt.subplots(figsize=(3, 3))

    ax.set_title('style: {!r}'.format(sty), color='C0')

    ax.plot(th, np.cos(th), 'C1', label='C1')
    ax.plot(th, np.sin(th), 'C2', label='C2')
    ax.legend()


demo('default')

画图结果如下:

在这里插入图片描述

综合示例

import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0.0, 2.0, 201)
s = np.sin(2 * np.pi * t)

# 1) RGB tuple:
fig, ax = plt.subplots(facecolor=(.18, .31, .31))
# 2) hex string:
ax.set_facecolor('#eafff5')
# 3) gray level string:
ax.set_title('Voltage vs. time chart', color='0.7')
# 4) single letter color string
ax.set_xlabel('Time [s]', color='c')
# 5) a named color:
ax.set_ylabel('Voltage [mV]', color='peachpuff')
# 6) a named xkcd color:
ax.plot(t, s, 'xkcd:crimson')
# 7) Cn notation:
ax.plot(t, .7*s, color='C4', linestyle='--')
# 8) tab notation:
ax.tick_params(labelcolor='tab:orange')


plt.show()

画图结果如下:

在这里插入图片描述

往期回顾

  1. 【matplotlib】可视化解决方案——如何实现画布局部放大功能
  2. 【matplotlib】可视化解决方案——如何更改matplotlib配置信息
  3. 【matplotlib】可视化解决方案——如何定制化网格
  4. 【matplotlib】可视化解决方案——如何向画布添加交叉直线
  5. 【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题
  6. 【matplotlib】可视化解决方案——如何设置matplotlib风格集
  7. 【matplotlib】可视化解决方案——如何设置轴标签的透明度和大小
  8. 【matplotlib】可视化解决方案——如何向图表中添加数据表
  9. 【matplotlib】可视化解决方案——如何更改绘图区域背景颜色
  10. 【matplotlib】可视化解决方案——如何使用数学公式

文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猪猪家的大猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值