数据可视化库 matplotlib 入门 8——绘制文本与数学表达式、图形处理

在前面关于 matploblib 的文章中,笔者分别介绍了:

前面介绍了 Matplotlib 将数据绘制成各种常用图形进行展示的方法,但是实际情况中还可能使用更多其他的图(比如3D图等等),笔者接触较少,这里不一一展开介绍了。关于 Matplotlib 库最全面的介绍可以参考 Matplotlib 官方网站(https://matplotlib.org/3.6.2/index.html#),这里有全面的用户文档、教程示例、API 详解等等,笔者使用的是3.6.2版本,其他版本亦可浏览。

本篇为 Matplotlib 最后一篇,介绍 Matplotlib 绘制文本、数学表达式以及处理图像的方法。

绘制文本与数学表达式

绘制文本的函数与功能

Matplotlib 内置有字体管理器,它是一个实现了跨平台的字体集合,支持广泛的文本格式,比如: TTF(TrueType Font页面语言)、Unicode 字符等。 用户可以对文本属性进行控制,比如:字体大小、粗细、位置和颜色等。通过下表中的方法可以绘制出相应的内容:

函数功能
text / figtext在绘图区域 / 画布的任意位置添加文本。
title / suptitle为绘图区域 / 画布添加标题。
xlabel / ylabel在绘图区域的 x / y 轴上添加标签。
annotate在绘图区域的任意位置添加带有可选箭头的注释。
  • plt.text(x, y, s, **kwargs) 或者 axes.text(...)
    x / y:在图形坐标系中,文本的横 / 纵坐标;
    s:文本字符串;
    其他:给出了字体属性,比如:
    fontsize:设置字体大小,默认12,可取 'xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’,‘x-large’, ‘xx-large’;
    fontweight:设置字体粗细,可取 ‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’;
    fontstyle:设置字体类型,可取 ‘normal’,‘italic’,‘oblique’ ;
    verticalalignment:水平对齐方式 ,可取 ‘center’ , ‘top’ , ‘bottom’ , ‘baseline’;
    horizontalalignment:垂直对齐方式,可取 ‘left’, ‘right’, ‘center’;
    rotation:(旋转角度)可选参数为:‘vertical’,‘horizontal’, 也可以为数字;
    alpha:透明度,参数值0至1之间;
    backgroundcolor:背景颜色;
    bbox:增加外框 ,常用参数有:boxstyle 方框外形、facecolor(fc) 背景颜色、edgecolor(ec) 边框线条颜色、edgewidth 边框线条大小。

  • plt.title(label, fontdict, loc, pad, *, y, **kwargs) 或者 ax.set_title(...)
    label:绘图区标题字符串;
    fontdict:字典,给出字体属性,参考上述 text 的参数;
    loc:指定标题位置。

  • plt.suptitle(t, **kwargs) 或者 fig.suptitle(...)
    t 为标题字符串;其他参数给出字体属性,参考上述 text 的参数。

  • plt.xlabel(xlabel, fontdict, labelpad, *, loc, **kwargs) 或者 ax.set_xlabel(...)
    xlabel:x 轴标签字符串;
    fontdict:字典,给出字体属性,参考上述 text 的参数;
    loc:指定轴标签位置。

  • plt.annotate(text, xy, xytext, xycoords='data', textcoords, arrowprops, annotation_clip, **kwargs) 或者 axes.annotate(...)
    text:注释文本;
    xy:被注释的数据点的坐标;
    xytext:注释文本内容坐标;
    arrowprops:字典,设置注释箭头的属性;
    其他参数给出注释文本的字体属性,参考上述 text 的参数。

绘制数学表达式

Matplotlib 支持在文本中使用 LATEX,因此,需要书写数学表达式时,可将其中的特殊格式字符串使用 Text Markup(一种文本标记语言)表达出来。具体的使用方法是:

  • 将特殊符号文本放在一对美元符号内,即使用 ‘$’ 作为界定符( ‘$…$’ )。
  • 通常使用 raw 字符串,即 r’$…$’ 的格式,因为原生字符串不会转义 ‘\’,从而使得大量的 LATEX 词法能够正确解析。
  • 如果要绘制下标和上标,需要使用 ‘_’ 和 ‘^’ 符号。

上述文本与数学表达式绘制示例如下:

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置字体
plt.rcParams["axes.unicode_minus"] = False    # 正常显示负号

fig = plt.figure('Text example1', figsize=(7, 6))
fig.suptitle(t='Matplotlib画布标题', horizontalalignment='center',
             verticalalignment='top', fontsize=20)  # 画布标题,水平居中、置顶,字体大小20。
# 这里也可以使用 x、y 比例值指定位置:
# fig.suptitle(t='Matplotlib 绘制文本示例', x=0.2, y=0.97, fontsize=20)  

ax = fig.add_subplot()
ax.set_title('axes绘图区标题', loc='left', fontsize=16, fontweight='bold')
ax.set_xlabel('这是 x 轴标签', rotation=10, backgroundcolor='y', color='b', alpha=0.5)
ax.set_ylabel('这是 y 轴标签')  # 使用默认的字体和位置

ax.text(3, 8, '文本示例1', style='italic', bbox={'facecolor': 'm'}, fontsize='xx-large')
ax.text(7, 7, '文本示例2', fontdict={'bbox':{'facecolor': 'c'}, 'fontsize':10})
ax.text(4, 0, '文本示例3', horizontalalignment='left', verticalalignment='bottom', color='g')  # 指定文本对齐方式
ax.text(2, 6, r'数学方程: $E = mc^2$', fontsize=15)
ax.text(6, 1, r'比大小:$\alpha_i> \sqrt{2}\beta_i$', fontsize=15)
ax.text(4, 3, r'函数:$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize = 20)

ax.plot([2], [1], 'o')
ax.annotate('注释:该点坐标为(2,1)', xy=(2, 1), xytext=(3, 4),
            arrowprops={'facecolor': 'blue', 'shrink': 0.04},
            fontsize=20, color='r', rotation=15, backgroundcolor='y', alpha=0.7)

ax.axis([0, 10, 0, 9])
plt.show()

绘制结果如下图:
绘制文本与数学表达式

图像处理

Matplotlib 软件包中的 image 模块提供了保存、加载、缩放、显示图像的功能,但该模块支持的图片格式有限,通常情况下可以采用 Python 图像处理库 Pillow 来处理图像。

  • plt.imread(fname, format=None)
    fname 是图像的文件名,返回一个 numpy 数组。

  • plt.imshow(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, filternorm=True, filterrad=4.0, resample, url, data, **kwargs)
    X:包含了图片的数据。其形状可以为:(n,m)(灰度图),类型为float;(n,m,3)(RGB图),类型为float或unit8;(n,m,4)(RGBA图),类型为float或unit8。
    cmap:Colormap 实例。默认由rc的image.cmap指定。若X是RGB/RGBA,则忽略。
    aspect:一个字符串,指定图片的缩放。可以为:‘auto’ 、‘equal’ 。
    interpolation:一个字符串,指定插值方式。
    norm:Normalize实例,用于将图片亮度正则化到 0~1。默认采用normalize.norm
    vmin/vmax:辅助norm进行正则化。如果传入了一个norm实例,则忽略。
    alpha:浮点数,指定透明度。
    origin:可以为’upper’/‘lower’。图片的第一个像素X[0,0]放置在坐标原点。‘upper’:横坐标向右,纵坐标向下;‘lower’:横坐标向右,纵坐标向上。
    extent:元组(left, right, bottom, top),等价于同时使用了set_xlim(left,right)+set_ylim(bottom,top)
    filternorm/filterrad:用于过滤。
    其他参数用于调整 Artist属性,返回一个AxesImage对象。

  • plt.imsave(fname, arr, **kwargs)
    该函数保存图像。
    fname:图像的文件名;
    arr:图像数组数据。

  • fig.savefig(fname, *, transparent, **kwargs)
    该函数保存画布。
    fname:带路径的文件名。
    dpi:保存的分辨率。
    facecolor/edgecolor:figure rectangle的背景色和边线颜色。
    orientation:可以为 ‘landscape’ / ‘portrait’。
    format:图片格式,可以为’png’/‘pdf’/‘svg’/‘eps’…。
    transparent:如果为True,设置figure和axes背景透明(除非设置了facecolor/edgecolor)。

示例如下:

import numpy as np
import matplotlib.pyplot as plt

img = plt.imread('logo.png')  # 返回一个numpy数组
print(img.shape)              # (128, 554, 3)

fig = plt.figure(figsize=(7,5))

ax1 = fig.add_subplot(221)
ax1.imshow(img)
ax1.set_title('default')

ax2 = fig.add_subplot(222)
ax2.imshow(img[:100, :300, :], aspect='equal')
ax2.set_title('partial')

ax3 = fig.add_subplot(223)
ax3.imshow(img, origin='lower')
ax3.set_title("origin='lower'")

ax4 = fig.add_subplot(224)
ax4.imshow(img, origin='upper', alpha=0.5)
ax4.set_title("origin='upper', alpha=0.5")

plt.imsave("E:/logo2.png", img[:100, :300, :], origin = 'lower')  # 保存图片,部分保存,上下翻转

fig.savefig('E:/fig.png', dpi=200, facecolor='gray', transparent=False)  # 保存绘制图像,背景灰色
fig.savefig('E:/fig2.png', dpi=200, transparent=True)  # 保存绘制图像,背景透明

plt.show()

图像处理如下图:
在这里插入图片描述
在这里插入图片描述

以上。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值