Matplotlib风格与样式

Posted 盼小辉丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matplotlib风格与样式相关的知识,希望对你有一定的参考价值。

Matplotlib风格与样式

1. Matplotlib 风格

为了满足不同的应用需求,Matplotlib 中包含了 28 种不同的风格,在进行绘图时,可以根据需要选择不同的绘图风格。使用以下代码可以获取 Matplotlib 中所有可用的风格:

import matplotlib as mpl
from matplotlib import pyplot as plt
# 查看 Matplotlib 可用绘图风格
print(plt.style.available)

打印出的可用风格如下:

['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

使用 plt.style.use("style") 可以修改默认的绘图风格,其中 styleMatplolib 中可用的风格:

import matplotlib as mpl
from matplotlib import pyplot as plt
import numpy as np
# 设置默认绘图风格为 seaborn-darkgrid
plt.style.use("seaborn-darkgrid")  
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
plt.plot(x, y)
plt.show()

可以看到,与在《Matplotlib图形绘制》中绘制的相同图形相比,其风格具有较大差别。除此之外,Maplotlib 中还有一些非常有意思的风格,例如手绘风格:

import matplotlib as mpl
from matplotlib import pyplot as plt
import numpy as np
# 启用手绘风格
plt.xkcd()
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
plt.plot(x, y)
plt.show()

可以看到,使用手绘风格的方法十分简单,只需要在绘图前,调用 plt.xkcd() 函数即可:

import matplotlib as mpl
from matplotlib import pyplot as plt
import numpy as np
# 启用手绘风格
plt.xkcd()
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]]
x = np.arange(4)
plt.bar(x + 0.00, data[0], color = 'b', width = 0.25)
plt.bar(x + 0.25, data[1], color = 'g', width = 0.25)
plt.bar(x + 0.50, data[2], color = 'r', width = 0.25)
plt.show()

除了 Matplotlib 自带的预设风格外,我们也可以通过自定义颜色和样式来构建满足需求的自定义风格。

2. 使用自定义颜色

2.1 自定义颜色

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 即可表示为红色。同时一些某些颜色的具有简洁的别名,如下表所示:

    别名颜色显示
    bblue
    ggreen
    rred
    ccyan
    mmagenta
    yyellow
    kblack
    wwhite
  4. HTML 颜色字符串:Matplotlib 可以将 HTML 颜色字符串解释为实际颜色。这些字符串被定义为 #RRGGBB,其中 RRGGBB 分别是使用十六进制编码的红色、绿色和蓝色分量。

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

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

通过设置 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()

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

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

  1. 为所有点使用相同的颜色 :所有点都将以相同的颜色显示。
  2. 为每个点定义不同的颜色:为每个点提供不同的颜色。

2.3.1 为所有点使用相同的颜色

利用从二元高斯分布中提取的两组点 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()

2.3.2 为每个点定义不同的颜色

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

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

数据集的每个点都存储在以逗号分隔的列表中。最后一列给出每个点的标签(标签包含三类:Iris-virginicaIris-versicolorIris-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()

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

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

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()

除了为每个点的边设置相同的颜色外,也可以像在为每个点定义不同的颜色部分中介绍的一样为每个点的边设置不边的颜色。

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

控制绘制条形图使用的颜色与曲线图和散点图的工作原理相同,即通过可选参数 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()

同样,使用 plt.bar()plt.barh() 函数自定义颜色绘制条形图的工作方式与 plt.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()

2.6 使用自定义颜色绘制饼图

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

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()

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

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

使用以下代码,修改箱型图中线条颜色:

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()

2.8 使用色彩映射绘制散点图

如果要在图形中使用多种颜色,逐个定义每种颜色并不是最佳方案,色彩映射可以解决此问题。色彩映射用一个变量对应一个值(颜色)的连续函数定义颜色。Matplotlib 提供了几种常见的颜色映射;大多数是连续的颜色渐变。色彩映射在 matplotib.cm 模块中定义,提供创建和使用色彩映射的函数,它还提供了预定义的色彩映射选择。
函数 plt.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()


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

2.9 使用色彩映射绘制条形图

plt.scatter() 函数内置了对色彩映射的支持,其他一些绘图函数也内置支持色彩映射。但是,有些函数(如 plt.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()


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

2.10 创建自定义配色方案

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()

3. 使用自定义样式

3.1 控制线条样式和线宽

在实践中,除了颜色,大多数情况下我们还要对图形的线条样式等进行控制,以为线条样式添加多样性。

3.1.1 线条样式

import numpy as np
import matplotlib.pyplot as plt
def gaussian(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, 1024)
plt.plot(x, gaussian(x, 0., 1.), color = 'y', linestyle = 'solid')
plt.plot(x, gaussian(x, 0., .5), color = 'c', linestyle = 'dashed')
plt.plot(x, gaussian(x, 0., .25), color = 'm', linestyle = 'dashdot')
plt.show()


使用 plt.plot()linestyle 参数来控制曲线的样式,其他可用线条样式包括:soliddasheddotteddashdot。同样,线条样式设置不仅限于 plt.plot(),任何由线条构成的图形都可以使用此参数,也可以说 linestyle 参数可用于所有涉及线条渲染的命令。例如,可以修改条形图的线条样式:

import numpy as np
import matplotlib.pyplot as plt
n = 10
a = np.random.random(n)
b = np.random.random(n)
x = np.arange(n)
plt.bar(x, a, color='c')
plt.bar(x, a+b, bottom=a, color='w', edgecolor='black', linestyle = 'dashed')
plt.show()

由于在条形图、饼图等图形中,默认的边线的颜色为白色,因此若要在白色背景上显示这些边线,需要通过 edgecolor 参数改变边线的默认颜色。

3.1.2 线宽

使用 linewidth 参数可以修改线条的粗细。默认情况下,linewidth 设置为1个单位。利用线条的粗细可以在视觉上强调某条特定的曲线。

import numpy as np
import matplotlib.pyplot 以上是关于Matplotlib风格与样式的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib绘制散点图与条形图

如何分享 matplotlib 风格?

简单的Python项目——可视化数据入门(关键词:matplotlib,pyolot,pygal)

条形图 Matplotlib:日期间隔(xaxis)问题与 twinx

matplotlib学习之散点图与条形图

python使用matplotlib可视化查看matplotlib中常用的线条形式(line style)和数据点标记形状(marker)