返回介绍

01. Python 工具

02. Python 基础

03. Numpy

04. Scipy

05. Python 进阶

06. Matplotlib

07. 使用其他语言进行扩展

08. 面向对象编程

09. Theano 基础

10. 有趣的第三方模块

11. 有用的工具

12. Pandas

处理文本(基础)

发布于 2022-09-03 20:46:14 字数 15143 浏览 0 评论 0 收藏 0

In [1]:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

matplotlib 对文本的支持十分完善,包括数学公式,Unicode 文字,栅格和向量化输出,文字换行,文字旋转等一系列操作。

基础文本函数

matplotlib.pyplot 中,基础的文本函数如下:

  • text()Axes 对象的任意位置添加文本
  • xlabel() 添加 x 轴标题
  • ylabel() 添加 y 轴标题
  • title()Axes 对象添加标题
  • figtext()Figure 对象的任意位置添加文本
  • suptitle()Figure 对象添加标题
  • anotate()Axes 对象添加注释(可选择是否添加箭头标记)

In [2]:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
%matplotlib inline

# plt.figure() 返回一个 Figure() 对象
fig = plt.figure(figsize=(12, 9))

# 设置这个 Figure 对象的标题
# 事实上,如果我们直接调用 plt.suptitle() 函数,它会自动找到当前的 Figure 对象
fig.suptitle('bold figure suptitle', fontsize=14, fontweight='bold')

# Axes 对象表示 Figure 对象中的子图
# 这里只有一幅图像,所以使用 add_subplot(111)
ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)

# 可以直接使用 set_xxx 的方法来设置标题
ax.set_title('axes title')
# 也可以直接调用 title(),因为会自动定位到当前的 Axes 对象
# plt.title('axes title')

ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')

# 添加文本,斜体加文本框
ax.text(3, 8, 'boxed italics text in data coords', style='italic',
        bbox={'facecolor':'red', 'alpha':0.5, 'pad':10})

# 数学公式,用 $$ 输入 Tex 公式
ax.text(2, 6, r'an equation: $E=mc^2$', fontsize=15)

# Unicode 支持
ax.text(3, 2, unicode('unicode: Institut f\374r Festk\366rperphysik', 'latin-1'))

# 颜色,对齐方式
ax.text(0.95, 0.01, 'colored text in axes coords',
        verticalalignment='bottom', horizontalalignment='right',
        transform=ax.transAxes,
        color='green', fontsize=15)

# 注释文本和箭头
ax.plot([2], [1], 'o')
ax.annotate('annotate', xy=(2, 1), xytext=(3, 4),
            arrowprops=dict(facecolor='black', shrink=0.05))

# 设置显示范围
ax.axis([0, 10, 0, 10])

plt.show()

https://www.wenjiangs.com/wp-content/uploads/2022/docimg20/wfmdNxzYQrtZnVuK-2aj13s.png alt="">

文本属性和布局

我们可以通过下列关键词,在文本函数中设置文本的属性:

