Matplotlib可视化之自定义颜色绘制精美统计图

自定义颜色

在生活中,我们可能对色彩的搭配与审美有自己的偏好,因此,我们可能希望matplotlib遵循自定义的颜色方案,以便所绘制的图形更好地适合文档或网页。

matplotlib中有多种定义颜色的方法,常见的方法包括:

1.三元组(Triplets):颜色可以描述为一个实数三元组,即颜色的红、蓝、绿分量,其中每个分量在[0,1]区间内。因此,(1.0, 0.0, 0.0)表示纯红色,而(1.0, 0.0, 1.0)则表示粉色。

2.四元组(Quadruplets):它们前三个元素与三元组定义相同,第四个元素定义透明度值。此值也在[0,1]区间内。将图形渲染到图片文件中时,使用透明颜色可以使绘制图形与背景进行混合。

3.预定义名称:matplotlib将标准HTML颜色名称解释为实际颜色。例如,字符串red即可表示为红色。同时一些某些颜色的具有简洁的别名,如下表所示:

别名 颜色 显示
b blue
g green
r red
c cyan
m magenta
y yellow
k black
w white

4.HTML颜色字符串:matplotlib可以将HTML颜色字符串解释为实际颜色。这些字符串被定义为#RRGGBB,其中RR、GG和BB是使用十六进制编码的红色、绿色和蓝色分量。

5.灰度字符串:matplotlib将浮点值的字符串表示形式解释为灰度,例如0.75表示中浅灰色。

使用自定义颜色绘制曲线图

通过设置plt.plot()函数的参数color(或等效的简写为c),可以设置曲线的颜色,如下所示:

import numpy as np
import matplotlib.pyplot as plt
def pdf(x, mu, sigma):
    a = 1. / (sigma * np.sqrt(2. * np.pi))
    b = -1. / (2. * sigma ** 2)
    return a * np.exp(b * (x - mu) ** 2)
x = np.linspace(-6, 6, 1000)
for i in range(5):
    samples = np.random.standard_normal(50)
    mu, sigma = np.mean(samples), np.std(samples)
    plt.plot(x, pdf(x, mu, sigma), color = str(.15*(i+1)))
plt.plot(x, pdf(x, 0., 1.), color = 'k')
plt.plot(x, pdf(x, 0.2, 1.), color = '#00ff00')
plt.plot(x, pdf(x, 0.4, 1.), color = (0.9,0.9,0.0))
plt.plot(x, pdf(x, 0.4, 1.), color = (0.9,0.9,0.0,0.8))
plt.show()

使用自定义颜色绘制散点图

可以以同样的方式像控制曲线图一样控制散点图的颜色。有两种可用的形式:

1.为所有点使用相同的颜色 :所有点都将以相同的颜色显示。

2.为每个点定义不同的颜色:为每个点提供不同的颜色。

为所有点使用相同的颜色

利用从二元高斯分布中提取的两组点y_1y_2,每一组中点的颜色相同:

import numpy as np
import matplotlib.pyplot as plt
y_1 = np.random.standard_normal((150, 2))
y_1 += np.array((-1, -1)) # Center the distrib. at <-1, -1>
y_2 = np.random.standard_normal((150, 2))
y_2 += np.array((1, 1)) # Center the distrib. at <1, 1>
plt.scatter(y_1[:,0], y_1[:,1], color = 'c')
plt.scatter(y_2[:,0], y_2[:,1], color = 'b')
plt.show()

为每个点定义不同的颜色

我们总会遇到这样的绘图场景,需要为不同类别的点使用不同的颜色进行绘制,以观察不同类别间的差异情况。以Fisher's iris数据集为例,其数据集中数据类似如下所示:

5.0,3.3,1.4,0.2,Iris-setosa
7.0,3.2,4.7,1.4,Iris-versicolo

数据集的每个点都存储在以逗号分隔的列表中。最后一列给出每个点的标签(标签包含三类:Iris-virginica、Iris-versicolor 和Iris-Vertosa)。在示例中,这些点的颜色将取决于它们的标签,如下所示:

import numpy as np
import matplotlib.pyplot as plt
label_set = (
    b'Iris-setosa',
    b'Iris-versicolor',
    b'Iris-virginica',
)
def read_label(label):
    return label_set.index(label)
data = np.loadtxt('iris.data', delimiter = ',', converters = { 4 : read_label })
color_set = ('c', 'y', 'm')
color_list = [color_set[int(label)] for label in data[:,4]]
plt.scatter(data[:,0], data[:,1], color = color_list)
plt.show()

Tips:

对于三种可能的标签,分别指定一种唯一的颜色。颜色在color_set中定义,标签在label_set中定义。label_set中的第i个标签与color_set中的第i个颜色相关联。然后我们利用它们把标签列表转换成颜色列表color_list。然后只需调用plt.scatter()一次即可显示所有点及其颜色。我们也可以通过对三个不同的类别单独调用plt.scatter()来实现,但这将需要更多的代码。另外需要注意的是:如果两点有可能有相同的坐标,但有不同的标签,显示的颜色将是后绘制点的颜色,可以使用透明颜色,用来显示重叠点。

为散点图中数据点的边使用自定义颜色

与color参数控制点的颜色一样,可以使用edgecolor参数控制数据点的边的颜色。可以为每个点的边设置相同的颜色:

import numpy as np
import matplotlib.pyplot as plt
data = np.random.standard_normal((100, 2))
plt.scatter(data[:,0], data[:,1], color = '1.0', edgecolor='r')
plt.show()

Tips:也可以像在为每个点定义不同的颜色部分中介绍的一样为每个点的边设置不边的颜色

使用自定义颜色绘制条形图

控制绘制条形图使用的颜色与曲线图和散点图的工作原理相同,即通过可选参数color:

import numpy as np
import matplotlib.pyplot as plt
w_pop = np.array([5., 30., 45., 22.])
m_pop = np.array( [5., 25., 50., 20.])
x = np.arange(4)
plt.barh(x, w_pop, color='m')
plt.barh(x, -m_pop, color='c')
plt.show()

Tips:

使用pyplot.bar()和pyplot.barh()函数自定义颜色绘制条形图的工作方式与pyplot.scatter()完全相同,只需设置可选参数color,同时也可以参数edgecolor控制条形边的颜色。

