返回介绍

技巧

发布于 2024-05-19 17:52:49 字数 9327 浏览 0 评论 0 收藏 0

1. 共享坐标轴

当你通过 pyplot.subplot()pyplot.axes() 函数或者 Figure.add_subplot()Figure.add_axes() 方法创建一个 Axes 时,你可以通过 sharex 关键字参数传入另一个 Axes 表示共享 X 轴;或者通过 sharey 关键字参数传入另一个 Axes 表示共享 Y 轴。

共享轴线时,当你缩放某个 Axes 时,另一个 Axes 也跟着缩放。

共享坐标轴

2. 创建多个 subplot

如果你想创建网格中的许多 subplot ,旧式风格的代码非常繁琐:

#旧式风格
fig=plt.figure()
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222,sharex=ax1,sharey=ax1)
ax3=fig.add_subplot(223,sharex=ax1,sharey=ax1)
ax4=fig.add_subplot(224,sharex=ax1,sharey=ax1)

新式风格的代码直接利用 pyplot.subplots() 函数一次性创建:

#新式风格的代码
fig,((ax1,ax2),(ax3,ax4))=plt.subplots(2,2,sharex=True,sharey=True)
ax1.plot(...)
ax2.plot(...)
...

它创建了 Figure 和对应所有网格 SubPlot 。你也可以不去解包而直接:

#新式风格的代码
fig,axs=plt.subplots(2,2,sharex=True,sharey=True)
ax1=axs[0,0]
ax2=axs[0,1]
ax3=axs[1,0]
ax4=axs[1,1]
...
...

返回的 axs 是一个 nrows*ncolsarray ,支持 numpy 的索引。

3. 调整日期显示

x 轴为时间日期时,有可能间隔太密集导致显示都叠加在一起。此时可以用 matplotlib.figure.Figure.autofmt_xdate() 函数来自动调整 X 轴日期的显式。

你也可以调整 X 轴的显示格式。当 X 轴为时间时,其显示由 Axes.fmt_xdata 属性来提供。该属性是一个函数对象或者函数,接受一个日期参数,返回该日期的显示字符串。 matplotlib 已经提供了许多 date formatter ,你可以直接使用 ax.fmt_xdata=matplotlib.dates.DateFormatter('%Y-%m-%d')

日期显示

4. fill_between()

Axes.fill_between(x,y1,y2=0,where=None,interpolate=False,step=None,**kwargs) 方法在 y1y2 之间进行填充。

  • x :一个长度为 N 的 array ,X 轴数据
  • y1 :一个长度为 N 的 array ,Y 轴数据 1
  • y2 :一个长度为 N 的 array ,Y 轴数据 2,填充就是在曲线 [x,y1][x,y2] 包围的区域内进行
  • where :可选的。
    • 如果为 None ,则表示任何地方都填充。
    • 如果不是 None ,那么就是一个长度为 N 的 boolean array ,填充只会在 whereTrue 的地方进行
  • interpolate :一个 bool 值。如果为 True ,则计算曲线 [x,y1][x,y2] 相交点并插入交点;如果为 FalseNone 则不计算两条曲线的交点。
  • setp :可选

通常建议提供一个 alpha 参数,用于设定填充的透明度。如果同一个区域被多个 fill_between() 填充,那么设定 alpha 之后会让每一层都能显示出来。

例如:

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1234)
Nsteps = 500
t = np.arange(Nsteps)
mu = 0.002
sigma = 0.01
# the steps and position
S = mu + sigma*np.random.randn(Nsteps)
X = S.cumsum()
# the 1 sigma upper and lower analytic population bounds
lower_bound = mu*t - sigma*np.sqrt(t)
upper_bound = mu*t + sigma*np.sqrt(t)
fig, ax = plt.subplots(1)
ax.plot(t, X, lw=2, label='walker position', color='blue')
ax.plot(t, mu*t, lw=1, label='population mean', color='black', ls='--')
ax.fill_between(t, lower_bound, upper_bound, facecolor='yellow', alpha=0.5,
label='1 sigma range')
ax.legend(loc='upper left')
# here we use the where argument to only fill the region where the
# walker is above the population 1 sigma boundary
ax.fill_between(t, upper_bound, X, where=X>upper_bound, facecolor='blue', alpha=0.5)
ax.set_xlabel('num steps')
ax.set_ylabel('position')
ax.grid()  #开启网格

fill_between()

5. 设置透明 legend

通常如果你能确定,比如右上角,没有数据,那么你能够非常安全的将 legend 放置在右上角从而不会遮盖你的图表,如 ax.legend(loc='upper right') 。如果你不知道你的数据曲线的样子,那么你可以使用 ax.legend(loc='best')matplotlib 自动选择将 legend 放置在何处。

更有效的方法是设置 legend 为透明。方法为: ax.legend(loc='best',fancybox=True,framealpha=0.5) 。 其中 fancybox 设置 legend 边框为圆角矩形, framealpha 设置 legend 的透明度。

