数据分析DAY02
matplotlib概述
matplotlib是python的一个绘图库。使用它可以很方便的绘制出版质量级别的图形。
matplotlib的基本功能
- 基本绘图
- 设置线型、线宽、颜色
- 设置坐标轴范围及刻度
- 设置坐标轴属性
- 图例
- 绘制特殊点
- 备注
- 高级图形绘制
- 绘制子图
- 刻度定位器、刻度网格线
- 半对数坐标
- 散点图
- 填充图
- 条形图、饼状图
- 等高线图
- 热成像图
- 极坐标系
- 三维曲面
- 简单动画
matplotlib基本功能详解
基本绘图
绘图核心API
绘制一条线:
import numpy as np
import matplotlib.pyplot as mp
# xarray: x坐标值数组
# yarray: y坐标值数组
mp.plot(xarray, yarray)
# 显示图像
mp.show()
绘制水平线与垂直线:
import matplotlib.pyplot as mp
# 绘制垂直线 给出x坐标值,给出y的范围即可
mp.vlines(val, ymin, ymax)
# 绘制水平线 给出y坐标值,给出x的范围即可
mp.hlines(val, xmin, xmax)
案例:绘制一条正弦曲线
# 从-π ~ π拆1000个点
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
# 绘制[-π, π]的1/2*cos(x)曲线
cosx = np.cos(x) / 2
mp.plot(x, sinx)
mp.plot(x, cosx)
mp.show()
线型、线宽、颜色
# linestyle: 线型 "-" "--" ":"
# linewidth: 线宽
# color: 颜色
# 常见颜色的英文单词 red blue green...
# 常见英文单词的首字母 r b ..
# #abcdab
# (1, 1, 1) 或 (0.8, 0.6, 1, 0.5)
# alpha: 透明度
mp.plot(x, y, linestyle='', linewidth=1, color='', alpha=0.5)
设置坐标刻度
把横坐标的刻度显示为 -π, -π/2, 0, π/2, π
# x_val_list: x轴刻度值列表
# x_text_list: x轴相应值的刻度文本列表
mp.xticks(x_val_list, x_text_list)
# y_val_list: y轴刻度值列表
# y_text_list: y轴相应值的刻度文本列表
mp.yticks(y_val_list, y_text_list)
matplotlib支持的latex排版语法
r'$a^2 + b^2 = c^2$'
r'$[a_1 + a_2 + ... + a_n]$'
r'$\frac{\pi}{2}$'
a 2 + b 2 = c 2 [ a 1 + a 2 + . . . + a n ] π 2 a^2 + b^2 = c^2 \quad \quad [a_1 + a_2 + ... + a_n] \quad\quad \frac{\pi}{2} a2+b2=c2[a1+a2+...+an]2π
设置坐标轴
# 获取当前坐标轴 'left' 'right' 'top' 'bottom'
ax = mp.gca()
# 获取其中某一个坐标轴
ax_left = ax.spines['left']
# 设置坐标轴的位置
# type: 移动坐标轴的参照类型 一般为'data' (以数据坐标轴作参照)
# val: 参照值
ax_left.set_position((type, val))
# 设置坐标轴的颜色
# color: 颜色值 若为'none',则隐藏当前坐标轴
ax_left.set_color(color)
图例
显示两条曲线的图例。
# 在plot绘制曲线时,给出label描述当前曲线的标签。
mp.plot(...., label='')
mp.legend(loc='best')
特殊点
# xarray, yarray 散点的坐标
mp.scatter(xarray, yarray,
marker='', # 点型
s=60, # 大小
edgecolor='', # 边缘色
facecolor='', # 填充色
zorder=3 # 绘制图层编号(越大越靠顶层)
)
备注
为特殊点添加备注。
mp.annotate(
r'$....$', # 备注文本
xycoords='data', # 定位目标点使用的参照坐标系
xy=(1, 2), # 目标点的坐标
textcoords='offset points', # 定位文本位置使用的坐标系
xytext=(10, -30), # 备注文本的位置坐标
fontsize=14, # 字体大小
arrowprops=dict() # 箭头的样式
)
arrowprops=dict(
arrowstyle='->', # 箭头样式
connectionstyle='angle3' # 箭头连接线的样式
)
设置坐标轴的范围
通过设置坐标轴的范围区间,可以显示图像中的一部分内容。
# 设置x轴的可视区域
mp.xlim(x_min, x_max)
# 设置y轴的可视区域
mp.ylim(y_min, y_max)
matplotlib图像窗口高级操作
绘制两个窗口:
# title:窗口的标题
# figsize: 窗口的大小
# dpi:像素密度
# facecolor:图表的背景色
mp.figure('title', figsize=(4,3), dpi=120, facecolor='')
mp.show()
mp.ffigure方法可以创建一个新的窗口,但是如果新窗口的title已经被创建过了,那么就把该title的旧窗口置为当前窗口,以后的绘图操作,都将针对当前窗口生效。
设置当前窗口的参数
mp.title('title', fontsize=16) # 设置图表标题
mp.xlabel('x', fontsize=12) # x轴的描述文本
mp.ylabel('y', fontsize=12) # y轴的描述文本
mp.tick_params(labelsize=8) # 设置刻度参数
mp.grid(linestyle=':') # 绘制网格线
mp.tight_layout() # 紧凑布局
窗口子图
矩阵式布局
绘制矩阵式布局子图的API:
mp.figure('xx', ...)
# rows: 行数
# columns: 列数
# num: 子图编号
mp.subplot(rows, columns, num)
mp.subplot(3, 3, 5) # 把3行3列的5号图设置为当前绘图区域
mp.subplot(3, 3, 1) # 把3行3列的1号图设置为当前绘图区域
mp.show()
案例:绘制九宫格
import matplotlib.pyplot as mp
mp.figure('Subplot', facecolor='lightgray')
for i in range(1, 10):
mp.subplot(3, 3, i)
# 在窗前绘图区域写文字
mp.text(0.5, 0.5, i, size=36, alpha=0.8,
ha='center', va='center')
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()
网格式布局
网格式布局支持单元格的合并。
绘制网格式子图相关API:
import matplotlib.gridspec as mg
mp.figure(..)
# 创建GridSpec对象,(3行3列)
gs = mg.GridSpec(3, 3)
# 把GridSpec中第一行的前两列合并为一个子图
mp.subplot(gs[0, :2])
mp.show()
案例:
import matplotlib.pyplot as mp
import matplotlib.gridspec as mg
mp.figure('Grid', facecolor='lightgray')
gs = mg.GridSpec(3, 3)
mp.subplot(gs[0, :2])
mp.text(0.5, 0.5, 1, ha='center', va='center',
size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[:2, 2])
mp.text(0.5, 0.5, 2, ha='center', va='center',
size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[1, 1])
mp.text(0.5, 0.5, 3, ha='center', va='center',
size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[1:, 0])
mp.text(0.5, 0.5, 4, ha='center', va='center',
size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[2, 1:])
mp.text(0.5, 0.5, 5, ha='center', va='center',
size=36)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()
自由布局
自由布局相关API:
mp.figure()
# 设置图表的位置,需要给出左下角点坐标与宽、高即可
# 0.03: 左下角点的横坐标
# 0.04: 左下角点的纵坐标
# 0.94: 图表的宽度
# 0.92: 图表的高度
mp.axes([0.03, 0.04, 0.94, 0.92])
mp.text(....)
mp.show()
案例:
import matplotlib.pyplot as mp
mp.figure('FlowLayou', facecolor='lightgray')
mp.axes([0.1, 0.2, 0.5, 0.3])
mp.text(0.5, 0.5, 1, ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.axes([0.2, 0.6, 0.5, 0.3])
mp.text(0.5, 0.5, 2, ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.show()
刻度定位器
设置坐标轴刻度定位器相关的API:
# 获取当前坐标轴
ax = mp.gca()
# 设置横轴的主刻度定位器为多点定位器,主刻度间隔为1
ax.xaxis.set_major_locator(mp.MultipleLocator(1))
# 设置横轴的次刻度定位器为NullLocator()(将不会显示次刻度)
ax.xaxis.set_minor_locator( mp.NullLocator() )
案例:
import numpy as np
import matplotlib.pyplot as mp
locators = ['mp.NullLocator()',
'mp.MaxNLocator(nbins=6)',
'mp.MultipleLocator(1)',
'mp.AutoLocator()',
'mp.FixedLocator(locs=[0,2.5,7.5,10])']
mp.figure('Locator', facecolor='lightgray')
for i in range(len(locators)):
mp.subplot(len(locators), 1, i + 1)
ax = mp.gca()
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
mp.xlim(0, 10)
mp.ylim(-1, 1)
mp.yticks([])
ax.spines['bottom'].set_position(('data', 0))
# 设置x轴的主刻度定位器
ax.xaxis.set_major_locator(eval(locators[i]))
# 设置x轴的次刻度定位器
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
mp.tight_layout()
mp.show()
刻度网格线
ax = mp.gca()
# 绘制刻度网格线
ax.grid(
which='', # 'major''minor' 绘制主刻度/次刻度网格线
axis='', # 'x'/'y'/'both' 绘制x轴/y轴的刻度网格线
linewidth=1,
linestyle='',
color='',
alpha=0.5
)
案例:[1,10,100,1000,100,10,1]
import numpy as np
import matplotlib.pyplot as mp
y = np.array([1, 10, 100, 1000, 100, 10, 1])
mp.figure('GridLine', facecolor='lightgray')
mp.title('GridLine', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=10)
# 设置刻度定位器与刻度网格线
ax = mp.gca()
ax.xaxis.set_major_locator(
mp.MultipleLocator(1))
ax.xaxis.set_minor_locator(
mp.MultipleLocator(0.1))
ax.yaxis.set_major_locator(
mp.MultipleLocator(250))
ax.yaxis.set_minor_locator(
mp.MultipleLocator(50))
# 设置x与y轴的主刻度网格线
ax.grid(which='major', axis='both',
linewidth=0.75, linestyle='-',
color='orange')
# 设置x与y轴的次刻度网格线
ax.grid(which='minor', axis='both',
linewidth=0.25, linestyle='-',
color='orange')
mp.plot(y, 'o-', c='dodgerblue', label='plot')
mp.legend()
mp.show()
半对数坐标轴
y轴将会以指数方式递增。
mp.figure()
# mp.plot()改为mp.semilogy()方法绘制曲线即可
mp.semilogy(x, y, .....)
mp.show()
散点图
numpy.random模块提供了normal函数用于产生符合正态分布的随机数。
n = 100
# 产生n个符合正态分布规律的随机数
# 172:期望
# 20:标准差(标准差越小,越集中;标准差越大,越分散)
x = np.random.normal(172, 20, n)
y = np.random.normal(65, 10, n)
绘制散点图的相关API:
mp.scatter(
x, y,
marker='',
s=60,
edgecolor='',
facecolor='',
zorder=3
)
案例:
import numpy as np
import matplotlib.pyplot as mp
n = 500
x = np.random.normal(172, 20, n)
y = np.random.normal(65, 10, n)
mp.figure('Students', facecolor='lightgray')
mp.title('Students List', fontsize=16)
mp.xlabel('Height', fontsize=14)
mp.ylabel('Weight', fontsize=14)
mp.tick_params(labelsize=12)
mp.grid(linestyle=':')
mp.scatter(x, y, marker='o', s=50,
color='dodgerblue', alpha=0.5,
zorder=3, label='Stduent')
mp.legend()
mp.show()