技巧
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*ncols
的 array
,支持 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)
方法在 y1
和 y2
之间进行填充。
x
:一个长度为 N 的array
,X 轴数据y1
:一个长度为 N 的array
,Y 轴数据 1y2
:一个长度为 N 的array
,Y 轴数据 2,填充就是在曲线[x,y1]
和[x,y2]
包围的区域内进行where
:可选的。- 如果为
None
,则表示任何地方都填充。 - 如果不是
None
,那么就是一个长度为 N 的boolean array
,填充只会在where
为True
的地方进行
- 如果为
interpolate
:一个bool
值。如果为True
,则计算曲线[x,y1]
和[x,y2]
相交点并插入交点;如果为False
或None
则不计算两条曲线的交点。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() #开启网格
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
的透明度。
6. 放置 text box
当你在 Axes
中放置 text box
时,你最好将它放置在 axes coordinates
下,这样当你调整 X 轴或者 Y 轴时,它能够自动调整位置。
你也可以使用 Text
的 .bbox
属性来让这个 Text
始终放在某个 Patch
中。其中 .bbox
是个字典,它存放的是该 Patch
实例的属性。
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
,然后对相应的网格图上颜色X
和Y
是网格参数,通常他们是从numpy.meshgrid(x_array,y_array))
获取。其中x_array
是一维数组,代表划分 X 轴网格的横坐标;y_array
是一维数组,代表划分 Y 轴网格的纵坐标
X,Y,C 形状相同。其中 X 和 Y 对应于网格的划分,C 对应于颜色的分配(相同 C[i][j]值的网格,颜色相同)
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论