fill_between()

6. 放置 text box

当你在 Axes 中放置 text box 时,你最好将它放置在 axes coordinates 下,这样当你调整 X 轴或者 Y 轴时,它能够自动调整位置。

你也可以使用 Text.bbox 属性来让这个 Text 始终放在某个 Patch 中。其中 .bbox 是个字典,它存放的是该 Patch 实例的属性。

fill_between()

7. LATEX 文字

要想在文本中使用 LATEX ,你需要使用 '$...$' 这种字符串(即使用 '$' 作为界定符)。通常建议使用 raw 字符串,即 r'$...$' 的格式,因为原生字符串不会转义 '\' ,从而使得大量的 LATEX 词法能够正确解析。

8. 平移坐标轴:

Axes.spines 是个字典,它存放了四个键,分别为: Axes.spines['left],Axes.spines['right],Axes.spines['top],Axes.spines['bottom] 他们都是一个 matplotlib.spines.Spine 对象,该对象继承自 matplotlib.patches.Patch 对象,主要是设置图形边界的边框。

  • Spine.set_color('none') :不显示这条边线

  • Spine.set_position((position))) :将边线移动到指定坐标,其中 position 是一个二元元组,指定了 (position type,amount)position type 可以是:

    • outward :在绘图区域之外放置边线,离开绘图区域的距离由 amount 指定(负值则在会去区域内绘制)
    • axes :在 Axes coordinate 内放置边线(从 0.0 到 1.0 )
    • data :在 data coordinate 内放置边线

    你也可以指定 position 为 : 'center' ,等价于 ('axes',0.5) ;或者 'zero' ,等价于 ('data',0.0)

9. 设置轴线 tick

Axes.xaxis 返回一个 matplotlib.axis.XAxis 对象, Axes.yaxis 返回一个 matplotlib.axis.YAxis 对象,他们都是 matplotlib.axis.Axis 的子类对象,代表轴线。

  • Axis.set_ticks_position :设置 tick 位置,可以为: 'top' | 'bottom' | 'both' | 'default' | 'none' ,如果为 'None' 则不显示 tick
  • Axis.set_label_position :设置 label 位置,可以为: 'top'| 'bottom'

10、matplotlib.colors

matplotlib.colors 是一个模块,用于转换数字或者颜色参数到 RGB 或者 RGBA

  • RGB :一个浮点数序列,有 3 个浮点数。每个数都是 0-1 之间
  • RGBA :一个浮点数序列,有 4 个浮点数。每个数都是 0-1 之间

它里面有个常用的功能就是生成一个 colormap ,它用于将一个数字序列转换成一个颜色序列。通常有下列两个步骤:

  • 将数字归一化到 0-1 之间(通过 Normalize 类对象或者其子类对象)
  • 将 0-1 之间的数字映射到一个颜色 (通过 Colormap 类对象或者其子类对象)

matplotlib.colors.ColorConverter 提供了一个单例对象用于转换数字或者数字序列到 color

a. ListedColormap

matplotlib.colors.ListedColormap(colors, name=’from_list’, N=None) 基类是 matplotlib.colors.Colormap 。它用于从一个 list of colors 中创建 colormap

11. 绘制 color map

  • matplotlib.pyplot.pcolor(*args, **kwargs) :用于绘制颜色图,返回一个 matplotlib.collections.Collection 对象。常用的调用方法为:

     pcolor(C)
     pcolor(C,**kwargs)
    
  • matplotlib.pyplot.pcolormesh(*args, **kwargs) :用于绘制一个四边形网格。它类似于 pcolor() ,但是机制不同,且返回的是 QuadMesh 对象。它绘图更快。常用的调用方法为:

     pcolormesh(C)
     pcolormesh(X,Y,C)
     pcolormesh(C,**kwargs)
    

其中参数为:

  • C :为一个 masked array 。它会被转换成一个 ColorMap ,然后对相应的网格图上颜色
  • XY 是网格参数,通常他们是从 numpy.meshgrid(x_array,y_array)) 获取。其中 x_array 是一维数组,代表划分 X 轴网格的横坐标; y_array 是一维数组,代表划分 Y 轴网格的纵坐标

X,Y,C 形状相同。其中 X 和 Y 对应于网格的划分,C 对应于颜色的分配(相同 C[i][j]值的网格,颜色相同)

pcolormesh_pcolor

pcolormesh_pcolor

12. 清除绘图

你可以通过 pyplot 来清除绘图:

  • pyplot.cla() :清除 current axis 。非当前 axis 不受影响
  • pyplot.clf() :清除 current figure 。但是它不关闭 window
  • pyplot.close() :关闭 window

你也可以通过面向对象的方法:

  • Figure.clf() :清除该 Figure 对象的所有内容。

13. 清除 X 坐标和 Y 坐标:

Axes.set_xticks(())
Axes.set_yticks(())

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

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

发布评论

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