目录
- 前言
- 1 matplotlib 开发环境搭建
- 2 绘制基础
- 2.1 绘制直线
- 2.2 绘制折线
- 2.3 设置标签文字和线条粗细
- 2.4 绘制一元二次方程的曲线 y=x^2
- 2.5 绘制正弦曲线和余弦曲线
- 3 绘制散点图
- 4 绘制柱状图
- 5 绘制饼状图
- 6 绘制直方图
- 7 绘制等高线图
- 8 绘制三维图
- 总结
本文主要介绍python 数据可视化模块 Matplotlib,并试图对其进行一个详尽的介绍。
通过阅读本文,你可以:
- 了解什么是 Matplotlib
- 掌握如何用 Matplotlib 绘制各种图形(柱状图、饼状图、直方图等)
- 掌握如何定制图形的颜色和样式
- 掌握如何用 Matplotlib 绘制三维图
前言
为了将数据变成所有人都喜欢的图形,就需要使用本文要介绍的数据可视化库Matplotlib。当然,还有很多类似的程序库。但 Matplotlib 的功能更强大,而且可以很容易与Numpy、Pandas 等程序库结合在一起使用。
Matplotlib 是一个 Python 的 2D 绘图库。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。学习 Matplotlib,可让数据可视化,更直观的真实给用户。使数据更加客观、更具有说服力。 Matplotlib 是 Python的库,又是开发中常用的库。
1 matplotlib 开发环境搭建
如果使用的是 Anaconda Python 开 发 环 境 , 那 么Matplotlib 已 经 被 集 成 进Anaconda,并不需要单独安装。
如果使用的是标准的Python 开发环境,可以使用下面的命令安装 Matplotlib,语法格式如下:
pip install matplotlib
如果要了解 Matplotlib 更详细的情况,请访问官方网站。网址如下:https://matplotlib.org。
安装完 Matplotlib 后,可以测试一下 Matplotlib 是否安装成功。进入 Python 的环境使用下面的语句导入 matplotlib.pyplot 模块。如果不出错,就说明 Matplotlib 已经安装成功了。
import matplotlib.pyplot as plt
2 绘制基础
在使用 Matplotlib 绘制图形时,其中有两个最为常用的场景。一个是画点,一个是画线。
pyplot 基本方法的使用如下。
2.1 绘制直线
在使用 Matplotlib 绘制线性图时,其中最简单的是绘制线图。在下面的实例代码中,使用 Matplotlib 绘制了一个简单的直线。具体实现过程如下:
- 导入模块 pyplot,并给它指定别名 plt,以免反复输入 pyplot。在模块 pyplot中包含很多用于生产图表的函数。
- 将绘制的直线坐标传递给函数 plot()。
- 通过函数 plt.show()打开 Matplotlib 查看器,显示绘制的图形。
【示例 1】使用 matplotlib 根据两点绘制一条线
import matplotlib.pyplot as plt | |
#将(,1)点和(2,4)连起来 | |
plt.plot([,2],[1,4]) | |
plt.show() |
2.2 绘制折线
在上述的实例代码中,使用两个坐标绘制一条直线,接下来使用平方数序列 1、4、9、16 和 25 来绘制一个折线图。
【示例 2】使用 matplotlib 绘制折线图
import matplotlib.pyplot as plt | |
x=[,2,3,4,5] | |
squares=[,4,9,16,25] | |
plt.plot(x,squares) | |
plt.show() |
2.3 设置标签文字和线条粗细
在上面的实例直线结果不够完美,开发者可以绘制的线条样式进行灵活设置。例如:可以设置线条的粗细、设置文字等。
【示例 3】使用 matplotlib 绘制折线图并设置样
import matplotlib.pyplot as plt | |
datas=[,2,3,4,5] | |
squares=[,4,9,16,25] | |
plt.plot(datas,squares,linewidth=) | |
#设置线条宽度#设置图标标题,并在坐标轴上添加标签plt.title('Numbers',fontsize=) | |
plt.xlabel('datas',fontsize=) | |
plt.ylabel('squares',fontsize=) | |
plt.show() |
Matplotlib 默认情况不支持中文,可以使用以下简单的方法来解决:
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
【示例 4】解决标签、标题中的中文问题
import matplotlib.pyplot as plt | |
datas=[,2,3,4,5] | |
squares=[,4,9,16,25] | |
plt.plot(datas,squares,linewidth=) | |
#设置线条宽度#设置中文乱码问题 | |
plt.rcParams['font.sans-serif'] = ['SimHei'] | |
#设置图标标题,并在坐标轴上添加标签 | |
plt.title('标题设置',fontsize=) | |
plt.xlabel('x 轴',fontsize=) | |
plt.ylabel('y 轴',fontsize=) | |
plt.show() |
2.4 绘制一元二次方程的曲线 y=x^2
Matplotlib 有很多函数用于绘制各种图形,其中 plot 函数用于曲线,需要将 200 个点的x 坐标和 Y 坐标分别以序列的形式传入 plot 函数,然后调用 show 函数显示绘制的图形。一元二次方程的曲线。
【示例 5】使用 matplotlib 绘制一元二次方程曲线
import matplotlib.pyplot as plt | |
# 个点的 x 坐标 | |
x=range(-,100) | |
#生成 y 点的坐标 | |
y=[i** for i in x ] | |
#绘制一元二次曲线 | |
plt.plot(x,y) | |
#调用 savefig 将一元二次曲线保存为 result.jpg | |
#plt.savefig('result.jpg') #如果直接写成 plt.savefig('cos') 会生成 cos.png | |
plt.show() |
2.5 绘制正弦曲线和余弦曲线
使用 plt 函数绘制任何曲线的第一步都是生成若干个坐标点(x,y),理论上坐标点是越多越好。本例取 0 到 10 之间 100 个等差数作为 x 的坐标,然后将这 100 个 x 坐标值一起传入 Numpy 的 sin 和 cos 函数,就会得到 100 个 y 坐标值,最后就可以使用 plot 函数绘制正弦曲线和余弦曲线。
【示例 6】使用 matplotlib 绘制正弦曲线和余弦曲线
import matplotlib.pyplot as plt | |
import numpy as np | |
#生成 x 的坐标(-10 的 100 个等差数列) | |
x=np.linspace(,10,100) | |
sin_y=np.sin(x) | |
#绘制正弦曲线 | |
plt.plot(x,sin_y) | |
#绘制余弦曲线 | |
cos_y=np.cos(x) | |
plt.plot(x,cos_y) | |
plt.show() |
上面的示例可以看到,调用两次 plot 函数,会将 sin 和 cos 曲线绘制到同一个二维坐标系中,如果想绘制到两张画布中,可以调用 subplot()函数将画布分区。
import matplotlib.pyplot as plt | |
import numpy as np | |
#将画布分为区域,将图画到画布的指定区域 | |
x=np.linspace(,10,100) | |
#将画布分为 行 2 列,将图画到画布的 1 区域 | |
plt.subplot(,2,1) | |
plt.plot(x,np.sin(x)) | |
plt.subplot(,2,3) | |
plt.plot(x,np.cos(x)) | |
plt.show() |
3 绘制散点图
使用 scatter 函数可以绘制随机点,该函数需要接收 x坐标和 y 坐标的序列。
【示例 8】使用 matplotlib 绘制 sin()函数的散点图
import matplotlib.pyplot as plt | |
import numpy as np | |
#画散点图 | |
x=np.linspace(,10,100) | |
#生成 到 10 中 100 个等差数 | |
plt.scatter(x,np.sin(x)) | |
plt.show() |
【示例 9】绘制 10 种大小 100 种颜色的散点图
import matplotlib.pyplot as plt | |
import numpy as np | |
# 画 种大小, 100 种颜色的散点图 | |
np.random.seed() | |
x=np.random.rand() | |
y=np.random.rand() | |
colors=np.random.rand() | |
size=np.random.rand()*1000 | |
plt.scatter(x,y,c=colors,s=size,alpha=.7) | |
plt.show() |
作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。 可以使用如表 2-2 格式化字符。
颜色的缩写如下:
【示例 10】绘制不同种类不同颜色的线
import matplotlib.pyplot as plt | |
import numpy as np | |
#不同种类不同颜色的线 | |
x=np.linspace(,10,100) | |
plt.plot(x,x+,'-g') #实线 绿色 | |
plt.plot(x,x+,'--c') #虚线 浅蓝色 | |
plt.plot(x,x+,'-.k') #点划线 黑色 | |
plt.plot(x,x+,'-r') #实线 红色 | |
plt.plot(x,x+,'o') #点 默认是蓝色 | |
plt.plot(x,x+,'x') #叉叉 默认是蓝色 | |
plt.plot(x,x+,'d') #砖石 红色 | |
plt.show() |
【示例 11】添加图例
#不同种类不同颜色的线并添加图例 | |
x=np.linspace(,10,100) | |
plt.plot(x,x+,'-g',label='-g') #实线 绿色 | |
plt.plot(x,x+,'--c',label='--c') #虚线 浅蓝色 | |
plt.plot(x,x+,'-.k',label='-.k') #点划线 黑色 | |
plt.plot(x,x+,'-r',label='-r') #实线 红色 | |
plt.plot(x,x+,'o',label='o') #点 默认是蓝色 | |
plt.plot(x,x+,'x',label='x') #叉叉 默认是蓝色 | |
plt.plot(x,x+,'dr',label='dr') #砖石 红色 | |
#添加图例右下角 lower right 左上角 upper left 边框 透明度 阴影 边框宽度 | |
plt.legend(loc='lower right',fancybox=True,framealpha=,shadow=True,borderpad=1) | |
plt.show() |
4 绘制柱状图
使用 bar 函数可以绘制柱状图。柱状图需要水平的x 坐标值,以及每一个 x 坐标值对应的 y 坐标值,从而形成柱状的图。柱状图主要用来纵向对比和横向对比的。例如,根据年份对销售收据进行纵向对比,x 坐标值就表示年份,y 坐标值表示销售数据。
【示例 12】使用 bar()绘制柱状图,并设置柱的宽度
import matplotlib.pyplot as plt | |
import numpy as np | |
x=[,1985,1990,1995] | |
x_labels=[' 年','1985 年','1990 年','1995 年'] | |
y=[,3000,4000,5000] | |
plt.bar(x,y,width=) | |
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 | |
plt.xticks(x,x_labels) | |
plt.xlabel('年份') | |
plt.ylabel('销量') | |
plt.title('根据年份销量对比图') | |
plt.show() |
需要注意的是 bar 函数的宽度并不是像素宽度。bar 函数会根据二维坐标系的尺寸,以及 x 坐标值的多少,自动确定每一个柱的宽度,而 width 指定的宽度就是这个标准柱宽度的倍数。该参数值可以是浮点数,如 0.5,表示柱的宽度是标准宽度的 0.5 倍。
【示例 13】使用 bar()和 barh()函数绘制柱状图
import matplotlib.pyplot as plt | |
import numpy as np | |
np.random.seed() | |
x=np.arange() | |
y=np.random.randint(-,5,5) | |
print(x,y) | |
# 将画布分隔成一行两列 | |
plt.subplot(,2,1) | |
#在第一列中画图 | |
v_bar=plt.bar(x,y) | |
#在第一列的画布中 位置画一条蓝线 | |
plt.axhline(,color='blue',linewidth=2) | |
plt.subplot(,2,2) | |
#barh 将 y 和 x 轴对换 竖着方向为 x 轴 | |
h_bar=plt.barh(x,y,color='red') | |
#在第二列的画布中 位置处画蓝色的线 | |
plt.axvline(,color='red',linewidth=2) | |
plt.show() |
【示例 14】对柱状图的部分柱状设置颜色
import matplotlib.pyplot as plt | |
import numpy as np | |
np.random.seed() | |
x=np.arange() | |
y=np.random.randint(-,5,5) | |
v_bar=plt.bar(x,y,color='lightblue') | |
for bar,height in zip(v_bar,y): | |
if height<: | |
bar.set(edgecolor='darkred',color='lightgreen',linewidth=) | |
plt.show() |
【示例 15】使用 bar()绘制三天中三部电影的票房变化
import matplotlib.pyplot as plt | |
import numpy as np | |
#三天中三部电影的票房变化 | |
real_names=['千与千寻','玩具总动员','黑衣人:全球追缉'] | |
real_num=[5453,7548,6543] | |
real_num=[1840,4013,3421] | |
real_num=[1080,1673,2342] | |
#生成 x 第 天 第 2 天 第 3 天 | |
x=np.arange(len(real_names)) | |
x_label=['第{}天'.format(i+) for i in range(len(real_names))] | |
#绘制柱状图#设置柱的宽度 | |
width=.3 | |
plt.bar(x,real_num,color='g',width=width,label=real_names[0]) | |
plt.bar([i+width for i in x],real_num,color='b',width=width,label=real_names[1]) | |
plt.bar([i+*width for i in x],real_num3,color='r',width=width,label=real_names[2]) | |
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 | |
#修改 x 坐标 | |
plt.xticks([i+width for i in x],x_label) | |
#添加图例plt.legend() #添加标题 | |
plt.title(' 天的票房数') | |
plt.show() |
5 绘制饼状图
pie 函数可以绘制饼状图,饼图主要是用来呈现比例的。只要传入比例数据即可。
【示例 16】绘制饼状图
#导入模块 | |
import matplotlib.pyplot as plt | |
import numpy as np | |
#准备男、女的人数及比例 | |
man= | |
woman= | |
man_perc=man/(woman+man) | |
woman_perc=woman/(woman+man) #添加名称 | |
labels=['男','女'] #添加颜色 | |
colors=['blue','red'] #绘制饼状图 pie | |
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 | |
# labels 名称 colors:颜色,explode=分裂 autopct 显示百分比 | |
paches,texts,autotexts=plt.pie([man_perc,woman_perc],labels=labels,colors=colors,explode=(,0.05),autopct='%0.1f%%') | |
#设置饼状图中的字体颜色 | |
for text in autotexts: | |
text.set_color('white') | |
#设置字体大小 | |
for text in texts+autotexts: | |
text.set_fontsize() | |
plt.show() |
6 绘制直方图
直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义却有很大的差异。直方图
是用来观察分布状态的,而柱状图是用来看每一个 X 坐标对应的 Y 的值的。也就是说,直方图关注的是分布,并不关心具体的某个值,而柱状图关心的是具体的某个值。使用 hist函数绘制直方图。
【示例 17】绘制直方图
import numpy as np | |
import matplotlib.pyplot as plt | |
#频次直方图,均匀分布 | |
#正太分布 | |
x=np.random.randn() | |
#画正太分布图 | |
# plt.hist(x) | |
plt.hist(x,bins=) #装箱的操作,将 10 个柱装到一起及修改柱的宽度 | |
plt.show() |
【示例 18】同一画布绘制三个直方图
import numpy as np | |
import matplotlib.pyplot as plt | |
#几个直方图画到一个画布中,第一个参数期望 第二个均值 | |
x=np.random.normal(0,0.8,1000) | |
x=np.random.normal(-2,1,1000) | |
x=np.random.normal(3,2,1000) | |
#参数分别是 bins:装箱,alpha:透明度 | |
kwargs=dict(bins=,alpha=0.4) | |
plt.hist(x,**kwargs) | |
plt.hist(x,**kwargs) | |
plt.hist(x,**kwargs) | |
plt.show() |
7 绘制等高线图
【 示例 19 】使用matplotlib 绘制等高线图
#导入模块 | |
import matplotlib.pyplot as plt | |
import numpy as np | |
x=np.linspace(-,10,100) | |
y=np.linspace(-,10,100) | |
#计算 x 和 y 的相交点 a | |
X,Y=np.meshgrid(x,y) | |
# 计算 Z 的坐标 | |
Z=np.sqrt(X**+Y**2) | |
plt.contourf(X,Y,Z) | |
plt.contour(X,Y,Z) | |
# 颜色越深表示值越小,中间的黑色表示 z=. | |
plt.show() |
8 绘制三维图
使用 pyplot 包和 Matplotlib 绘制三维图。
【示例 20】使用 Matplotlib 绘制三维图
import matplotlib.pyplot as plt | |
#导入D 包 | |
from mpl_toolkits.mplotd import Axes3D | |
#创建 X、Y、Z 坐标 | |
X=[,1,2,2] | |
Y=[,4,4,3] | |
Z=[,100,1,1] | |
fig = plt.figure() | |
# 创建了一个 AxesD 的子图放到 figure 画布里面 | |
ax = AxesD(fig) | |
ax.plot_trisurf(X, Y, Z) | |
plt.show() |