import numpy as np
import matplotlib.pyplot as plt
values = np.random.random_integers(99, size = 50)
color_set = ('c', 'm', 'y', 'b')
color_list = [color_set[(len(color_set) * val) // 100] for val in values]
plt.bar(np.arange(len(values)), values, color = color_list)
plt.show()

使用自定义颜色绘制饼图

自定义饼图颜色的方法类似于条形图:

import numpy as np
import matplotlib.pyplot as plt
color_set = ('c', 'm', 'y', 'b')
values = np.random.rand(6)
plt.pie(values, colors = color_set)
plt.show()

Tips:

饼图接受使用colors参数(注意,此处是colors,而不是在plt.plot()中使用的color)的颜色列表。但是,如果颜色数少于输入值列表中的元素数,那么plt.pie()将循环使用颜色列表中的颜色。在示例中,使用包含四种颜色的列表,为包含六个值的饼图着色,因此,其中有两个颜色将使用两次。

使用自定义颜色绘制箱型图

将箱型图中线条颜色进行修改:

import numpy as np
import matplotlib.pyplot as plt
values = np.random.randn(100)
b = plt.boxplot(values)
for name, line_list in b.items():
    for line in line_list:
        line.set_color('m')
plt.show()

使用色彩映射绘制散点图

如果要在图形中使用多种颜色,逐个定义每种颜色并不是最佳方案,色彩映射可以解决此问题。色彩映射用一个变量对应一个值(颜色)的连续函数定义颜色。matplotlib提供了几种常见的颜色映射;大多数是连续的颜色渐变。
色彩映射在matplotib.cm模块中定义,提供创建和使用色彩映射的函数,它还提供了预定义的色彩映射选择。
函数pyplot.scatter()接受color参数的值列表,当提供cmap参数时,这些值将被解释为色彩映射的索引:

import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
n = 256
angle = np.linspace(0, 8 * 2 * np.pi, n)
radius = np.linspace(.5, 1., n)
x = radius * np.cos(angle)
y = radius * np.sin(angle)
plt.scatter(x, y, c = angle, cmap = cm.hsv)
plt.show()

Tips:在matplotlib.cm模块中提供了大量预定义的色彩映射,其中cm.hsv包含全光谱的颜色。

使用色彩映射绘制条形图

plt.scatter()函数内置了对色彩映射的支持,其他一些绘图函数也内置支持色彩映射。但是,有些函数(如pyplot.bar())并未内置对色彩映射的支持。但是matplotlib可以从颜色映射显式生成颜色:

import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import matplotlib.colors as col
values = np.random.random_integers(99, size = 50)
cmap = cm.ScalarMappable(col.Normalize(0, 99), cm.binary)
plt.bar(np.arange(len(values)), values, color = cmap.to_rgba(values))
plt.show()

Tips:首先创建色彩映射cmap,以便将[0, 99]范围内的值映射到matplotlib.cm.binary的颜色。然后,函数cmap.to_rgba将值列表转换为颜色列表。因此,尽管plt.bar并未内置色彩映射支持,但依旧可以使用并不复杂的代码实现色彩映射。

创建自定义配色方案

matplotlib使用的默认颜色考虑的主要对象是打印文档或出版物。因此,默认情况下,背景为白色,而标签、轴和其他注释则显示为黑色,在某些不同的使用环境中,我们可能需要使用的配色方案;例如,将图形背景设置为黑色,注释设置为白色。
在matplotlib中,各种对象(如轴、图形和标签)都可以单独修改。但逐个更改这些对象的颜色配置并非最佳方案。在matplotlib中,所有对象都可以利用集中式配置修改其默认颜色:

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
mpl.rc('lines', linewidth = 2.)
mpl.rc('axes', facecolor = 'k', edgecolor = 'w')
mpl.rc('xtick', color = 'w')
mpl.rc('ytick', color = 'w')
mpl.rc('text', color = 'w')
mpl.rc('figure', facecolor = 'k', edgecolor ='w')
mpl.rc('axes', prop_cycle = mpl.cycler(color=[(0.1, .5, .75),(0.5, .5, .75)]))
x = np.linspace(0, 7, 1024)
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.show()

到此这篇关于Matplotlib可视化之自定义颜色绘制精美统计图的文章就介绍到这了,更多相关Matplotlib绘制统计图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python matplotlib实用绘图技巧汇总

    前言 在日常的业务数据分析 ,可视化是非常重要的步骤.这里总结了matplotlib常用绘图技巧,希望可以帮助大家更加更加高效的.美观的显示图表.作者:北山啦 Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案. 它也可以和图形工具包一起使用,如 PyQt 和wxPython. pip3 install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple impo

  • 教你学会通过python的matplotlib库绘图

    一.前言 python的matplotlib库很强大可以绘制各种类型的图像. 首先要装一些基础的库,如numpy,matplotlib或是pandas. 二.基础命令 首先介绍绘图时常用的基础命令: 1.plt.plot(x,y)即为绘图命令. ①基础画图: plt.plot(x, y) ②设置颜色: color属性 如果没有特别要求的话可以不手动设置颜色,如果要在一张图上画不同的线时,会自动分配颜色.也可以使用ax.plot效果相同. plt.plot(x, y, color = 'red')

  • python读取并显示图片的三种方法(opencv、matplotlib、PIL库)

    前言 在进行图像处理时,经常会用到读取图片并显示出来这样的操作,所以本文总结了python中读取并显示图片的3种方式,分别基于opencv.matplotlib.PIL库实现,并给出了示例代码,介绍如下. OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口

  • PyQt5实现将Matplotlib图像嵌入到Scoll Area中显示滚动条效果

    前言 如题目所述,又是花费了两天的时间实现了该功能,本来今天下午有些心灰意冷,打算放弃嵌入到Scoll Area中的想法,但最后还是心里一紧,仔细梳理了一下逻辑,最终实现了功能 效果展示 注意:当你想实现一个子功能的时候,可以从新创建两个文件: ×××.ui文件(如上图效果展示是和我项目里的位置一样的)×××.py文件(用来实现功能) 截图 如上图所示,红色框里的文件是实现效果展示的所有源文件.但是文件夹testcode是为了实现将Matplotlib图像嵌入到Scoll Area中所做的所有工

  • python 绘图模块matplotlib的使用简介

    上周对线上某几个磁盘进行了fio硬盘性能测试,测试完成之后的结果需要绘制成图像展示出来.我在官网上查找了一下fio自带的命令fio_generate_plot和fio2gnuplot工具的用法,找到了图像的绘制方法,在某一个单一的场景下,确实可以使用这两个工具来进行硬盘性能图像绘制,但是问题是,如果要对比多个场景下绘制出来的图像的差异,fio自带的绘图工具实现起来就有些困难了,但是确实也能实现.例如下图: 如图所示为磁盘iodepth不变,numjobs在(1,8,16)三种不同的场景下绘制出来

  • 用Python的绘图库(matplotlib)绘制小波能量谱

    时间小波能量谱 反映信号的小波能量沿时间轴的分布. 由于小波变换具有等距效应,所以有: 式中 表示信号强度,对于式①在平移因子b方向上进行加权积分 式中 代表时间-小能量谱 尺度小波能量谱 反映信号的小波能量随尺度的变化情况. 同理,对式①在尺度方向上进行加权积分: 式中 连续小波变换 连续小波变换的结果是一个小波系数矩阵,随着尺度因子和位移因子变化.然后将系数平方后得到小波能量,把每个尺度因子对应的所有小波能量进行叠加,那么就可以得到随尺度因子变换的小波能量谱曲线.把尺度换算成频率后,这条曲线

  • 完美解决matplotlib子图坐标轴重叠问题

    绘制matplotlib多个图形于一张图时往往会出现相邻图坐标轴重叠的现象 此时只须在汇完所有子图后加上以下代码即可 plt.tight_layout() 补充:解决matplotlib横坐标日期过长导致的重叠.无法完全显示问题(换行) 该方法较为繁杂,主要是将年月日和时间分开,通过使用plt.text根据坐标位置将年月日重新加上,前面是为了进行时间转化, 有用的代码为 > plt.text(zb[link],-1.2,year,ha='center')#需要根据自己的位置调整Y的坐标即调整-1

  • 解决使用Spyder IDE时matplotlib绘图的显示问题

    Spyder 环境下 matplotlib 的 backend 设置是在打开环境时就配置好了的 所以通常的方法: import matplotlib matplotlib.use('Qt5Agg') 是无效的. Spyder 下解决这个问题最简单的方法是 GUI 的方法: Tools -> Preferences -> IPython console -> Graphics -> Backend: Qt5 应用,然后可能需要重启一下,就可以了.如无特殊需要,以后无需更改. 补充:P

  • matplotlib.subplot()画子图并共享y坐标轴的方法

    有时候想要把几张图放在一起plot,比较好对比,subplot和subplots都可以实现,具体对比可以查看参考博文.这里用matplotlib库的subplot来举个栗子. 数据长什么样 有两个数据段,第一个数据是DataFrame类型,第二个是ndarray类型.每个数据都有3列,我想画1*3的折线子图,第一个数据的第n列和第二个数据的第n列画在一张子图上.先来看一下两个数据长什么样儿(为显示方便,只看前5行). In [1]: testing_set.head() # DataFrame类

  • Python基础之画图神器matplotlib

    Python画图(线条颜色.大小.线形) 先放基础代码,下面讲述效果: import matplotlib.pyplot as plt import numpy as np list1=[1,2,6,4,5,6,2,4,4,5,7] list2=[2,3,5,8,12,1,3,4,6,2,4] plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.title('显示中文标题') plt.xlabel("横坐标") plt.

随机推荐