在制图数据齐备的情况下,matplotlib制作二维图形变得非常轻松,本节以二维坐标系中图形制作为例讲解matplotlib制图要素。
1.简单函数图
以制作[-π,π]区间内的sin(x)图形为例,其程序代码如下:
程序的执行结果如图8.2.1所示。
可以总结matplotlib的制图步骤如下:
①引入matplotlib;
②准备数据;
③plot方法制图;
④show方法显示。
用户可以右击生成的图形,选择保存,将生成的图形保存成jpg、png等多种格式的图像文件。
图8.2.1 程序制作的sin图形
2.坐标轴设定
使用axis([x1,x2,y1,y2])可以设定作图横、纵坐标的范围,也可以单独使用xlim(x1,x2)设定横轴坐标范围,ylim(y1,y2)设置纵轴坐标范围,如下例:
程序的运行结果如图8.2.2所示。请观察整个图形的标题、各坐标轴的标题。本例故意将y轴的范围设得很大,所以制作的曲线被压缩在图形的底部。
图8.2.2 设定纵横坐标轴范围作图
3.画网格线
选择画网格线,可使图内的坐标值更加清晰,grid(True)函数可完成该任务。如上例中,将代码修改为(去掉纵、横坐标范围限制):
plt.grid(True)
plt.plot(x,y)
plt.show( )
程序运行结果如图8.2.3所示。
图8.2.3 设置网格线制图
4.图形修饰
图形修饰指生成的图形的颜色、线型、线宽、图例、坐标轴刻度等内容的设定。下面例子使用颜色、线宽、线型设置生成的图形。
import numpy as np
from pylab import*
x=np.linspace(-np.pi,np.pi,100)
sin,cos=np.sin(x),np.cos(x)
plot(x,sin,color=ˈblueˈ,linewidth=2.0,linestyle=ˈ-ˈ) #设置蓝色、2像素宽划线
plot(x,cos,color=ˈredˈ,linewidth=2.0,linestyle=ˈ-.ˈ) #用虚线画图
show( )
程序生成的图如图8.2.4,请参阅代码中颜色、线宽、线型的设置。
图8.2.4 设置颜色、线宽制图
图8.2.5 自定义坐标轴刻度
5.设定坐标轴刻度
用户可以指定坐标轴的刻度,制作出更能表达意义的图形,xticks(yticks)方法实现了该功能。参见下面坐标轴刻度设置的例子。
import numpy as np
from pylab import*
x=np.linspace(-np.pi,np.pi,100)
cos=np.cos(x)
xticks(np.linspace(-np.pi,np.pi,5)) #设置图形刻度
plot(x,cos,color=ˈredˈ,linewidth=2.0,linestyle=ˈ-ˈ)
show( )
得到的图形如8.2.5所示,坐标轴的刻度与三角函数的周期紧密相关。
6.设置样例
多曲线并列画在同一幅图形中时,制图者需要指定每条线的具体含义,这就是样例。通过设定plot函数的label参数,再配合legend函数可设置图例,见下例:
生成的图形如图8.2.6,在图形的左上角,增加了图例说明。
图8.2.6 增加图例
图8.2.7 scatter制作的散点图
7.散点图
对给定一组实验数据(xi,yi),将实验点在二维坐标中显示出来,就需要制作散点图,使用的函数是scatter,见下面的例子。
import numpy as np
from pylab import*
n=10
x=np.linspace(-10,10,n)
y=np.random.normal(0,1,n)
scatter(x,y)
show( )
上面例子,先产生两组数据,组成两维空间中的10个实验点,然后通过scatter函数制作散点图,程序运行的结果如图8.2.7。
scatter函数还可以通过其他参数,设定每个点的面积大小及颜色。下面代码在制作散点图的同时,设置每个点的大小及颜色。
程序的运行结果图8.2.8。
8.饼图
pie函数用于制作饼图,它使用一个列表作为数据源,并自动计算列表中的每项占总和的百分比,以百分比数据制作饼图。如下面代码:
图8.2.8 点大小及颜色不同的散点图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl(www.daowen.com)
mpl.rcParams[ˈfont.familyˈ]=ˈsans-serifˈ
mpl.rcParams[ˈfont.sans-serifˈ]=[uˈSim Heiˈ]
data=np.random.randint(1,11,5)
#在区间[1,11)中产生5个随机整数
plt.pie(data,explode=[0,0,0.3,0,0])
#explode的第三个参数为0.3,意味着对应饼块被拖出饼
plt.show( )
程序:男女成绩直方图
上述代码在区间[1,11)中产生5个随机整数,然后调用pie函数画图,参数explode用于决定每块饼放置情况。当它的某个元素不为0时,意味着对应的饼块从饼图中分离出来。如程序中第三个参数为0.3,使得图中的第3饼块离开了整个饼图。程序的运行结果如图8.2.9。
9.柱状图
使用bar函数完成柱状图的制作。简单的代码如下:
图8.2.9 饼图
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams[ˈfont.sans-serifˈ]=[ˈSim Heiˈ] #提供汉字支持
plt.bar((0,1),(173,69),width=0.2,align=ˈcenterˈ)
plt.ylabel(ˈ人数ˈ)
plt.xlabel(ˈ课程ˈ)
plt.xticks((0,1),("C","Python"))
plt.show( )
上述代码中,bar函数中的参数,(0,1)指横坐标,位置分别为0,1,(173,69)指两个柱各自的高度,width指定柱的宽度,align则指定对齐方式。程序的执行结果如图8.2.10。
代码中有几个语句需要注意,由于Python3默认状态下不支持汉字,所以使用语句
图8.2.10 简单柱状图,并支持汉字显示
mpl.rcParams[ˈfont.sans-serifˈ]=[ˈSim Heiˈ]
增加它对汉字的支持。
下面例子考虑3个班级的男女生的高等数学、普通物理、大学计算机三门课程的平均成绩及标准偏差。制图方案中要求在图中直方图上显示均值,方差显示在其上方。制图程序如下:
程序的运行结果如图8.2.11所示。
图8.2.11 均值加方差显示的柱状图
10.子窗口画图
matplotlib支持在同一个图形中包含多个子窗口,在每个子窗口完成图形的不同部分,这个任务使用subplot函数实现。
subplot函数有三个整数参数,前两个指定子图的行、列,后面一个参数指定第几个子图。例如subplot(1,2,1)指定图形中有两个子图(1行2列),它们处于第一行上。最后一个参数1通知maplotlib,这是第一个子图,其后续的plot制图语句所制作的图形,在当前子窗口中进行。
下面代码在同一行的两个子图上完成制图。
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,5,10)
y=x**2
plt.subplot(1,2,1) #第一个子图
plt.plot(x,y,ˈr--ˈ)
plt.subplot(1,2,2) #第二个子图
plt.plot(y,x,ˈg*-ˈ)
plt.show( )
程序运行的结果所图8.2.12(a)所示。将上述代码的两个subplot换成如下代码,制图如8.2.12(b)所示。
plt.subplot(2,1,1) #两个处于同一列的子图,第一个子图
plt.plot(x,y,ˈr--ˈ)
plt.subplot(2,1,2) #第二个子图
plt.plot(y,x,ˈg*-ˈ)
上面代码中,plt.subplot(1,2,1)指图表中有一行二列,在第一列制图,plt.subplot(1,2,2)指在图表中第二列制图。所以,制作的图形中,两个子图形在同一行。后面代码中,plt.subplot(2,1,1)指图分2行1列,在第一行制图,plt.subplot(2,1,2)则在第二行制图,所以得到的图形,两个子图形在同一列。
图8.2.12 多子图制图
除了使用subplot函数外,也可以使用subplots函数实现多窗口制图,其过程与subplot类似。如下面代码:
该段代码运行的结果如图8.2.13所示。
图8.2.13 用sunplots制作子图
11.图形的大小、分辨率
matplotlib支持用户指定图形的分辨率、大小和长宽比例(aspect ratio)。这些功能通过subplots函数中的figsize、dpi等参数实现。如创建一个800×600像素、100 dpi分辨率的图形,可使用如下语句:
fig,axes=plt.subplots(figsize=(8,6),dpi=100)
下面代码制作大小为800×600,分辨率为100dpi的图形。
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,5,10)
y=x**2
fig,axes=plt.subplots(figsize=(8,6),dpi=100)
axes.plot(x,y,ˈrˈ)
axes.set_xlabel(ˈxˈ)
axes.set_ylabel(ˈyˈ)
axes.set_title(ˈtitleˈ)
plt.show( )
该段代码的运行结果如图8.2.14所示。
图8.2.14 用户指定分辨率制图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。