大家好,今天小编来为大家解答高效图表制作与数据分析:Matplotlib应用详解这个问题,很多人还不知道,现在让我们一起来看看吧!
Matplotlib 是一个用Python 实现的类似MatLab 的第三方库。是Python下最好的绘图库。它功能齐全,继承了Python简单明了的风格。它可以轻松设计和输出二维和三维物体。数据提供常规笛卡尔坐标、极坐标、直角坐标、三维坐标等,可以绘制普通图形、散点图、三维图形、等高线图等。
Matplotlib 有多种应用,本文的示例主要集中在深度学习上。如果您想使用Matplotlib 进行股票趋势、报告分析或其他方面,则使用的绘图元素会略有不同。
在学习Matplotlib的过程中,笔者也感觉Matplotlib有很多值得改进的地方。例如,如果Matplotlib能够相对于线段以特定的角度绘制线段,或者能够将线段延长特定的长度等,那么它在解决平面几何方面肯定会有更大的作用。 Matplotlib是一个完全开源的项目,可以实现这些功能。当然,这有赖于有志之士奉献自己的精力和时间。
二、一个简单的例子
让我们从一个简单的例子开始。需要说明的是,为了让更多的用户能够实验本文档中的示例代码,我们使用Windows下的交互式Python工具Juypter Notebook作为代码运行环境。 Juypter Notebook的安装过程可以参考其他文档。假设您已经成功安装软件,运行Anocoda3软件包中的Juypter Notebook可以看到如下界面。
首先,在文本框中输入以下命令,然后单击“运行”按钮。
%matpplotlib 内联
当前Jupyter中可以使用%matplotlib命令
在Notebook 环境中启用绘图。此命令采用一个可选参数来指定要使用的matplotlib 后端。通常我们使用内联后端,它直接在Jupyter Notebook 输出中渲染绘图。重要的是要了解该命令不是程序代码的一部分。在Ubuntu的Python环境中运行时,必须删除此行。
接下来是实际的程序代码:
将numpy 导入为np
将matplotlib.pyplot 导入为plt
x=np.arange(-np.pi, np.pi, np.pi/100)
y=np.sin(x)
plt.plot(x, y)
plt.show()
上述程序的输入和输出如下图所示。
import numpy as np 语句导入Python的科学计算包。 Matplotlib充分利用Python下的Numeric(Numarray)模块,提供了使用Python进行数据可视化的解决方案,进一步增强了Python进行科学计算的能力。
import matplotlib.pyplot as plt 语句导入matplotlib 包中的pyplot 模块。
语句x=np.arange(-np.pi, np.pi, np.pi/100) 生成一个从- 到 的数组,步长为/100。也就是说,在区间[-,)内,以平均间隔取100个值,得到一个数组。
语句y
=np.sin(x) 计算x数组的正弦函数值,并获得相应长度的数组。
语句plt.plot(x,
y) 调用pyplot模块的plot函数并传入x和y数组。该函数会用直线将x和y数组中对应元素的点用直线连接起来,最终得到一条正弦曲线。
最后,调用plt.show() 函数来呈现这条正弦曲线。
我们看到,在上面的例子中,我们通过4个有效的语句画出了一条正弦曲线。事实上,matplotlib 和python 一样简洁明了。只要我们熟悉了它的思想,我们就可以绘制出各种符合我们需要的图形。
如果您在编写代码时需要帮助,可以访问:
[if !supportLists][endif] Gallery:Matplotlib的Gallery页面(https://matplotlib.org/gallery.html)有数百个缩略图,打开后有源程序。如果您需要绘制某种类型的图表,您可以在图库中搜索示例,并且在大多数情况下您基本上可以通过复制/粘贴来完成。
[if !supportLists][endif]API:如果您想了解如何使用模块中的函数,可以访问Matplotlib的API文档(https://matplotlib.org/api/index.html)。
[if !supportLists][endif]帮助:如果你想了解如何使用模块中的某个功能,也可以在Jupyter Notebook 环境下使用help 命令,如下图所示。
三、Matplotlib组成
要理解Matplotlib绘图,可以用我们日常生活中的绘图来比喻。一般来说,我们的绘画流程是这样的:先架起画板,然后在画板上铺一张画纸。有时我们也会将几张画纸放在不同的位置,每张画纸都有自己独立的参考系。我们在画纸上画各种类型的图画,如水墨画、油画、工笔画、写意画、素描、漫画等。此外,一幅完整的画还需要题跋。书籍、碑刻、字画等写在前面的文字称为题跋,写在后面的文字称为跋,统称为题跋。
Matplotlib中的专业术语大致对应如下:
[if !supportLists][endif]图:与上面提到的画板类似。可以认为是Matplotlib绘图的基础。
[if !supportLists][endif]Axes 或Subplot:与上面的绘图纸类似。画板上有一张或多张画纸,实际绘图是在轴或子图上完成的。
[if !supportLists][endif]X 轴和Y 轴:绘图所基于的坐标系,相对于上面的参考系。不过,对于专业画家来说,参考系是在自己心中的,并不一定要标注在图纸上。在Matplotlib中,一般需要呈现X轴和Y轴,包括它们的标签(Label)、轴(Spine)、刻度(Tick)以及刻度标签等。
[if !supportLists][endif] 标题(Title)和图例(Legend):与上面的标题和后记类似,具体来说:标题对应标题,图例对应后记。与绘画一样,Matplotlib 中的标题和图例也可以放置在轴图或子图上的不同位置。
[if !supportLists][endif]数据:毫无疑问,Matplotlib 中的数据是相对于绘画的主要部分:内容而言的。 Matplotlib 支持的绘图类型包括:普通图(Plot)、散点图(Scatter)和三维图(3D)。对于绘制过程中的每一个笔画,还可以指定所使用的颜色(Color)、样式(Style)、标记(Marker)等。
[if !supportLists][endif]文字/注释:这在日常绘画中并不常见,但我们也可以将其归为绘画中的主要内容。 Matplotlib 使用文本和注释来说明重要数据。
上面的术语也可以参考下图。
上图是只有一张轴图的情况。 Matplotlib 还支持在一张图中绘制多个轴。这时就需要通过调用特定函数来添加轴图。每个轴图都是一个具有自己独立坐标系的绘图区域,可以位于图像上的任何位置。
当然,轴图也可以按照某种模式放置。这时,我们称它们为次要情节。轴图和子图彼此相关:轴图是灵活的子图,而子图是以网格组织并按行和列定位的特殊轴图。下图展示了深度学习中经常使用的一些激励函数,排列成2行2列。
四、坐标系统
为了说明坐标系,我们对第一个例子进行补充。这次我们将添加标题、比例、比例标签、图例等,并调整坐标系的位置。我们希望输出的效果图如下。
因为要显示中文标题,所以首先在代码中添加如下语句。
plt.rcParams["font.sans-serif"]=["SimHei"]
接下来的三个语句生成数据。具体解释可以参考前面的例子。
x=np.arange(-np.pi, np.pi, np.pi/100)
y1=np.sin(x)
y2=np.cos(x)
坐标系是相对于轴的。如前所述,Matplotlib 使用Figure 和Axes 进行绘图。前者类似于画板,后者类似于画纸。如果我们不调用添加Figure和Axes的语句,系统将使用默认的画板和画纸。调用gcf()和gca()函数会分别获取系统默认的画板和画纸,然后就可以调用画板和画纸函数进行操作了。
ax.set_title("正弦和余弦函数") 向Matplotlib 绘图添加标题。通常,标题将出现在图像的顶部中心。还可以传入loc="left" 或loc="right" 参数将标题设置为左上或右上位置。当然,其他位置也是可能的。
Matplotlib轴域的坐标系默认有四个轴:左、下、右、上。要在图形中心显示坐标系,需要隐藏其中两个并移动另外两个。例如:将左轴和底轴的位置设置在中心,将右轴和顶轴的颜色设置为none,以达到隐藏的效果。另外,对于左轴和下轴,调用set_smart_bounds方法。
ax.spines["左"].set_position("中心")
ax.spines["right"].set_color("none")
ax.spines["底部"].set_position("中心")
ax.spines["top"].set_color("none")
ax.spines["left"].set_smart_bounds(True)
ax.spines["bottom"].set_smart_bounds(True)
接下来的三个语句设置X 轴的范围和比例。范围设置在区间[-,)内,对应的刻度标签在-、-/2、0、/2、等位置表示。
Matplotlib轴域的坐标系默认有四个轴:左、下、右、上。要在图形中心显示坐标系,需要隐藏其中两个并移动另外两个。例如:将左轴和底轴的位置设置在中心,将右轴和顶轴的颜色设置为none,以达到隐藏的效果。另外,对于左轴和下轴,调用set_smart_bounds方法。
ax.set_xlim(-np.pi, np.pi)
ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
ax.set_xticklabels(["-$pi$", "-$pi$/2", "0", "$pi$/2", "$pi$"])
对于Y 轴,我们想要呈现主要刻度线和次要刻度线的效果。
def Major_tick(y, pos):
如果y 不在[-1.0, -0.5, 0, 0.5, 1.0]: 中
返回""
返回y
ax.yaxis.set_major_locator(MultipleLocator(0.500))
ax.yaxis.set_major_formatter(FuncFormatter(major_tick))
ax.yaxis.set_minor_locator(AutoMinorLocator(2))
坐标系建立后,调用plot函数分别绘制正弦和余弦曲线。系统默认会将两条曲线渲染为两种不同的颜色。这次,我们传入label参数,为两条曲线添加标签。
ax.plot(x, y1, label="sin()")
ax.plot(x, y2, label="cos()")
之后调用legend添加图例并显示。它将解释上面两条曲线的颜色和相应的标签。输出绘图,左上角显示图例。在其他情况下,它可能会显示在不同的位置。您还可以通过参数指定图例显示的位置。
五、数据属性
这里所说的属性是指Matplotlib基本绘图元素的属性,包括颜色、线型、符号等,这个通过一个例子就可以清楚地理解。
分析一下这个例子的实现。
首先准备好数据,
t=np.arange(0.0, 1.0, 0.1)
s=np.sin(2*np.pi*t)
然后定义线性和符号,
线条样式=["_", "-", "--", ":"]
标记=[]
在Line2D.markers: 中表示m
尝试:
如果len(m)==1 且m !=" ":
标记.append(m)
除了类型错误:
经过
样式=标记+ [
r"$lambda$",
r"$领结$",
r"$circlearrowleft$",
r"$俱乐部套装$",
r"$复选标记$"]
然后定义线性和符号,
线条样式=["_", "-", "--", ":"]
标记=[]
在Line2D.markers: 中表示m
尝试:
如果len(m)==1 且m !=" ":
标记.append(m)
除了类型错误:
经过
样式=标记+ [
r"$lambda$",
r"$领结$",
r"$circlearrowleft$",
r"$俱乐部套装$",
r"$复选标记$"]
然后定义颜色。
颜色=("b", "g", "r", "c", "m", "y", "k")
该程序的核心部分是双循环。外层在行上循环,内层在行的列上循环。对于某一行的某一列,我们添加对应的子图,计算对应的颜色、线型和标记,然后进行绘制。绘图时,调用相应函数去除左侧刻度标签。
轴号=0
对于范围(6): 中的行
对于范围(5): 内的列
轴号+=1
ax=plt.subplot(6, 5, axisNum)
颜色=颜色[axisNum % len(颜色)]
if axisNum len(linestyles):
plt.plot(t, s, 线型[axisNum], 颜色=颜色, 标记大小=10)
否则:
样式=样式[(axisNum - len(线条样式)) % len(样式)]
plt.plot(t,s,linestyle="无",标记=样式,颜色=颜色,标记大小=10)
ax.set_yticklabels([])
ax.set_xticklabels([])
5.1 颜色
在上面的例子中,我们使用了"b"、"g"、"r"、"c"、"m"、"y"、"k"等颜色。事实上,我们可以通过名称来指代更多颜色。这些颜色在颜色模块的BASE_COLORS 和mcolors.CSS4_COLORS 中定义。下面是按颜色和饱和度排序的颜色名称和效果图,分为4 列。我们把它们放在这里以便于查询。
上面的例子也是通过Matplotlib程序输出的,可以在图库中搜索到。
5.2 线型
上例中给出了四条线性线:"_"、"-"、"--"、":",效果如下图。
如果想使用更多的线型,可以通过(,())的形式指定linestyle参数,如下表所示。
"固体"(0, ())
"松散点" (0, (1, 10))
"点" (0, (1, 5))
"密密麻麻" (0, (1, 1))
"松散的虚线" (0, (5, 10))
"虚线" (0, (5, 5))
"密集虚线" (0, (5, 1))
"松散的点划线" (0, (3, 10, 1, 10))
"虚线"(0, (3, 5, 1, 5))
"密集的点划线" (0, (3, 1, 1, 1))
"松散的点划线"(0, (3, 10, 1, 10, 1, 10))
"点划线" (0, (3, 5, 1, 5, 1, 5))
"密集的点划线" (0, (3, 1, 1, 1, 1, 1)))
这些表格对应的效果图如下。
5.3 记号
上一个示例中的标记是从Line2D.markers 数组中遍历的。具体使用时,我们可以将marker参数指定为以下类型之一:".",",","o","v","^","","","1","2" , "3","4","8","s","p","P","*",
"h","H","+","x","X","D","d","|","_",对应效果如下。
六、注释和文本
接下来给出一个注释示例。
此示例涉及在一个程序中绘制两个图表。实现也非常简单。
首先创建第一个图形并添加一个子图形。
图=plt.figure(1, 图大小=(8, 5))
ax=Fig.add_subplot(111, autoscale_on=False, xlim=(-1, 5), ylim=(-4, 3))
创建第二个Figure的逻辑与子figure的逻辑类似,只不过这里需要调用该figure的clf方法来清除之前画板上的内容。
图=plt.figure(2)
图.clf()
ax=Fig.add_subplot(111, autoscale_on=False, xlim=(-1, 5), ylim=(-5, 3))
在第二个子图上,我们使用以下代码绘制一个椭圆。
el=椭圆((2, -1), 0.5, 0.5)
ax.add_patch(el)
当然,我们还是重点关注注释部分,下面会单独介绍。
第一张图片的第一个标注内容是直线,标注点为(0, 1)。
ax.annotate("直线", xy=(0, 1), xycoords="数据", xytext=(-50, 30), textcoords="偏移点", arrowprops=dict(arrowstyle="-"))
第一张图的第二个注释内容包括两行内容,第一行是arc3,第二行是rad 0.2。注释点为(0.5, -1)
ax.annotate("arc3,nrad 0.2", xy=(0.5, -1), xycoords="data", xytext=(-80, -60), textcoords="偏移点", arrowprops=dict(arrowstyle="-",connectionstyle="arc3,rad=.2"))
第一张图的第三条注释内容也包括两行内容,第一行是圆弧,第二行是50角。注释点是(1, 1)。
ax.annotate("arc,nangle 50", xy=(1. 1), xycoords="data", xytext=(-90, 50), textcoords="偏移点", arrowprops=dict(arrowstyle="-",connectionstyle="arc,angleA=0,armA=50,rad=10"))
对第一张图的第四条评论。
ax.annotate("arc,narms", xy=(1.5, -1), xycoords="data", xytext=(-80, -60), textcoords="偏移点", arrowprops=dict(arrowstyle=" -",connectionstyle="圆弧,angleA=0,armA=40,angleB=-90,armB=30,rad=7"))
第一个图的第五个注释。
ax.annotate("角度,nangle 90", xy=(2. 1), xycoords="数据", xytext=(-70, 30), textcoords="偏移点", arrowprops=dict(arrowstyle=" -",connectionstyle="角度,angleA=0,angleB=90,rad=10"))
对第一张图的第六条评论。
ax.annotate("angle3,nangle -90", xy=(2.5, -1), xycoords="data", xytext=(-80, -60), textcoords="偏移点", arrowprops=dict(arrowstyle="-", 连接样式="angle3,angleA=0,angleB=-90"))
对第一张图的第七条评论。
ax.annotate("角度,nround", xy=(3. 1), xycoords="data", xytext=(-60, 30), textcoords="偏移点", bbox=dict(boxstyle="round ", fc="0.8"), arrowprops=dict(arrowstyle="-", connectionstyle="角度,angleA=0,angleB=90,rad=10"))
对第一张图的第八条评论。
ax.annotate("角度,nround4", xy=(3.5, -1), xycoords="数据", xytext=(-70, -80), textcoords="偏移点", size=20, bbox=dict (boxstyle="round4,pad=.5",fc="0.8"),arrowprops=dict(arrowstyle="-",connectionstyle="角度,angleA=0,angleB=-90,rad=10"))
对第一张图的第九条评论。
ax.annotate("角度,n收缩", xy=(4. 1), xycoords="数据", xytext=(-60, 30), textcoords="偏移点", bb
ox=dict(boxstyle="round", fc="0.8"), arrowprops=dict(arrowstyle="->", shrinkA=0, shrinkB=10, connectionstyle="angle,angleA=0,angleB=90,rad=10")) 第一个图的第十个注释。 # You can pass an empty string to get only annotation arrows rendered ann = ax.annotate("", xy=(4., 1.), xycoords="data", xytext=(4.5, -1), textcoords="data", arrowprops=dict(arrowstyle="<->", connectionstyle="bar", ec="k", shrinkA=5, shrinkB=5)) 第二个图的第一个注释。 ax.annotate("$->$", xy=(2., -1), xycoords="data", xytext=(-150, -140), textcoords="offset points", bbox=dict(boxstyle="round", fc="0.8"), arrowprops=dict(arrowstyle="->", patchB=el, connectionstyle="angle,angleA=90,angleB=0,rad=10")) 第二个图的第二个注释。 ax.annotate("arrownfancy", xy=(2., -1), xycoords="data", xytext=(-100, 60), textcoords="offset points", size=20, # bbox=dict(boxstyle="round", fc="0.8"), arrowprops=dict(arrowstyle="fancy", fc="0.6", ec="none", patchB=el, connectionstyle="angle3,angleA=0,angleB=-90")) 第二个图的第三个注释。 ax.annotate("arrownsimple", xy=(2., -1), xycoords="data", xytext=(100, 60), textcoords="offset points", size=20, # bbox=dict(boxstyle="round", fc="0.8"), arrowprops=dict(arrowstyle="simple", fc="0.6", ec="none", patchB=el, connectionstyle="arc3,rad=0.3")) 第二个图的第四个注释。 ax.annotate("$->$", xy=(2., -1), xycoords="data", xytext=(-150, -140), textcoords="offset points", bbox=dict(boxstyle="round", fc="0.8"), arrowprops=dict(arrowstyle="->", patchB=el, connectionstyle="angle,angleA=90,angleB=0,rad=10")) 第二个图的第五个注释。 ann = ax.annotate("bubble,ncontours", xy=(2., -1), xycoords="data", xytext=(0, -70), textcoords="offset points", size=20, bbox=dict(boxstyle="round", fc=(1.0, 0.7, 0.7), ec=(1., .5, .5)), arrowprops=dict(arrowstyle="wedge,tail_width=1.", fc=(1.0, 0.7, 0.7), ec=(1., .5, .5), patchA=None, patchB=el, relpos=(0.2, 0.8), connectionstyle="arc3,rad=-0.1")) 第二个图的第六个注释。 ann = ax.annotate("bubble", xy=(2., -1), xycoords="data", xytext=(55, 0), textcoords="offset points", size=20, va="center", bbox=dict(boxstyle="round", fc=(1.0, 0.7, 0.7), ec="none"), arrowprops=dict(arrowstyle="wedge,tail_width=1.", fc=(1.0, 0.7, 0.7), ec="none", patchA=None, patchB=el, relpos=(0.2, 0.5))) 在Matplotlib绘图的过程中,必须会用到一些特殊文本,例如数学符号。 第一行对应的输入为r"$W^{3beta}_{delta_1 rho_1 sigma_2} = U^{3beta}_{delta_1 rho_1} + frac{1}{8 pi 2} int^{alpha_2}_{alpha_2} d alpha^prime_2 left[frac{ U^{2beta}_{delta_1 rho_1} - alpha^prime_2U^{1beta}_{rho_1 sigma_2} }{U^{0beta}_{rho_1 sigma_2}}right]$"; 第二行对应的字符串为:r"$alpha_i >beta_i, alpha_{i+1}^j = {rm sin}(2pi f_j t_i) e^{-5 t_i/tau}, ldots$", 第三行对应的字符串为:r"$frac{3}{4}, binom{3}{4}, stackrel{3}{4}, left(frac{5 - frac{1}{x}}{4}right), ldots$"; 第四行对应的字符串为:r"$sqrt{2}, sqrt[3]{x}, ldots$"; 第五行对应的字符串为:r"$mathrm{Roman} , mathit{Italic} , mathtt{Typewriter} mathrm{or} mathcal{CALLIGRAPHY}$"; 第六行对应的字符串为:r"$acute a, bar a, breve a, dot a, ddot a, grave a, hat a, tilde a, vec a, widehat{xyz}, widetilde{xyz}, ldots$"; 第七行对应的字符串为:r"$alpha, beta, chi, delta, lambda, mu, Delta, Gamma, Omega, Phi, Pi, Upsilon, nabla, aleph, beth, daleth, gimel, ldots$"; 第八行对应的字符串为:r"$coprod, int, oint, prod, sum, log, sin, approx, oplus, star, varpropto, infty, partial, Re, leftrightsquigarrow, ldots$"。 有时候,我们需要将文本旋转一定角度呈现。只需要在调用pyplot的text方法时指定rotate参数。例如,下面的例子中,先画了一条角度为45度的直线。 # Plot diagonal line (45 degrees) h = plt.plot(np.arange(0, 10), np.arange(0, 10)) 我们在第一个位置写上一条45度的文本。 # Locations to plot text l1 = np.array((1, 1)) # Rotate angle angle = 45 # Plot text th1 = plt.text(l1[0], l1[1], "text not rotated correctly", fontsize=16, rotation=angle, rotation_mode="anchor") 上面的方法只限于坐标系X轴和Y轴比例相同的情况。如果不相同,则需要进行变换。下面的代码中,我们在第二个位置写下角度变换后的文本。 # set limits so that it no longer looks on screen to be 45 degrees plt.xlim([-10, 20]) # Locations to plot text l2 = np.array((5, 5)) # Rotate angle trans_angle = plt.gca().transData.transform_angles(np.array((45,)), l2.reshape((1, 2)))[0] # Plot text th2 = plt.text(l2[0], l2[1], "text rotated correctly", fontsize=16, rotation=trans_angle, rotation_mode="anchor") 从下图可以看到,没有变换角度的文本和所画的直线不对应,而变换过角度的文本和所画的直线则完全对应。七、轴图和子图
轴图和子图的区别在前面已经介绍过。简而言之,子图是特殊的轴图,轴图是灵活的子图。它们分别调用add_axes和add_subplot函数向图形中添加一个轴图,两个函数都返回matplotlib.axes.Axes对象。但是,两个函数的调用机制有很大不同。 函数add_axes的调用方法是add_axes(rect),其中rect是一个列表[x0, y0, width, height],标记新轴图在图形坐标系中左下角的位置(x0,y0),以及新轴图的宽度width和高度height。因此,轴图定位在画板的绝对坐标位置。例如,以下语句在画板上添加一个和画板一样大小的轴图。 Fig = plt.figure() ax = fig.add_axes([0,0,1,1]) 函数add_subplot的调用方法并不直接提供放置轴图的位置选项。而是指定按照子图栅格摆放轴图的方式。最常用也是最简单的指定位置的方法是使用3个整数的记号。 fig = plt.figure() ax = fig.add_subplot(231) 上述语句,一个新的轴图会在2行3列的栅格中的第一个位置创建。如果只要创建一个轴图,可以调用add_subplot(111)(在1行1列的栅格中的第一个位置创建轴图)。 这个方法的优点是让matplotlib来计算轴图的确切位置。默认情况下,add_subplot(111)将轴图定位在[0.125,0.11,0.775,0.77],或者类似的位置,已经为轴图周围的标题和刻度(标签)保留的足够的空间。 大多数情况下,在画板上创建轴图,最常使用的方法是add_subplot。只有在您需要为轴图指定确切位置时,才会用到add_axes。7.1 轴域
我们看一个轴域的例子。 如果您需要在任意位置创建轴图,调用figure的add_axes函数添加轴域。该函数有一个列表参数[left, bottom, width, height],分别为轴域在图形中的左下角位置以及长度和宽度。这些参数以图形的坐标体系为参数,范围在0到1之间。(0, 0)表示Figure的左下角位置,(1, 1)表示Figure的全部长度和宽度。 因此以下语句段,在(0.1, 0.1)位置处添加一个长和宽均为0.8的轴域。 ax1 = fig.add_axes([0.1,0.1,.8,.8]) ax1.set_xticks([]) ax1.set_yticks([]) ax1.text(0.6, 0.6, "axes([0.1,0.1,.8,.8])", ha="center", va="center", size=16,alpha=.5) 以下语句段,在(0.2, 0.2)位置处添加一个长和宽均为0.3的轴域。 ax2 = fig.add_axes([0.2,0.2,.3,.3]) ax2.set_xticks([]) ax2.set_yticks([]) ax2.text(0.5, 0.5, "axes([0.2,0.2,.3,.3])", ha="center", va="center", size=12, alpha=.5)7.2 子域
我们再看一个子域的例子。 这个例子通过GridSpec机制添加子图,我们先定义一个3×3的栅格。 G = gridspec.GridSpec(3, 3) 第一个子图位于第一行,占据所有三个列,因此行号指定为0,列号用冒号表示所有列。 ax1 = fig.add_subplot(G[0, :]) ax1.set_xticks([]) ax1.set_yticks([]) ax1.text(0.5, 0.5, ",ha="center", va="center", size=20, alpha=.5) 第一个子图位于第二行,占据前面两个列,因此行号指定为1,列号用冒号-1表示倒数第1列之前的所有列,即第一列和第二列。 ax2 = fig.add_subplot(G[1,:-1]) ax2.set_xticks([]) ax2.set_yticks([]) ax2.text(0.5, 0.5, ",ha="center", va="center", size=20, alpha=.5) 第三个子图占据第二行和第三行,位于最后一个列,因此行号用1冒号表示第1列之后的所有列,即第二列和第三列,列号指定为-1表示倒数第1列,即第三列。 ax3 = fig.add_subplot(G[1:, -1]) ax3.set_xticks([]) ax3.set_yticks([]) ax3.text(0.5, 0.5, ",ha="center", va="center", size=20, alpha=.5) 第四个子图位于第三行第一列,因此行号用-1表示倒数第1行,即第三行,列号指定为0。 ax4 = fig.add_subplot(G[-1,0]) ax4.set_xticks([]) ax4.set_yticks([]) ax4.text(0.5, 0.5, ",ha="center", va="center", size=20, alpha=.5) 第五个子图位于第三行第二列,因此行号用-1表示倒数第1行,即第三行,列号用-2表示倒数第2列,即第二列。 ax5 = fig.add_subplot(G[-1,-2]) ax5.set_xticks([]) ax5.set_yticks([]) ax5.text(0.5, 0.5, ",ha="center", va="center", size=20, alpha=.5)八、图的形状
8.1 普通图
前面介绍过许国普通图的例子,这里不再赘述。8.2 散点图
以下是散点图的例子。 在深度学习中,线性回归算法是基础的一环。我们需要训练出一条直线能够拟合如上图中的数据。 首先生成模拟数据。 x = np.arange(0, 2.0, 0.1) #生成一个0到50的序列 y = x * 0.1 + 0.3 + np.random.normal(0.0, 0.03, 20) 接下来,以散点的方式呈现上面的数据。 ax.scatter(x,y, label="Sample Data") ax.set_title("Linear Regression",fontsize=20) # 添加标题,并设置字体大小 ax.set_xlabel("X Axis", fontsize=15) # 添加x轴,并设置字体大小 ax.set_ylabel("Y Axis", fontsize=15) # 添加y轴,并设置字体大小 ax.set_ylim(0.2, 0.6)8.3 三维图
Matplotlib通过axes3d模块支持三维图。 import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import axes3d fig = plt.figure() ax = fig.gca(projection="3d") X, Y, Z = axes3d.get_test_data(0.05) ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) cset = ax.contourf(X, Y, Z, zdir="z", offset=-100, cmap=cm.coolwarm) cset = ax.contourf(X, Y, Z, zdir="x", offset=-40, cmap=cm.coolwarm) cset = ax.contourf(X, Y, Z, zdir="y", offset=40, cmap=cm.coolwarm) ax.set_xlabel("X") ax.set_xlim(-40, 40) ax.set_ylabel("Y") ax.set_ylim(-40, 40) ax.set_zlabel("Z") ax.set_zlim(-100, 100) plt.show()8.4 等高图
Matplotlib支持绘制等高图。 import numpy as np import matplotlib.pyplot as plt 定义等高线高度函数 def f(x, y): return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2) 数据数目 n = 256 定义x, y x = np.linspace(-3, 3, n) y = np.linspace(-3, 3, n) 生成网格数据 X, Y = np.meshgrid(x, y) 填充等高线的颜色, 8是等高线分为几部分 plt.contourf(X, Y, f(X, Y), 8, alpha = 0.75, cmap = plt.cm.hot) 绘制等高线 C = plt.contour(X, Y, f(X, Y), 8, colors = "black") 绘制等高线数据 plt.clabel(C, inline = True, fontsize = 10) 去除坐标轴 plt.xticks(()) plt.yticks(()) plt.show()九、动画
9.1 二维动画
Matplotlab支持生成二维动画。例如,我们可以将在曲线上某点P的求导做成一个动画,以更形象地阐述导数的概念,提高教学效果。9.2 三维动画
我们通过动画的方式来呈现一个三维图形的效果。 首先导入需要的包。 # First import everthing you need import numpy as np from matplotlib import pyplot as plt from matplotlib import animation from mpl_toolkits.mplot3d import Axes3D 接下来准备数据。 x = np.linspace(-10, 10, 101) y = x x, y = np.meshgrid(x, y) z = x ** 2 + y ** 2 创建画板和画纸。 # Create a figure and a 3D Axes fig = plt.figure() ax = Axes3D(fig) 画出动画的初始图。 # Create an init function and the animate functions. # Both are explained in the tutorial. Since we are changing # the the elevation and azimuth and no objects are really # changed on the plot we don"t have to return anything from # the init and animate function. (return value is explained # in the tutorial. def init(): ax.plot_surface(x, y, z, rstride=1, cstride=1) return fig, 定义动画的动态函数。 def animate(i): print(i) ax.view_init(elev=30., azim=i) return fig, 按固定套路生成动画对象。 # Animate anim = animation.FuncAnimation(fig, animate, init_func=init, frames=360, interval=20, blit=True) 将动画保存在文件中。需要说明的是,必须在环境中安装ffmpeg模块,才能进行保存。 # Save anim.save("3danim.mp4") 最后,我们可以打开保存的文件查看动画效果。十、Matplotlib可视化应用
Matplotlib是深度学习一个行之有效的手段。首先,它可以实现训练数据的可视化,无论是监督学习的分类问题和回归问题,还是无监督学习的聚类问题,都可以帮助我们设计有效的模型进行训练。例如,对于鸢尾花分类问题,我们将数据如下图可视化,就很清除地知道可以使用感知机或线性回归算法进行处理了。 在深度学习中,Matplotlib还可以实现训练过程的可视化,从而判断出训练算法或训练参数是否需要调整,以及在什么时候可以停止训练。这里需要一张训练过程收敛和不收敛的图进行比较。 此外,深度学习在平面几何和立体几何中能够帮助呈现动画效果,从而起到辅助教学和求解的作用。例如,下面是一道经典的平面几何试题。 已知:如图,O是半圆的圆心,C、E是圆上的两点,CD⊥AB,EF⊥AB,EG⊥CO,求证:CD=GF。 就这道题而言,我们可以将C固定,让E在圆上变动,更直观地感知GF的变化。用Matplotlib可视化出来的动画效果如下: 下面是一个立体几何的例子。 如图,AD与BC是四面体ABCD中相互垂直的棱,BC=2,若AD=2c,且AB+BD=AC+CD=2a,其中a、c为常数,则四面体的体积的最大值是____。 虽然不完美,我们还是可以用Matplotlib画出在BC变化的情况下,四面体的变化情况,从而推测出四面体体积的最大值应该出现在中间位置,为求解提供一定的方向。 下面是另一个立体几何的例子。 如图,在四棱锥S-ABCD中,底面ABCD为正方形,侧棱SD底面ABCD,E、F分别是AB、SC的中点。 [if !supportLists](1) [endif]求证:EF//平面SAD [if !supportLists](2) [endif]设SD=2CD,求二面角A-EF-D的大小。 我们可以用Matplotlib画出上述题目的形状,然后手动调整它的观察位置和角度,全方位了解上述立体图形。如果你还想了解更多这方面的信息,记得收藏关注本站。
【高效图表制作与数据分析:Matplotlib应用详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想学习一下数据可视化,matplotlib 就蛮适合入门的感觉!
有20位网友表示赞同!
看这标题就让人期待,想看看matplotlib 能展示啥样的图哦!
有12位网友表示赞同!
对Python不太熟悉,希望这篇文章能简单易懂,教教我 matplotlib怎么用吧。
有11位网友表示赞同!
数据可视化真的很重要,matplotlib 估计是必备工具之一啊!
有6位网友表示赞同!
之前看到别人用matplotlib 做出的图都很专业,现在终于有时间自己学习了!
有17位网友表示赞同!
应该有很多应用场景可以利用matplotlib吧?期待文章分享一些例子!
有11位网友表示赞同!
有没有实战案例,比如用matplotlib 画股票走势图什么的?
有10位网友表示赞同!
感觉 matplotlib 的图表样式很美观,适合做一些报告或演示。
有6位网友表示赞同!
不知道编程基础要求怎么样,我稍微有点计算机背景就行吗?
有12位网友表示赞同!
希望这篇文章介绍多种matplotlib 应用,比如数据分析、机器学习等等!
有6位网友表示赞同!
matplotlib 应该有很多扩展库吧?文章会不会提到一些常用的工具?
有10位网友表示赞同!
我想在科研项目中用matplotlib 做一些图形展示,希望可以学到点干货!
有14位网友表示赞同!
数据可视化真的能让数据更容易理解,matplotlib 这个工具挺宝贵的哦。
有16位网友表示赞同!
之前只看别人用matplotlib 画图,现在终于能自己试试了!
有15位网友表示赞同!
这篇文章会不会附带一些代码例子?那样学习起来更容易啊!
有15位网友表示赞同!
matplotlib 用 Python 写的,是不是上手比较方便呢?
有19位网友表示赞同!
可以用 matplotlib 做哪些类型的图呢?期待文章介绍不同图表的功能!
有16位网友表示赞同!
希望这篇文章能讲得深入浅出,让我明白 matplotlib 的原理和用法!
有15位网友表示赞同!
我想做一些数据可视化展示,matplotlib 应该是个不错的选择吧?
有6位网友表示赞同!
文章能不能提供一些学习资源或教程链接?这样更方便我学习。
有12位网友表示赞同!