自定义Matplotlib:https://matplotlib.org/tutorials/introductory/customizing.html#sphx-glr-tutorials-introductory-customizing-py
图像教程:https://matplotlib.org/tutorials/introductory/images.html#sphx-glr-tutorials-introductory-images-py
画廊:https://matplotlib.org/gallery.html
使用指南
matplotlib拥有广泛的代码库,大多数都可以通过一个相当简单的概念框架和一些重要知识来理解
绘图需要在一系列级别上进行操作。绘图包的目的是帮助尽可能轻松的可视化数据,并提供所有必要的控制。
因此matplotlib中所有内容都是按层次结构进行组织。顶部是matplotlib状态机环境。简单函数用于将绘图元素添加到当前图形的当前轴
层次结构下的是面向对象接口的第一级,其中pyplot仅用于少数功能,例如图形创建,并且用户显示创建并跟踪图形和轴对象。在此级别,用户使用pyplot来创建图形,并且通过这些图形,可以创建一个或多个轴对象。
对于GUI应用程序中嵌入matplotlib图标非常重要,所以一般都使用pyplot级别
import matplotlib.pyplot as plt import numpy as np
Figure
记录了所有子Axes,就是一些标签说明信息。一个数字可以有任意数量的Axes,但有用的应该至少有一个
fig = plt.figure() # an empty figure with no axes fig.suptitle('No axes on this figure') # Add a title so we know which it is fig, ax_lst = plt.subplots(2, 2) # a figure with a 2x2 grid of Axes
Axes
具有数据空间的图像区域。给定的图形可以包含许多轴,但给定的Axes对象只能在一个轴中Figure。轴包含两个Axis对象,负责数据限制。每个都有一个title(),一个x-label(),一个y-label()
Axis
负责设置图形限制并生成刻度线。刻度的位置有Locator对象确定,并且ticklabel字符串有a格式化Formatter。正确的组合Locator,并Formatter给出了刻度位置和标签非常精细的控制
绘制函数的输入类型
所有绘图功能都期望np.array或np.ma.masked_array作为输入。类似数组的类,例如pandas数据对象,np.martix可能会或可能不会按预期工作。最好np.array在绘图之前将这些转换为对象
a = pandas.DataFrame(np.random.rand(4,5), columns = list('abcde')) a_asndarray = a.values
Matplotlib, pyplot和pylab关系
Matplotlib是整个包,pyplot是一个模块并且pylab是一个安装在一起的模块。
pyplot为底层面向对象的绘图库提供状态机接口。状态机隐式地自动创建图形和轴以实现所需的图形
x = np.linspace(0, 2, 100) plt.plot(x, x, label='linear') plt.plot(x, x**2, label='quadratic') plt.plot(x, x**3, label='cubic') plt.xlabel('x label') plt.ylabel('y label') plt.title("Simple Plot") plt.legend() plt.show()
第一次调用plt.plot将自动创建必要的图形和轴以实现所需的图形。随后调用plt.plot重新使用当前轴并添加另一行。设置标题,图例和轴标签还会自动使用当前轴并设置标题,创建图例并分别标记轴
Pyplot简介
matplotlib.pyplot是一组命令样式函数,使matplotlib像MATLAB一样工作。每个pyplot函数都会对图形进行一些更改。
在matplotlib.pyplot函数调用中保留各种状态,以便跟踪当前图形和绘图区域等内容,并将绘图功能定向到当前轴。
import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4]) plt.ylabel('some numbers') plt.show()
如果plot()命令提供单个列表或数组,matplotlib假定它是一系列y值,并自动为您生成x值。由于python范围以0开头,因此默认的x向量与y具有相同的长度,但从0开始。因此x数据为[0,1,2,3]
plot可以采取任意数量的论点,来设置x和y的关系。
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
比如上面的图点就是1,1 - 2,4 - 3,9 - 4,16
格式化绘图样式
对于每对x,y的参数,都有一个可选的第三个参数,是格式字符串,用于指示绘图的颜色和线型。格式字符串的字母和符号来自MATLAB,将颜色字符串与线型字符串连接起来。默认格式字符串为蓝色实线。
如果要用红色圆圈绘制,可以如下修改
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro') plt.axis([0, 6, 0, 20]) plt.show()
axis:指定轴的大小值(xmin,xmax,ymin,ymax)
所有序列都在内部转换为numpy数组。比如下面使用数组绘制不同格式样式的行
import numpy as np t = np.arange(0., 5., 0.2) plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^') plt.show()
关键字字符绘图
某些情况下,可以使用numpy.recarray或pandas.DataFrame进行绘图操作
Matplotlib允许您使用data关键字参数提供此类对象。
data = {'a': np.arange(50), 'c': np.random.randint(0, 50, 50), 'd': np.random.randn(50)} data['b'] = data['a'] + 10 * np.random.randn(50) data['d'] = np.abs(data['d']) * 100 plt.scatter('a', 'b', c='c', s='d', data=data) plt.xlabel('entry a') plt.ylabel('entry b') plt.show()
用分类变量绘图
可以使用分类变量创建绘图。允许将分类变量直接传递给许多绘图函数
names = ['group_a', 'group_b', 'group_c'] values = [1, 10, 100] plt.figure(1, figsize=(9, 3)) plt.subplot(131) plt.bar(names, values) plt.subplot(132) plt.scatter(names, values) plt.subplot(133) plt.plot(names, values) plt.suptitle('Categorical Plotting') plt.show()
控制线属性
行可以设置许多属性:线宽,短划线样式,抗锯齿等。看matplotlib.lines.Line2D。有几种方法可以设置线属性
使用关键字args
plt.plot(x, y, linewidth=2.0)
使用Line2D实例的setter方法。plot返回一个Line2D对象列表。假设我们只有一行,以便返回的列表长度为1.使用元组解包,获取该列表第一个元素
line, = plt.plot(x, y, '-') line.set_antialiased(False)
使用setp命令
使用MATLAB样式命令在行列表上设置多个属性。setp透明地使用对象列表或单个对象。可以使用python关键字参数或MATLAB样式的字符串
lines = plt.plot(x1, y1, x2, y2) # use keyword args plt.setp(lines, color='r', linewidth=2.0) # or MATLAB style string value pairs plt.setp(lines, 'color', 'r', 'linewidth', 2.0)
以下是可用的Line2D属性
属性:值类型
alpha:float
animated:[True | False]
antialiased or aa:[True | False]
clip_box:一个matplotlib.transform.Bbox实例
clip_on:[True | False]
clip_path:一个Path实例和一个Transform实例,一个Patch
color or c:任何matplotlib颜色
contains:命中测试功能
dash_capstyle:['butt' | 'round' | 'projecting']
dash_joinstyle:['miter' | 'round' | 'bevel']
dashes:点的开/关墨水序列
data:(np.array xdata, np.array ydata)
figure:一个matplotlib.figure.Figure实例
label:any string
linestyle or ls:[ '-' | '--' | '-.' | ':' | 'steps' | ...]
linewidth or lw:浮点数值
lod:[True | False]
marker:[ '+' | ',' | '.' | '1' | '2' | '3' | '4' ]
markeredgecolor or mec:any matplotlib color
markeredgewidth or mew:float value in points
markerfacecolor or mfc:any matplotlib color
markersize or ms:float
markevery:[ None | integer | (startind, stride) ]
picker:用于交互式线路选择
pickradius:行选择半径
solid_capstyle:['butt' | 'round' | 'projecting']
solid_joinstyle:['miter' | 'round' | 'bevel']
transform:一个matplotlib.transforms.Transform实例
visible:[True | False]
xdata:np.array
ydata:np.array
zorder:any number
要获取可设置的行属性列表,请setp()使用一行或多行作为参数调用该函数
lines = plt.plot([1, 2, 3])plt.setp(lines)
使用多个图形和轴
MATLAB,具有当前图形和当前轴的概念。所有绘图命令都适用于当前轴。gca() 返回当前轴(matplotlib.axes.Axes实例),gcf() 返回当前图形(matplotlib.figure.Figure实例)
def f(t): return np.exp(-t) * np.cos(2*np.pi*t) t1 = np.arange(0.0, 5.0, 0.1) t2 = np.arange(0.0, 5.0, 0.02) plt.figure(1) plt.subplot(211) plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k') plt.subplot(212) plt.plot(t2, np.cos(2*np.pi*t2), 'r--') plt.show()
np.exp 指数函数通常特指以为底数的指数函数(即),为数学中重要的函数,也可写作。这里的是数学常数,也就是自然对数函数的底数,近似值为,又称为欧拉数
figure此处的命令是可选的,因为figure(1)默认情况下将创建该命令,就像subplot(111)您不手动指定任何轴一样,默认情况下将创建该命令。subplot()命令指定其中范围从1到多少。
plt.subplot()关键参数有三个元素,分别代表行、列、当前激活的子图。比如plt.subplot(2,1,2),也可以去掉逗号写成plt.subplot(212)
可以创建任意数量的子图和轴,如果要手动放置轴,使用axes命令,该命令允许你指定所有值在小数(0到1)坐标中的位置。
可以使用figure具有增加的号,多个调用来创建多个数字。每个图形可以包含您心中所需的轴和子图
import matplotlib.pyplot as plt plt.figure(1) # the first figure plt.subplot(211) # the first subplot in the first figure plt.plot([1, 2, 3]) plt.subplot(212) # the second subplot in the first figure plt.plot([4, 5, 6]) plt.figure(2) # a second figure plt.plot([4, 5, 6]) # creates a subplot(111) by default plt.figure(1) # figure 1 current; subplot(212) still current plt.subplot(211) # make subplot(211) in figure1 current plt.title('Easy as 1, 2, 3') # subplot 211 title
可以使用clf 和 当前轴清除当前图形 cla。
使用文本
text()命令可以用于在任意位置添加文本xlabel(),ylabel(),title()
mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) # the histogram of the data n, bins, patches = plt.hist(x, 50, density=1, facecolor='g', alpha=0.75) plt.xlabel('Smarts') plt.ylabel('Probability') plt.title('Histogram of IQ') plt.text(60, .025, r'$\mu=100,\ \sigma=15$') plt.axis([40, 160, 0, 0.03]) plt.grid(True) plt.show()
所有text命令都返回一个matplotlib.text.Text实例。可以通过将关键字参数传递到文本函数或使用setp()以下内容来自定义属性
t = plt.xlabel('my data', fontsize=14, color='red')
文本中使用数学表达式
matplotlib在任何文本表达式中接受TeX方程表达式。要在标题中编写表达式,可以编写由美元符号包围的TeX表达式
plt.title(r'$\sigma_i=15$')
不需要安装TeX,因为matplotlib附带了自己的TeX表达式解析器,布局引擎和字体。布局引擎是TeX中布局算法的直接改变,因此质量非常好
任何文本元素都可以使用数学文本。只要在引号前面加上r,并用美元符号$ 包围数学文本即可。
下面看一例子
plt.title(r'$\alpha > \beta$')
注意一定要放在两个$之间
下标和上标
要制作下标和上标,使用'_' 和 '^' 符号
r '$ \ alpha_i> \ beta_i $'
某些符号会自动将其子上标放在运算符下方和上方。例如写西格玛xi从0到无穷大
r '$ \ sum_ {i = 0} ^ \ infty x_i $'
分数,二项式和堆积数
分数,二项式和堆叠号码可以与被创建frac、binom、stackrel分别命令
r '$ \ frac {3} {4} \ binom {3} {4} \ stackrel {3} {4} $'
分数可以任意嵌套
r '$ \ frac {5 - \ frac {1} {x} } {4} $'
需要特别注意在分数周围放置括号。
r '$(\ frac {5 - \ frac {1} {x} } {4} )$'
r '$ \ left(\ frac {5 - \ frac {1} {x} } {4} \ right)$'
根号
使用\sqrt[]{}命令生成根号
r '$ \ sqrt {2} $'
可以在方括号内提供任何数据,基类必须是简单表达式,不能包含布局命令
r '$ \ sqrt [3] {x} $'
字体
数学符号的默认字体是斜体。要更改字体,将文本括在font命令中
r '$ s(t)= \ mathcal {A} \ mathrm {sin} (2 \ omega t)$'
许多罗马字体排版的常用函数名称都有快捷方式。上面的表达式可以写成如下
r '$ s(t)= \ mathcal {A} \ sin(2 \ omega t)$'
所有字体可用的选项是
命令:结果
\mathrm{Roman}:
\mathit{Italic}:
\mathtt{Typewriter}:
\mathcal{CALLIGRAPHY}:
\mathbb {blackboard}:
\mathrm {\mathbb{blackboard}}:
\mathfrak {Fraktur}:
\mathsf {sansserif}:
\mathrm {\mathsf{sansserif}}:
\mathcircled{circled}:
音节
重音命令可以在任何符号之前,在其上方添加重音。其中有一些长短形式
\acute a or \'a |
|
\bar a |
|
\breve a |
|
\ddot a or \"a |
|
\dot a or \.a |
|
\grave a or \`a |
|
\hat a or \^a |
|
\tilde a or \~a |
|
\vec a |
|
\overline{abc} |
此外,还有两种特殊的重音可以自动调整到下面符号的宽度
\widehat{xyz} |
|
\widetilde{xyz} |
在小写字母i 和 j添加重音时,应该用 \imath内容避免重叠到点上
r “$ \ hat i \ \ \ hat \ imath $”
符号
可以使用大量的TeX的符号
小写希腊语
\alpha
\beta
\chi
\delta
\digamma
\epsilon
\eta
\gamma
\iota
\kappa
\lambda
\mu
\nu
\omega
\phi
\pi
\psi
\rho
\sigma
\tau
\theta
\upsilon
\varepsilon
\varkappa
\varphi
\varpi
\varrho
\varsigma
\vartheta
\xi
\zeta
大写希腊语
\Delta
\Gamma
\Lambda
\Omega
\Phi
\Pi
\Psi
\Sigma
\Theta
\Upsilon
\Xi
\mho
\nabla
希伯来语
\aleph
\beth
\daleth
\gimel
分隔符
/
[
\Downarrow
\Uparrow
\Vert
\backslash
\downarrow
\langle
\lceil
\lfloor
\llcorner
\lrcorner
\rangle
\rceil
\rfloor
\ulcorner
\uparrow
\urcorner
\vert
\{
\|
\}
]
|
大符号
\bigcap
\bigcup
\bigodot
\bigoplus
\bigotimes
\biguplus
\bigvee
\bigwedge
\coprod
\int
\oint
\prod
\sum
标准功能名称
\Pr
\arccos
\arcsin
\arctan
\arg
\cos
\cosh
\cot
\coth
\csc
\deg
\det
\dim
\exp
\gcd
\hom
\inf
\ker
\lg
\lim
\liminf
\limsup
\ln
\log
\max
\min
\sec
\sin
\sinh
\sup
\tan
\tanh
二元运算和关系符号
\Bumpeq
\Cap
\Cup
\Doteq
\Join
\Subset
\Supset
\Vdash
\Vvdash
\approx
\approxeq
\ast
\asymp
\backepsilon
\backsim
\backsimeq
\barwedge
\because
\between
\bigcirc
\bigtriangledown
\bigtriangleup
\blacktriangleleft
\blacktriangleright
\bot
\bowtie
\boxdot
\boxminus
\boxplus
\boxtimes
\bullet
\bumpeq
\cap
\cdot
\circ
\circeq
\coloneq
\cong
\cup
\curlyeqprec
\curlyeqsucc
\curlyvee
\curlywedge
\dag
\dashv
\ddag
\diamond
\div
\divideontimes
\doteq
\doteqdot
\dotplus
\doublebarwedge
\eqcirc
\eqcolon
\eqsim
\eqslantgtr
\eqslantless
\equiv
\fallingdotseq
\frown
\geq
\geqq
\geqslant
\gg
\ggg
\gnapprox
\gneqq
\gnsim
\gtrapprox
\gtrdot
\gtreqless
\gtreqqless
\gtrless
\gtrsim
\in
\intercal
\leftthreetimes
\leq
\leqq
\leqslant
\lessapprox
\lessdot
\lesseqgtr
\lesseqqgtr
\lessgtr
\lesssim
\ll
\lll
\lnapprox
\lneqq
\lnsim
\ltimes
\mid
\models
\mp
\nVDash
\nVdash
\napprox
\ncong
\ne
\neq
\neq
\nequiv
\ngeq
\ngtr
\ni
\nleq
\nless
\nmid
\notin
\nparallel
\nprec
\nsim
\nsubset
\nsubseteq
\nsucc
\nsupset
\nsupseteq
\ntriangleleft
\ntrianglelefteq
\ntriangleright
\ntrianglerighteq
\nvDash
\nvdash
\odot
\ominus
\oplus
\oslash
\otimes
\parallel
\perp
\pitchfork
\pm
\prec
\precapprox
\preccurlyeq
\preceq
\precnapprox
\precnsim
\precsim
\propto
\rightthreetimes
\risingdotseq
\rtimes
\sim
\simeq
\slash
\smile
\sqcap
\sqcup
\sqsubset
\sqsubset
\sqsubseteq
\sqsupset
\sqsupset
\sqsupseteq
\star
\subset
\subseteq
\subseteqq
\subsetneq
\subsetneqq
\succ
\succapprox
\succcurlyeq
\succeq
\succnapprox
\succnsim
\succsim
\supset
\supseteq
\supseteqq
\supsetneq
\supsetneqq
\therefore
\times
\top
\triangleleft
\trianglelefteq
\triangleq
\triangleright
\trianglerighteq
\uplus
\vDash
\varpropto
\vartriangleleft
\vartriangleright
\vdash
\vee
\veebar
\wedge
\wr
箭头符号
\Downarrow
\Leftarrow
\Leftrightarrow
\Lleftarrow
\Longleftarrow
\Longleftrightarrow
\Longrightarrow
\Lsh
\Nearrow
\Nwarrow
\Rightarrow
\Rrightarrow
\Rsh
\Searrow
\Swarrow
\Uparrow
\Updownarrow
\circlearrowleft
\circlearrowright
\curvearrowleft
\curvearrowright
\dashleftarrow
\dashrightarrow
\downarrow
\downdownarrows
\downharpoonleft
\downharpoonright
\hookleftarrow
\hookrightarrow
\leadsto
\leftarrow
\leftarrowtail
\leftharpoondown
\leftharpoonup
\leftleftarrows
\leftrightarrow
\leftrightarrows
\leftrightharpoons
\leftrightsquigarrow
\leftsquigarrow
\longleftarrow
\longleftrightarrow
\longmapsto
\longrightarrow
\looparrowleft
\looparrowright
\mapsto
\multimap
\nLeftarrow
\nLeftrightarrow
\nRightarrow
\nearrow
\nleftarrow
\nleftrightarrow
\nrightarrow
\nwarrow
\rightarrow
\rightarrowtail
\rightharpoondown
\rightharpoonup
\rightleftarrows
\rightleftarrows
\rightleftharpoons
\rightleftharpoons
\rightrightarrows
\rightrightarrows
\rightsquigarrow
\searrow
\swarrow
\to
\twoheadleftarrow
\twoheadrightarrow
\uparrow
\updownarrow
\updownarrow
\upharpoonleft
\upharpoonright
\upuparrows
杂项符号
\$
\AA
\Finv
\Game
\Im
\P
\Re
\S
\angle
\backprime
\bigstar
\blacksquare
\blacktriangle
\blacktriangledown
\cdots
\checkmark
\circledR
\circledS
\clubsuit
\complement
\copyright
\ddots
\diamondsuit
\ell
\emptyset
\eth
\exists
\flat
\forall
\hbar
\heartsuit
\hslash
\iiint
\iint
\iint
\imath
\infty
\jmath
\ldots
\measuredangle
\natural
\neg
\nexists
\oiiint
\partial
\prime
\sharp
\spadesuit
\sphericalangle
\ss
\triangledown
\varnothing
\vartriangle
\vdots
\wp
\yen
示例
这是一个示例,说明了上下文中的许多这些功能。
import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 2.0, 0.01) s = np.sin(2*np.pi*t) plt.plot(t,s) plt.title(r'$\alpha_i > \beta_i$', fontsize=20) plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20) plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize=20) plt.xlabel('time (s)') plt.ylabel('volts (mV)') plt.show()
注释文本
text 上面基本命令的使用将文本放在Axes上的任意位置。文本的常见用途是注释绘图的某些功能,并且该annotate() 方法提供帮助功能义使注释变得更容易
ax = plt.subplot(111) t = np.arange(0.0, 5.0, 0.01) s = np.cos(2*np.pi*t) line, = plt.plot(t, s, lw=2) plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.05),) plt.ylim(-2, 2) plt.show()
xy(箭头提示)和xytext位置都在数据坐标中。可以选择各种其他坐标系
注释
使用Matplotlib注释文本
基本的使用text() 将文本放在Axes上的任意位置。文本的常见用例是注释绘图的某些功能,并且该annotate() 方法提供帮助功能以使注释变得容易。
在注释中,有两点需要考虑:注释的位置由参数xy和文本的位置xytext表示。这两个参数都是(x,y)元组
在上面的示例中,xy箭头是和xytext位置都在数据坐标中。可以选择各种其他坐标系,可以指定xy和xytext使用以下字符串之一的坐标系xycoords和textcoords默认为data
论据:坐标系
'figure points':从图的左下角开始的点
'figure pixels':图左下角的像素
'figure fraction':0,0是图的左下角,1,1是右上角
'axes points':从轴的左下角开始的点
'axes pixels':轴左下角的像素
'axes fraction':0,0位于轴的左下方,1,1位于右上方
'data':使用轴数据坐标系
要将文本坐标放在小数轴坐标中,可以执行以下操作
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', )
对于物理坐标系(点或像素),原点是图形的左下角
通过在可选关键字参数中提供箭头属性字典,可以启用文本到注释点的箭头绘制arrowprops
arrowprops 键:描述
width:点的箭头宽度
frac:头部占据的箭头长度的分数
headwidth:箭头底部的宽度以磅为单位
shrink:移动尖端并将基数与注释点和文本相差一些
**kwargs:任何关键matplotlib.patches.Polygon,例如,facecolor
在下面的示例中,xy点位于本机坐标中(xycoords默认为"data")。示例中文本放在小数字坐标系中。matplotlib.text.Text 关键字args喜欢horizontalalignment,verticalcalignment并fontsize传递annotate给Text示例
文本注释
text() pyplot模块中的函数(或Axes类的文本方法)采用bbox关键字参数,并且在给定时,将绘制文本周围的框
bbox_props = dict(boxstyle="rarrow,pad=0.3", fc="cyan", ec="b", lw=2) t = ax.text(0, 0, "Direction", ha="center", va="center", rotation=45, size=15, bbox=bbox_props)
可以通过以下方式访问与文本关联的修补程序对象
bb = t.get_bbox_patch()
返回值是FancyBboxPatch的一个实例,可以像往常一样访问和修改像facecolor,edgenwith等补丁属性。要更改框的形状,使用set_boxstyle方法
bb.set_boxstyle("rarrow", pad=0.6)
参数是框样式的名称,其属性为关键字参数。目前实现了以下框样式
Class:Name:Attrs
Circle:circle:pad=0.3
DArrow:darrow:pad=0.3
LArrow:larrow:pad=0.3
RArrow:rarrow:pad=0.3
Round:round:pad=0.3,rounding_size=None
Round4:round4:pad=0.3,rounding_size=None
Roundtooth:roundtooth:pad=0.3,tooth_size=None
Sawtooth:sawtooth:pad=0.3,tooth_size=None
Square:square:pad=0.3
请注意,可以使用分隔逗号在样式名称中指定属性参数
bb.set_boxstyle("rarrow,pad=0.6")
箭头注释
annotate() pyplot模块中的函数用于绘制连接图上两点的箭头
ax.annotate("Annotation", xy=(x1, y1), xycoords='data', xytext=(x2, y2), textcoords='offset points', )
在诠释一个点xy在给定的坐标为(xycoords),在文xytext中给出textcoords。通常,注释点在数据坐标中指定,而注释文本在偏移点中指定。
可以通过指定arrowprops参数来选择性地绘制连接两个点(xy和xytext)的箭头。要绘制箭头,请使用空字符串作为第一个参数
ax.annotate("", xy=(0.2, 0.2), xycoords='data', xytext=(0.8, 0.8), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), )
箭头绘制需要几个步骤
1.创建两点之间的连接路径。connectionstyle键值控制
2.如果给出乐力补丁对象patchA和patchB,则剪切路径以避免补丁
3.给定数量的像素进一步缩小路径
4.路径转换为箭头补丁,arrowstyle键值控制
两点之间的乱接路径的创建由connectionstyle键控制,并且可以使用以下样式
Name:Attrs
angle:angleA=90,angleB=0,rad=0.0
angle3:angleA=90,angleB=0
arc:angleA=0,angleB=0,armA=None,armB=None,rad=0.0
arc3:rad=0.0
bar:armA=0.0,armB=0.0,fraction=0.3,angle=None
angle3和arc3 表示结果路径是二次样条线段。当链接路径是二次样条时,才能使用某些箭头样式选项
然后根据给定的链接路径变为箭头补丁arrowstyle
Name:Attrs
-:None
->:head_length=0.4,head_width=0.2
-[:widthB=1.0,lengthB=0.2,angleB=None
|-|:widthA=1.0,widthB=1.0
-|>:head_length=0.4,head_width=0.2
<-:head_length=0.4,head_width=0.2
<->:head_length=0.4,head_width=0.2
<|-:head_length=0.4,head_width=0.2
<|-|>:head_length=0.4,head_width=0.2
fancy:head_length=0.4,head_width=0.4,tail_width=0.4
simple:head_length=0.5,head_width=0.5,tail_width=0.2
wedge:tail_width=0.3,shrink_factor=0.5
某些箭头样式仅适用于生成二次样条线段的连接样式。他们是fancy,simple,wedge。对于这些箭头样式,必须使用angle3或arc3链接样式
如果给出了注释字符串,则默认情况下patchA设置为文本bbox补丁
与在text命令中一样,可以使用bbox参数绘制文本周围的框
将Artists放置在Axes的锚定位置
有些Artists可以防止在Axes的锚定位置。可以使用OffsetBox类创建
mpl_toolkits.axes_grid1,anchored_artists可以使用一些预定义的类matplotlib.offsetbox
from matplotlib.offsetbox import AnchoredText at = AnchoredText("Figure 1a", prop=dict(size=8), frameon=True, loc=2, ) at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2") ax.add_artist(at)
一个简单的应用是在Artists的大小在创作期间以像素大小知道的时候。如果要绘制固定大小为20*20的圆,则可以使用AnchoredDrawingArea,使用绘图区域的大小创建实例,并且可以将任意Artists添加到绘图区域。添加到绘图区域的艺术家的范围与绘图区域本身的位置无关。只有初始尺寸很重要。
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea ada = AnchoredDrawingArea(20, 20, 0, 0, loc=1, pad=0., frameon=False) p1 = Circle((10, 10), 10) ada.drawing_area.add_artist(p1) p2 = Circle((30, 10), 5, fc="r") ada.drawing_area.add_artist(p2)
添加到绘图区域的Artists不应该具有变换集,并且这些Artists的尺寸被解释为像素坐标,即上例中的圆的半径分别是10像素和5像素
如果希望Artists使用数据坐标进行缩放,可以使用AnchoredAuxTransformBox课程。类似于除了Artists的范围是在绘图时间内根据指定的变换确定的。
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredAuxTransformBox box = AnchoredAuxTransformBox(ax.transData, loc=2) el = Ellipse((0,0), width=0.1, height=0.4, angle=30) # in data coordinates! box.drawing_area.add_artist(el)
例子中椭圆在数据坐标中的宽度和高度对应于0.1和0.4,并且当轴的视图极限发生变化时将自动缩放
使用ConnectionPatch
ConnectionPatch就像没有文本的注释。大多数情况建议使用注释功能,但是想要链接不同轴上的点时,ConnectionPatch非常有用
from matplotlib.patches import ConnectionPatch xy = (0.2, 0.2) con = ConnectionPatch(xyA=xy, xyB=xy, coordsA="data", coordsB="data", axesA=ax1, axesB=ax2) ax2.add_artist(con)
上面代码将数据坐标中的ax1点xy链接到数据坐标中的点xy ax2.这是一个简单的例子
虽然可以将ConnectionPatch实例添加到任何轴,但您可能希望将其添加到最新绘图顺序的轴,以防止其他轴重叠。
对数和其他非线性轴
matplotlib.pyplot不仅支持线性轴刻度,还支持对数和logit刻度。如果数据跨越许多数量级,则通常使用这种方法
from matplotlib.ticker import NullFormatter # useful for `logit` scale # Fixing random state for reproducibility np.random.seed(19680801) # make up some data in the interval ]0, 1[ y = np.random.normal(loc=0.5, scale=0.4, size=1000) y = y[(y > 0) & (y < 1)] y.sort() x = np.arange(len(y)) # plot with various axes scales plt.figure(1) # linear plt.subplot(221) plt.plot(x, y) plt.yscale('linear') plt.title('linear') plt.grid(True) # log plt.subplot(222) plt.plot(x, y) plt.yscale('log') plt.title('log') plt.grid(True) # symmetric log plt.subplot(223) plt.plot(x, y - y.mean()) plt.yscale('symlog', linthreshy=0.01) plt.title('symlog') plt.grid(True) # logit plt.subplot(224) plt.plot(x, y) plt.yscale('logit') plt.title('logit') plt.grid(True) # Format the minor tick labels of the y-axis into empty strings with # `NullFormatter`, to avoid cumbering the axis with too many labels. plt.gca().yaxis.set_minor_formatter(NullFormatter()) # Adjust the subplot layout, because the logit one may take more space # than usual, due to y-tick labels like "1 - 10^{-3}" plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25, wspace=0.35) plt.show()
https://matplotlib.org/tutorials/introductory/pyplot.html
来源:https://www.cnblogs.com/chenxygx/p/9552712.html