(接上文)
九、Matplotlib数据可视化
数据可视化旨在将数据呈现为更直接的表示形式,例如散点图,密度图,条形图等。通过可视化数据,可以检测到潜在的异常值。在 Python 中,可以使用各种模块或库来可视化数据。Matplotlib 是主流模块之一。可以使用Matplotlib 以各种绘图样式来可视化数据。但是,Matplotlib 无法显示动态图。如果要创建一个巨大的动态图,则可以从 plotly 中使用 Dash 。
Matplotlib 是⼀个 Python 的 2D 绘图库,它交互式环境⽣成出版质量级别的图形。通过 Matplotlib这个标准类库,开发者只需要⼏⾏代码就可以实现⽣成绘图,折线图、散点图、柱状图、饼图、直⽅图、组合图等数据分析可视化图表。
安装:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
可以通过下面的代码检查所安装的版本号:
pip show matplotlib
更新 Matplotlib 的版本可以使用下面的代码:
pip install matplotlib --upgrade
官方介绍:
https://matplotlib.org/api/index.html
下面用jupyter notebook演示操作详解:
1 基础知识
1.1 图形绘制
import numpy as np
import matplotlib.pyplot as plt # 画图的画笔
In [17]:
x = np.linspace(start=0,stop=2*np.pi,num=100) # x轴
y = np.sin(x) # y 轴
# 图形尺寸
plt.figure(figsize=(9,6))
# 绘制线形图
plt.plot(x,y)
# 设置网格线
plt.grid(linestyle='--', # 网格线样式,样式有['-', '--', '-.', ':']
color='skyblue', # 颜色
alpha=0.5) # 透明度
# 设置坐标轴范围
plt.axis([-1,10,-1.5,1.5]) # xmin, xmax, ymin, ymax = axis()
In [18]:
plt.plot(x,y,'ro') # 使用红色圆圈标记绘制x和y
# 设置坐标轴范围
plt.xlim([-1,10])
plt.ylim([-1.5,1.5])
In [20]:
# 绘制散点图
plt.scatter(x,y,color='green')
1.2 坐标轴刻度、标签、标题
In [56]:
plt.plot(x,y)
# 1、设置x、y轴刻度
plt.yticks(ticks=[-1,0,1])
plt.xticks(np.arange(0,7,np.pi/2))
In [67]:
plt.plot(x,y)
# 2、设置x和y轴刻度标签,格式,用_= 接收是为了输出时只输出图
_ = plt.yticks(ticks=[-1,0,1],labels=['min',0,'max'],fontsize=8)
_ = plt.xticks(ticks=[0,np.pi/2,np.pi,np.pi*3/2,2*np.pi],
labels=[0,r'$frac{pi}{2}$', '$pi$', '$frac{3pi}{2}$', r'$2*pi$'],
# frac{分子}{分母},加r表示是一个正则表达式,不加r避免理解为转义,需要两个
fontsize=10,
color='red')
# 3、设置y坐标轴标题
_ = plt.ylabel('y=sinx')
In [73]:
plt.plot(x,y)
# 2、设置x和y轴刻度标签,格式,用 _= 接收是为了输出时只输出图
_ = plt.yticks(ticks=[-1,0,1],labels=['min',0,'max'],fontsize=8)
_ = plt.xticks(ticks=[0,np.pi/2,np.pi,np.pi*3/2,2*np.pi],
labels=[0,r'$frac{pi}{2}$', '$pi$', '$frac{3pi}{2}$', r'$2*pi$'],
# frac{分子}{分母},加r表示是一个正则表达式,不加r避免理解为转义,需要两个
fontsize=10,
color='red')
# 4、设置y坐标轴标题和格式
_ = plt.ylabel('y=sinx',
rotation=0, # 旋转的角度
fontsize=15,
ha='right') # 水平对齐的方向
# 5、设置图标题
_ = plt.title(label='正弦波',fontsize=12,color='red') # 中文名会出现乱码
In [79]:
# 获取电脑上的字体库
from matplotlib.font_manager import FontManager
fm = FontManager()
In [80]:
fm.ttflist # 查看所有的字体
In [81]:
[font.name for font in fm.ttflist] # 获取所有的字体名
In [82]:
plt.plot(x,y)
# 2、设置x和y轴刻度标签,格式,用 _= 接收是为了输出时只输出图
_ = plt.yticks(ticks=[-1,0,1],labels=['min',0,'max'],fontsize=8)
_ = plt.xticks(ticks=[0,np.pi/2,np.pi,np.pi*3/2,2*np.pi],
labels=[0,r'$frac{pi}{2}$', '$pi$', '$frac{3pi}{2}$', r'$2*pi$'],
# frac{分子}{分母},加r表示是一个正则表达式,不加r避免理解为转义,需要两个
fontsize=10,
color='red')
# 4、设置y坐标轴标题和格式
_ = plt.ylabel('y=sinx',
rotation=0, # 旋转的角度
fontsize=15,
ha='right') # 水平对齐的方向
# 6、设置图标题,解决中文乱码的问题,设置fontfamily或family
_ = plt.title(label='正弦波',fontsize=12,color='red',fontfamily='Kaiti') # 解决中文乱码问题
In [88]:
# 解决中文乱码问题,也可以用下面方法:每次编写代码时进行参数设置:
#coding:utf-8
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.plot(x,y)
# 2、设置x和y轴刻度标签,格式,用 _= 接收是为了输出时只输出图
_ = plt.yticks(ticks=[-1,0,1],labels=['min',0,'max'],fontsize=8)
_ = plt.xticks(ticks=[0,np.pi/2,np.pi,np.pi*3/2,2*np.pi],
labels=[0,r'$frac{pi}{2}$', '$pi$', '$frac{3pi}{2}$', r'$2*pi$'],
# frac{分子}{分母},加r表示是一个正则表达式,不加r避免理解为转义,需要两个
fontsize=10,
color='red')
# 4、设置y坐标轴标题和格式
_ = plt.ylabel('y=sinx',
rotation=0, # 旋转的角度
fontsize=15,
ha='right') # 水平对齐的方向
# 5、设置图标题
_ = plt.title(label=u'正弦波',fontsize=12,color='red') # 有中文出现的情况,需要u'内容'
1.3 图例
bbox_to_anchor的位置参考:
In [7]:
x = np.arange(start=0,stop=2*np.pi,step=np.pi/50)
# 绘制图形
plt.plot(x,np.sin(x),color='orange')
plt.plot(x,np.cos(x),color='pink')
# 1、添加图例
plt.legend(['Sin','Cos'])
In [54]:
x = np.arange(start=0,stop=2*np.pi,step=np.pi/50)
plt.plot(x,np.sin(x),color='orange')
plt.plot(x,np.cos(x),color='pink')
# 2、添加图例,设置格式
_ = plt.legend(['Sin','Cos'],fontsize=14,
loc='upper right', # 图例在边界里面的位置
ncol=2) # 图例的列数
In [56]:
x = np.arange(start=0,stop=2*np.pi,step=np.pi/50)
plt.plot(x,np.sin(x),color='orange')
plt.plot(x,np.cos(x),color='pink')
# 3、添加图例,设置格式
x = 1 # 图例边框着陆点的横坐标
y = 0.5 # 图例边框着陆点的纵坐标
width = 0.5 # 相对图的宽度
height = 0.6 # 相对图的高度
_ = plt.legend(['Sin','Cos'],fontsize=14,
loc='upper right', # 这里loc指示了anchor的着陆点是右上角
ncol=2, # 图例的列数
bbox_to_anchor=(x,y,width,height)) # 图例相对位置
1.4 脊柱移动
In [58]:
x = np.linspace(start=-np.pi,stop=np.pi,num=50)
# 绘制图形
_ = plt.plot(x,np.sin(x),x,np.cos(x))
In [67]:
x = np.linspace(start=-np.pi,stop=np.pi,num=50)
# 绘制图形
_ = plt.plot(x,np.sin(x),x,np.cos(x))
# 1、get current axes获取子视图,轴面, (axes轴)
axes = plt.gca()
# 2、设置右边和上⾯脊柱消失
axes.spines['top'].set_color('white') # spines脊柱
axes.spines['right'].set_color('white')
# 3、设置下⾯和左边脊柱位置,data表示数据
axes.spines['left'].set_position(('data',0))
axes.spines['bottom'].set_position(('data',0))
# 设置轴刻度
plt.yticks([-1,1])
_ = plt.xticks(ticks=[-np.pi,-np.pi/2,0,np.pi/2,np.pi],
labels=[r'$-pi$',r'$-frac{pi}{2}$',0,r'$frac{pi}{2}$',r'$pi$'],
fontsize = 12,
color = 'red')
1.5 图片保存
保存的图片:
In [83]:
plt.figure(figsize=(9,6),linewidth=4) # 创建了一个figure图片,设置线宽
x = np.linspace(start=-np.pi,stop=np.pi,num=50)
plt.plot(x,np.sin(x),x,np.cos(x)) # 在轴面中进行图的绘制
plt.legend(['sin','cos'],loc='lower center',fontsize=15,
ncol=2,bbox_to_anchor=[1,0.5,0.5,0.6]) # 图例
axes = plt.gca()
# 1、设置视图背景颜⾊
axes.set_facecolor('lightblue') # 轴面,被figure包围着
# 2、保存图片
plt.savefig('./image.png', # ⽂件名:png、jpg、pdf
dpi = 100, # 保存图⽚像素密度,越大图片越清楚
facecolor = 'violet', # 视图与边界之间颜⾊设置
edgecolor = 'lightgreen', # 视图边界颜⾊设置
bbox_inches = 'tight') # 设置紧凑显示,保存图⽚完整
In [84]:
plt.figure(figsize=(9,6),linewidth=4) # 创建了一个figure图片,设置线宽
x = np.linspace(start=-np.pi,stop=np.pi,num=50)
plt.plot(x,np.sin(x),x,np.cos(x)) # 在轴面中进行图的绘制
plt.legend(['sin','cos'],loc='lower center',fontsize=15,
ncol=2,bbox_to_anchor=[1,0.5,0.5,0.6]) # 图例
axes = plt.gca()
# 1、设置视图背景颜⾊
axes.set_facecolor('lightblue') # 轴面,被figure包围着
# 2、保存图片,⾃动调整布局空间
plt.tight_layout() # ⾃动调整布局空间,就不会出现图⽚保存不完整
plt.savefig('./image2.png', # ⽂件名:png、jpg、pdf
dpi = 100, # 保存图⽚像素密度,越大图片越清楚
facecolor = 'violet', # 视图与边界之间颜⾊设置
edgecolor = 'lightgreen') # 视图边界颜⾊设置
2 风格和样式
2.1 颜⾊、线形、点形、线宽、透明度
In [114]:
x = np.linspace(0,2*np.pi,20)
y1 = np.sin(x)
y2 = np.cos(x)
# 1、设置颜⾊,线型,点型
plt.plot(x,y1,color='red',linestyle='--',alpha=0.7,marker='o')
plt.plot(x,y2,color='orange',ls=':',marker='x') # ls是linestyle的缩写,marker标记
plt.plot(x,y1+y2,color='blue',ls='-',marker='d')
plt.plot(x,y1-2*y2,color= '#FF00EE',ls='-',marker='1') # 颜色可以是RGB
plt.plot(x,2*y1+y2,
color=(0.2,0.4,0.6), # 颜色是红绿蓝,三原色
ls='-.',linewidth=6, # 线型和线宽
marker='3',markersize=10) # marker标记和大小
_ = plt.plot(x,2*y1 - y2,'ko--') # 参数连⽤,黑色,标记为圆点的--线型
Out[114]:
2.2 更多属性设置
In [120]:
x = np.linspace(0,5,50)
def f(x):
return np.exp(-x) * np.cos(2*np.pi*x)
y= f(x)
plt.figure(figsize=(9,6))
plt.xticks(size = 18) # 设置刻度字体⼤⼩
plt.yticks(fontsize = 18) # 设置刻度字体⼤⼩
_=plt.plot(x,y,color = 'blue',
marker = 'o',
ls = '--',
lw = 2, # 线宽
alpha = 0.6,
markerfacecolor = 'red',# 点颜⾊
markersize = 10, # 点⼤⼩
markeredgecolor = 'green',#点边缘颜⾊
markeredgewidth = 3)#点边缘宽度
3 多图布局
3.1 子视图
In [149]:
plt.figure(figsize=(9,6))
x = np.linspace(0,2*np.pi,20)
y = np.sin(x)
# 1、子视图1
axes = plt.subplot(2,2,1) # 子视图,轴面,两⾏两列第⼀个⼦视图
axes.plot(x,y,color = 'red')
axes.set_facecolor('lightgreen') # 设置子视图背景,调⽤⼦视图设置⽅法设置⼦视图整体属性
# 2、子视图2
axes = plt.subplot(222) # 可以连起来写,轴面,两⾏两列第二个⼦视图
# 第一种方法设置线的格式
axes.plot(x,y,'bo--')
# 第二种方法设置线的格式
line,= axes.plot(x,2*y) # 调用plot返回绘制对象,一条线
line.set_color('orange') # 调⽤对象设置⽅法,设置属性
line.set_lw(3)
line.set_marker('d')
line.set_markerfacecolor('green')
line.set_markeredgecolor('red')
line.set_markersize(10)
In [150]:
plt.figure(figsize=(9,6))
x = np.linspace(0,2*np.pi,20)
y = np.sin(x)
# 1、子视图1
axes = plt.subplot(2,2,1) # 子视图,轴面,两⾏两列第⼀个⼦视图
axes.plot(x,y,color = 'red')
axes.set_facecolor('lightgreen') # 设置子视图背景,调⽤⼦视图设置⽅法设置⼦视图整体属性
# 2、子视图2
axes = plt.subplot(222) # 可以连起来写,轴面,两⾏两列第二个⼦视图
# 第一种方法设置线的格式
axes.plot(x,y,'bo--')
# 第二种方法设置线的格式
line,= axes.plot(x,2*y) # 调用plot返回绘制对象,一条线
line.set_color('orange') # 调⽤对象设置⽅法,设置属性
line.set_lw(3)
line.set_marker('d')
line.set_markerfacecolor('green')
line.set_markeredgecolor('red')
line.set_markersize(10)
# 3、子视图
axes = plt.subplot(2,1,2) # 两⾏一列第二行⼦视图,就是已经画好的子视图下面的区域
axes.plot(x,y)
# 也可以用plt.plot方法绘制
plt.sca(axes) # 设置当前视图
x = np.linspace(-np.pi,np.pi,200)
plt.plot(x,np.sin(x*x),color = 'red') # 默认持有最近的这个子视图,所以调用plot方法绘制图形就是向最近这个子视图(轴面)绘制
Out[150]:
[<matplotlib.lines.Line2D at 0x1c012252a30>]
3.2 嵌套
In [172]:
fig = plt.figure(figsize=(9,6))
x = np.linspace(0,2*np.pi,200)
y = np.sin(x)
plt.plot(x,y)
# 1、嵌套⽅式⼀,axes轴域(横纵坐标范围),⼦视图
# left,bottom坐标位置,范围0~1,0表示左下角,1表示右上角
# width,height宽度和高度
axes = plt.axes([0.6,0.6,0.2,0.2]) # 轴面 ,参数: [left, bottom, width, height]
axes.plot(x,y,color='green')
# 2、 嵌套⽅式⼆
ax = fig.add_axes([0.2,0.2,0.2,0.2]) # 使⽤视图对象添加⼦视图
ax.plot(x,y,'ro--')
Out[172]:
[<matplotlib.lines.Line2D at 0x1c00f75b310>]
3.3 多图布局分格显示
3.3.1 均匀布局
In [185]:
x = np.linspace(0,2*np.pi,200)
# 1、创建一个figure图片,返回子视图
fig,((axes11,axes12,axes13),(axes21,axes22,axes23),(axes31,axes32,axes33)) = plt.subplots(3,3)
# 2、设置figure尺寸
fig.set_size_inches(12,9)
axes11.plot(x,np.sin(x))
axes12.plot(x,np.cos(x))
axes13.plot(x,np.tanh(x))
axes21.plot(x,np.tan(x))
axes22.plot(x,np.sin(x*x))
axes23.plot(x,np.cos(x*x))
axes31.plot(x,np.sin(x) + np.cos(x))
axes32.plot(x,np.sin(x*x) + np.cos(x*x))
axes33.plot(x,np.sin(x)*np.cos(x))
# 也可通过plt.subplot() ⼀个个添加⼦视图
Out[185]:
[<matplotlib.lines.Line2D at 0x1c0147cc970>]
In [188]:
x = np.linspace(0,2*np.pi,200)
# 1、创建一个figure图片,返回子视图
fig,((axes11,axes12,axes13),(axes21,axes22,axes23),(axes31,axes32,axes33)) = plt.subplots(3,3)
# 2、设置figure尺寸,第二种方法
fig.set_figwidth(12)
fig.set_figheight(9)
axes11.plot(x,np.sin(x))
axes12.plot(x,np.cos(x))
axes13.plot(x,np.tanh(x))
axes21.plot(x,np.tan(x))
axes22.plot(x,np.sin(x*x))
axes23.plot(x,np.cos(x*x))
axes31.plot(x,np.sin(x) + np.cos(x))
axes32.plot(x,np.sin(x*x) + np.cos(x*x))
axes33.plot(x,np.sin(x)*np.cos(x)) # 也可通过plt.subplot() ⼀个个添加⼦视图
# 3、紧凑显示,边框会⽐较⼩
plt.tight_layout()
plt.show()
(未完待续)