Matplotlib图形的输出与保存

简介: Matplotlib可以将任何图形渲染为各种常见的文件格式,如PNG、EPS、SVG和PDF。在本文中,将探讨Matplotlib的文件输出功能,还将学习如何控制输出的分辨率和大小以及透明度等。

前言

Matplotlib 可以将任何图形渲染为各种常见的文件格式,如 PNG、EPS、SVG 和 PDF。默认情况下,图形显示时带有简约的用户界面,可以通过保存按钮将图形保存到文件中。但是,如果需要生成大量的图形,这种方法并不方便,因此我们需要使用函数自动化保存生成的图形文件。在本文中,我们将探讨 Matplotlib 的文件输出功能。除了以编程方式生成文件输出外,我们还将学习如何控制输出的分辨率和大小以及透明度等。

生成PNG图片文件

实际使用场景下,我们可能希望获取程序运行过程中数据的情况,同时并不想打断程序的执行,而希望为每个运行步骤自动生成保存一张图片。Matplotlib 可以灵活的将图形直接保存到图片文件中。

首先,我们将学习如何将图形输出到 PNG 文件。PNG 文件是位图输出的理想选择,它依赖于无损压缩算法,并可以处理透明度。

importnumpyasnpfrommatplotlibimportpyplotaspltx=np.linspace(-6, 6, 1024)
y=np.sinc(x)
plt.plot(x, y)
plt.savefig('sinc.png', c='c')

绘图91.png

Tips:要保存图片,只需使用 plt.savefig() 调用替换 plt.show() 调用,此时将不会弹出查看图形窗口。函数 plt.savefig() 的工作原理与 plt.show() 完全相同——解释 plt 命令并生成图形,区别在于处理结束时所做的操作。show() 函数将图片数据发送到用户界面库以进行展示,而 savefig() 函数将图片数据写入文件。

同时 savefig() 函数提供了多种可选参数,让我们继续前进,开始探索吧。

控制透明度

当图形是网站或演示文稿的一部分时,图形之间可能需要叠加显示,透明度对于这样的整合是很重要的,图形必须以一种美学上令人愉悦和一致的方式与背景融为一体。

为了演示透明性,将创建一个图形并将其嵌入到网页中,与网页背景融为一体。

使用透明背景将图形渲染为PNG文件

为了将图形渲染为透明背景的 PNG 文件,需要使用 plt.savefig(),并将可选参数 transparent 设置为 True:

importnumpyasnpfrommatplotlibimportpyplotaspltx=np.linspace(-6, 6, 1024)
y=np.sinc(x)
plt.plot(x, y)
plt.savefig('sinc_1.png', c='c', transparent=True)

20210605102132156.png

制作包含图形的HTML页面

在包含背景的网页上使用上一步骤中保存的 PNG 文件(网页背景图片 background.jpg 请替换为目录中存在的文件):

<html><head><style>body {
background: whiteurl(background.jpg);
            }
</style></head><body><imgsrc='sinc_1.png'width='800 height='600'></img></body></html>

绘图93.png

默认情况下,plt.savefig() 不会在输出中包含透明度信息。例如,当我们输出 PNG 图片时,PNG 文件默认每像素 24bit,每个 8bit 的通道仅存储像素的红色、绿色和蓝色分量。但是,当启用透明输出时,plt.savefig() 保存的文件每像素 32bit,附加的 alpha 通道存储透明度信息。

作为对比,如果我们使用不包含 alpha 通道的 sinc.png:

<html><head><style>body {
background: whiteurl(background.jpg);
            }
</style></head><body><imgsrc='sinc.png'width='800 height='600'></img></body></html>

绘图94.png

通过系列文章的学习,我们知道可以通过在绘图函数中(如 plt.plot、plt.scatter、pltpie 等)使用可选参数 alpha 控制 Matplotlib 生成的不同透明度级别的图形。如果 alpha 等于 1,则图形将完全不透明,这是默认设置;如果 alpha 等于 0,图形将完全不可见。

importnumpyasnpimportmatplotlib.pyplotaspltname_list= ('Omar', 'Serguey', 'Max', 'Zhou', 'Abidin')
value_list=np.random.randint(99, size=len(name_list))
pos_list=np.arange(len(name_list))
plt.bar(pos_list, value_list, alpha=.75, color='c', align='center')
plt.xticks(pos_list, name_list)
plt.savefig('bar.png', transparent=True)

在HTML页面中进行显示:

<html><head><style>body {
background: whiteurl(background.jpg);
            }
</style></head><body><imgsrc='bar.png'width='800 height='600'></img></body></html>

绘图95.png

控制输出分辨率

默认情况下,使用位图图片的输出时,Matplotlib 自动调节输出的大小和分辨率。根据位图图片的用途,我们也可以自己选择分辨率。例如,如果图片是一张大海报的一部分,可能需要高分辨率,如果想生成缩略图,那么需要较低分辨率。

plt.savefig() 函数提供可选参数 dpi 控制输出分辨率:

