赞
踩
说起数据分析,你的眼前有没有浮现出直方图、散点图、曲线图…各种图表?
Python作为一门编程语言,如何能作图呢?
办法当然是有的,而且我们已经接触过了。在上一章节中画散点图的时候就导入过,它就是Matplotlib。
Matplotlib是Python的绘图库,具有丰富的绘图功能,是数据可视化的好帮手!
下面就看看如何用Matplotlib画图。
一、基本设置
打开Jupyter Noteboook,输入下列代码:
import matplotlib.pyplot as plt
#让图像在Jupyter Notebook中显示
%matplotlib inline
#显示的图片格式,此处为mac中的高清格式,也可以设置为“bmp”等格式
%config InlineBackend.figure_format = "retina"
#设置字体为中文,这里调用Windows系统的字体文件
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = r"C:\windows\fonts\simsun.ttc", size=14)
上面的代码中有3个重要部分:
1.为了在Jupyter Noteboook中显示图像,需要使用%matplotlib inline命令;
2.图片格式选择,高清的图片更清晰;
3.Matplotlib库默认是不支持中文文本在图像中显示的,为了解决这个问题,需要提前定义中文字体,其中fname参数指定字体文件的位置,size参数指定字体的大小。
关键的基本设置就这3项,接下来就可以画图了。
二、画图
先画个正弦曲线,内容如下:
import matplotlib.pyplot as plt
#让图像在Jupyter Notebook中显示
%matplotlib inline
#显示的图片格式,此处为mac中的高清格式,也可以设置为“bmp”等格式
%config InlineBackend.figure_format = "retina"
#设置字体为中文,这里调用Windows系统的字体文件
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = r"C:\windows\fonts\simsun.ttc", size=14)
import numpy as np
X = np.linspace(1,15)
Y = np.sin(X)
plt.figure(figsize=(6,4))
plt.plot(X, Y, "r-o") #表示绘制红色、圆圈
plt.xlabel("X")
plt.ylabel("Y")
plt.title("y=sin(x)")
plt.grid("on")
plt.show()
上面的代码中,plt.figure()定义了一个指定大小的图像窗口,plt.plot()绘制对应坐标为X、Y的连线图,第三个参数"r-o"表示绘制红色曲线点图,plt.xlabel()定义X轴名称,plt.ylabel()定义Y轴名称,plt.title()定义图像名称,plt.grid("on")表示打开背景网格,最后使用plt.show()就能查看图像。
运行后,可以看到下图所示的曲线图:
那有时候我们的相似图表需要放在一起比较怎么办呢?
很简单,把它们绘制在一个图中就可以,plt.subplot()方法支持绘制多个图像窗口。输入下列代码:
import matplotlib.pyplot as plt
#让图像在Jupyter Notebook中显示
%matplotlib inline
#显示的图片格式,此处为mac中的高清格式,也可以设置为“bmp”等格式
%config InlineBackend.figure_format = "retina"
#设置字体为中文,这里调用Windows系统的字体文件
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = r"C:\windows\fonts\simsun.ttc", size=14)
import numpy as np
X = np.linspace(1,15)
Y = np.sin(X)
xtick = [0,5,10,15]
xticklabel = [str(x)+"在这"for x in xtick]
plt.figure(figsize=(10,8))
plt.subplot(2,2,1)
plt.plot(X, Y, "b-.s") #表示绘制蓝色、虚线、矩形点
plt.xlabel(r"$\alpha$") #使用LaTeX公式
plt.ylabel(r"$\beta$")
plt.title("$y = \sum sin(x)$")
plt.subplot(2,2,2)
plt.hist(Y, 20) #直方图
plt.text(0,7,"直方图",fontproperties = fonts)
plt.xlabel("频数",fontproperties = fonts)
plt.ylabel("取值",fontproperties = fonts)
plt.title("直方图",fontproperties = fonts)
plt.subplot(2,1,2)
plt.step(X,Y,c="R",label="sin(x)",linewidth=3)
plt.ylabel("Y",fontproperties = fonts)
plt.title("Bar",fontproperties = fonts)
plt.legend(loc="lower right",fontsize=16) #图例在右下角
plt.xticks(xtick,xticklabel,rotation=45,fontproperties=fonts) #x坐标取值,45度倾斜
plt.subplots_adjust(hspace=0.35) #调整图像之间的水平空间距离
plt.show()
在这个例子中,分别绘制了线图、直方图和阶梯图3个子图,采用的还是不规则划分。
plt.subplot(2,2,1)表示将当前图窗分成2*2=4个区域,并在第一个区域上进行绘图;plt.subplot(2,2,2)表示在第二个区域上绘制图像;
第三个图比较特殊,占用了(2,2,3)和(2,2,4),需要对其重新划分。按照2*1划分后,前两个图占用了(2,1,1)的位置,因此第三个图占用(2,1,2)的位置。
可以看出,在Matplotlib下,一个Figure对象可以包含多个子图(Axes),可以使用plt.subplot()快速绘制,按照从左到右、从上到下的顺序对每个子图区域进行编号。
新出现的直方图函数plt.hist(Y, 20)表示将数据Y分成20份来绘制直方图,plt.text(0,7,"直方图",fontproperties = fonts)表示在坐标为(0,7)的位置添加文本标签。
函数plt.step(X,Y,c="R",label="sin(x)",linewidth=3)为绘制阶梯图,并且指定线的颜色和宽度,plt.legend(loc="lower right",fontsize=16)为添加图例,并且位置在右下角。
运行程序后可看到:
除了二维图像,Matplotlib也可以绘制三维图像。输入下列代码:
import matplotlib.pyplot as plt
#让图像在Jupyter Notebook中显示
%matplotlib inline
#显示的图片格式,此处为mac中的高清格式,也可以设置为“bmp”等格式
%config InlineBackend.figure_format = "retina"
#设置字体为中文,这里调用Windows系统的字体文件
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = r"C:\windows\fonts\simsun.ttc", size=14)
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-4, 4, num=50)
y = np.linspace(-4, 4, num=50)
X,Y = np.meshgrid(x,y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = plt.figure(figsize=(12,5))
ax1 = fig.add_subplot(121, projection='3d') #第一个子图
ax1.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5, cmap=plt.cm.coolwarm) #绘制曲面图
cset = ax1.contour(X, Y, Z, zdir="z", offset=1, cmap=plt.cm.CMRmap) #绘制等高线
ax1.set_xlabel("X")
ax1.set_xlim(-4,4) #设置绘图范围
ax1.set_ylabel("Y")
ax1.set_ylim(-4,4)
ax1.set_zlabel("Z")
ax1.set_zlim(-1,1)
ax1.set_title("surface and contour")
theta = np.linspace(-4*np.pi, 4*np.pi, 100) #第二个子图
z = np.linspace(-2, 2, 100)
r = z**2 +1
x = r*np.sin(theta)
y = r*np.cos(theta)
ax2 = plt.subplot(122, projection="3d")
ax2.plot(x,y,z) #绘制曲线
ax2.scatter3D(x,y,z,c="r") #绘制红色三维散点
ax2.view_init(elev=20, azim=25) #设置轴的方位角和高程
ax2.set_title("Curve and scatter")
plt.show
程序中,X,Y = np.meshgrid(x,y)是生成网格数据点,ax1用fig.add_subplot(121, projection='3d')指定第一个子图绘制,ax1.plot_surface()是绘制三维曲面图,ax1.contour() 指定绘制等高线图,并且制定投影在Z轴方向,位置在Z=1的平面;
ax2.scatter3D(x,y,z,c="r")表示绘制三维散点图,ax2.view_init()为设置查看图像的视角。
运行后结果如图所示
三
除了画图,Matplotlib还可以使用imshow()方法来显示图像,这里就不举例了,感兴趣的小伙伴可以移步官方文档。
关于Matplotlib库就说这么多,作为数据分析工具功能确实非常强大。下一次我们将介绍一个强大的统计分析库——Statsmodels库。
你确定不关注我一波?!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。