关键词
alphafloat
backgroundcolorany matplotlib color
bboxrectangle prop dict plus key 'pad' which is a pad in points
clip_boxa matplotlib.transform.Bbox instance
clip_on[True , False]
clip_patha Path instance and a Transform instance, a Patch
colorany matplotlib color
family[ 'serif' , 'sans-serif' , 'cursive' , 'fantasy' , 'monospace' ]
fontpropertiesa matplotlib.font_manager.FontProperties instance
horizontalalignment or ha[ 'center' , 'right' , 'left' ]
labelany string
linespacingfloat
multialignment['left' , 'right' , 'center' ]
name or fontnamestring e.g., ['Sans' , 'Courier' , 'Helvetica' ...]
picker[None,float,boolean,callable]
position(x,y)
rotation[ angle in degrees 'vertical' , 'horizontal'
size or fontsize[ size in points , relative size, e.g., 'smaller', 'x-large' ]
style or fontstyle[ 'normal' , 'italic' , 'oblique']
textstring or anything printable with '%s' conversion
transforma matplotlib.transform transformation instance
variant[ 'normal' , 'small-caps' ]
verticalalignment or va[ 'center' , 'top' , 'bottom' , 'baseline' ]
visible[True , False]
weight or fontweight[ 'normal' , 'bold' , 'heavy' , 'light' , 'ultrabold' , 'ultralight']
xfloat
yfloat
zorderany number

其中 va, ha, multialignment 可以用来控制布局。

  • horizontalalignment or ha :x 位置参数表示的位置
  • verticalalignment or va:y 位置参数表示的位置
  • multialignment:多行位置控制

In [3]:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

# build a rectangle in axes coords
left, width = .25, .5
bottom, height = .25, .5
right = left + width
top = bottom + height

fig = plt.figure(figsize=(10,7))
ax = fig.add_axes([0,0,1,1])

# axes coordinates are 0,0 is bottom left and 1,1 is upper right
p = patches.Rectangle(
    (left, bottom), width, height,
    fill=False, transform=ax.transAxes, clip_on=False
    )

ax.add_patch(p)

ax.text(left, bottom, 'left top',
        horizontalalignment='left',
        verticalalignment='top',
        transform=ax.transAxes,
        size='xx-large')

ax.text(left, bottom, 'left bottom',
        horizontalalignment='left',
        verticalalignment='bottom',
        transform=ax.transAxes,
        size='xx-large')

ax.text(right, top, 'right bottom',
        horizontalalignment='right',
        verticalalignment='bottom',
        transform=ax.transAxes,
        size='xx-large')

ax.text(right, top, 'right top',
        horizontalalignment='right',
        verticalalignment='top',
        transform=ax.transAxes,
        size='xx-large')

ax.text(right, bottom, 'center top',
        horizontalalignment='center',
        verticalalignment='top',
        transform=ax.transAxes,
        size='xx-large')

ax.text(left, 0.5*(bottom+top), 'right center',
        horizontalalignment='right',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes,
        size='xx-large')

ax.text(left, 0.5*(bottom+top), 'left center',
        horizontalalignment='left',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes,
        size='xx-large')

ax.text(0.5*(left+right), 0.5*(bottom+top), 'middle',
        horizontalalignment='center',
        verticalalignment='center',
        fontsize=20, color='red',
        transform=ax.transAxes)

ax.text(right, 0.5*(bottom+top), 'centered',
        horizontalalignment='center',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes,
        size='xx-large')

ax.text(left, top, 'rotated\nwith newlines',
        horizontalalignment='center',
        verticalalignment='center',
        rotation=45,
        transform=ax.transAxes,
        size='xx-large')

ax.set_axis_off()
plt.show()

https://www.wenjiangs.com/wp-content/uploads/2022/docimg20/1VTRXG2N30KskneC-8781DP.png alt="">

注释文本

text() 函数在 Axes 对象的指定位置添加文本,而 annotate() 则是对某一点添加注释文本,需要考虑两个位置:一是注释点的坐标 xy ,二是注释文本的位置坐标 xytext

In [4]:

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=2)

ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05),
            )

ax.set_ylim(-2,2)
plt.show()

https://www.wenjiangs.com/wp-content/uploads/2022/docimg20/cxhKy3tirmbhg10h-UHToCe.png alt="">

在上面的例子中,两个左边使用的都是原始数据的坐标系,不过我们还可以通过 xycoordstextcoords 来设置坐标系(默认是 'data'):

参数坐标系
‘figure points’points from the lower left corner of the figure
‘figure pixels’pixels from the lower left corner of the figure
‘figure fraction’0,0 is lower left of figure and 1,1 is upper right
‘axes points’points from lower left corner of axes
‘axes pixels’pixels from lower left corner of axes
‘axes fraction’0,0 is lower left of axes and 1,1 is upper right
‘data’use the axes data coordinate system

使用一个不同的坐标系:

In [5]:

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=2)

ax.annotate('local max', xy=(3, 1),  xycoords='data',
            xytext=(0.8, 0.95), textcoords='axes fraction',
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='right', verticalalignment='top',
            )

ax.set_ylim(-2,2)
plt.show()

https://www.wenjiangs.com/wp-content/uploads/2022/docimg20/fE0Qe3Mfbo0rRhxn-r5SPCK.png alt="">

极坐标系注释文本

产生极坐标系需要在 subplot 的参数中设置 polar=True

In [6]:

fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
r = np.arange(0,1,0.001)
theta = 2*2*np.pi*r
line, = ax.plot(theta, r, color='#ee8d18', lw=3)

ind = 800
thisr, thistheta = r[ind], theta[ind]
ax.plot([thistheta], [thisr], 'o')
ax.annotate('a polar annotation',
            xy=(thistheta, thisr),  # theta, radius
            xytext=(0.05, 0.05),    # fraction, fraction
            textcoords='figure fraction',
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='left',
            verticalalignment='bottom',
            )
plt.show()

https://www.wenjiangs.com/wp-content/uploads/2022/docimg20/FslhwEkpfixKCMni-gBUrmm.png alt="">

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文