importnumpyasnpimportmatplotlib.pyplotaspltname_list= ('Omar', 'Serguey', 'Max', 'Zhou', 'Abidin')
value_list=np.random.randint(99, size=len(name_list))
pos_list=np.arange(len(name_list))
plt.bar(pos_list, value_list, alpha=.25, color='c', align='center')
plt.xticks(pos_list, name_list)
plt.savefig('bar_1.png', dpi=300)

绘图97.png

Tips:savefig() 函数的可选参数 dpi 控制以 DPI (每英寸点数)表示的图片分辨率。默认情况下,Matplotlib 将输出 8 x 6 空间单位的图形,即 4/3 的纵横比。在 matplotlib 中,1 个空间单位等于 100 像素。因此,默认情况下,Matplotlib 提供 800 x 600 像素的图片文件。如果我们使用 dpi=300,图片大小为 8*300 x 6*300,即 2400 x 1800 像素。

我们已经学习了如何控制图形的纵横比,如果将纵横比和 DPI 结合起来,就可以完全控制图片的总体比例。例如,在 512 x 512 像素的图片中显示六边形。

importnumpyasnpimportmatplotlib.pyplotasplttheta=np.linspace(0, 2*np.pi, 8)
points=np.vstack((np.cos(theta), np.sin(theta))).transpose()
plt.figure(figsize=(4., 4.))
plt.gca().add_patch(plt.Polygon(points, color='c'))
plt.grid(True)
plt.axis('scaled')
plt.savefig('polygon.png', dpi=128)

绘图96.png

上例中在 4 x 4 单位面积上显示图形,并以 128 dpi 的分辨率输出,输出将为 512 x 512 像素。我们还可以在 8 x 8 单位面积显示 512 像素,但是要将分辨率变为 64 dpi:

importnumpyasnpimportmatplotlib.pyplotasplttheta=np.linspace(0, 2*np.pi, 8)
points=np.vstack((np.cos(theta), np.sin(theta))).transpose()
plt.figure(figsize=(8., 8.))
plt.gca().add_patch(plt.Polygon(points, color='c'))
plt.grid(True)
plt.axis('scaled')
plt.savefig('polygon_1.png', dpi=64)

绘图92.png

Tips:图中注释更小,网格线更细,这是由于注释和线条的粗细都有自己的默认值,它们以空间单位表示。因此,将输出分辨率除以 2 将使注释变小两倍。

生成PDF或SVG文档

位图图片将图片表示为一个给定比例的像素数组。放大后,将看到一些众所周知的瑕疵(锯齿、像素块、模糊等)。而矢量图像具有尺度不变性,无论以何种比例观察它们,都不会导致细节丢失。因此有时,我们需要矢量图片,Matplotlib 可以输出 PDF、SVG 等矢量图片。

importnumpyasnpfrommatplotlibimportpyplotaspltx=np.linspace(-10, 10, 1024)
y=np.sinc(x)
plt.plot(x, y)
plt.savefig('sinc.pdf')

Tips:调用 plt.savefig() 时,其中通过传递文件名来指定文件是 PNG、PDF 还是 SVG,Matplotlib 将通过文件名的扩展名来推断文件类型。

在某些情况下,我们可能不希望显式的声明文件的扩展名,我们可以通过 plt.savefig 的可选参数 format 来达到目标,例如通过设置 format='svg',plt.savefig 则不会从传递给函数的文件名推断输出文件类型,而是通过传递给格式的名称。

相关文章
|
7月前
|
存储 编解码 数据可视化
【Matplotlib】figure方法之图形的保存
【Matplotlib】figure方法之图形的保存
301 1
|
7月前
|
数据可视化 Python
GEE Colab——如何利用Matplotlib在colab中进行图形制作
GEE Colab——如何利用Matplotlib在colab中进行图形制作
134 3
|
5月前
|
数据可视化 Linux 数据格式
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
|
5月前
|
Python
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
|
5月前
|
数据采集 数据可视化 数据处理
我们来看一个简单的`matplotlib`代码示例,它使用`plot()`和`scatter()`函数来绘制二维图形。
我们来看一个简单的`matplotlib`代码示例,它使用`plot()`和`scatter()`函数来绘制二维图形。
|
7月前
|
存储 数据可视化 算法
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
|
7月前
|
缓存 Linux API
如何使用Matplotlib绘制出美观实用的图形?
如何使用Matplotlib绘制出美观实用的图形?
|
7月前
|
编解码 数据可视化 索引
【Matplotlib】Figure图形中的图表元素怎么获取,你掌握了吗!?
【Matplotlib】Figure图形中的图表元素怎么获取,你掌握了吗!?
79 1
|
7月前
|
Python
Matplotlib figure图形对象
Matplotlib figure图形对象
77 1
|
数据可视化 前端开发 UED
matplotlib图形整合之多个子图一起绘制
matplotlib图形整合之多个子图一起绘制
717 0
matplotlib图形整合之多个子图一起绘制