数据分析
matplotlib概述
matplotlib是python的一个绘图库,使用它可以很方便的绘制出版质量级别的图形.
matplotlib的基本功能
matplotlib基本功能详解
基本绘图
绘制一条线的相关API:
import numpy as ap
import matplotlib.pyplot as mp
#xarray: 散点的x坐标数组
#yarray: 散点的y坐标数组
mp.plot(xarray, yarray)
mp.show()
绘制水平线与垂直线相关API:
#绘制一条垂直x轴的线, 需要给x坐标值value,指定y坐标范围
mp.vlines(value, ymin, ymax, ..)
#绘制一条垂直y轴的线, 需要给y坐标值value,指定x坐标范围
mp.hlines(value, xmin, xmax, ..)
线型/线宽/颜色
#linestyle: 线型
# - or solid 直线
# -- or dashed 虚线
# -. or dashdot 点虚线
# : or dot 点线
#linewidth: 线宽 (数字代表n倍线宽)
#color: 英文的颜色单词 或 常见颜色单词的首字母 或
#abcdef 或 (1, 1, 0.7) 或 (1, 1, 1, 1)
#alpha: 设置透明度 0~1 0为完全透明
mp.plot(xarray, yarray,
linestyle='', # 线型
linewidth=1, # 线宽
color='', # 颜色
alpha=0.5 # 透明度
)
设置坐标轴范围
设置图像的可视区域.
#x_lim_min: 可视区域x的最小值
#x_lim_max: 可视区域x的最大值
mp.xlim(x_lim_min, x_lim_max)
#同上
mp.ylim(y_lim_min, y_lim_max)
设置坐标刻度
#设置x轴的坐标刻度
#x_val_list: 坐标值列表
#x_text_list: 坐标刻度列表
mp.xticks(x_val_list, x_text_list)
mp.yticks(y_val_list, y_text_list)
刻度文本的特殊语法 – LaTex排版语法规范 (参考附录)
x^2 + y^2 = z^2, -\frac{\pi}{2}
设置坐标轴
坐标轴包含四个: left / right / bottom / top
# getCurrentAxis 获取当前坐标轴对象
ax = mp.gca()
axl = ax.spines['left']
axr = ax.spines['right']
...
# 设置坐标轴的颜色
axl.set_color()
# 设置坐标轴的位置
# ('data', 0) 以坐标值作为定位参考, 设置坐标轴到0位置
axl.set_position((type, val))
显示图例
# 自动在窗口中某个位置添加图例
# 添加图例需要在调用mp.plot()绘制曲线时设置label参数
mp.plot(..., label='y=sin(x)')
# 通过loc参数设置图例的位置
# =============== =============
# Location String Location Code
# =============== =============
# 'best' 0
# 'upper right' 1
# 'upper left' 2
# 'lower left' 3
# 'lower right' 4
# 'right' 5
# 'center left' 6
# 'center right' 7
# 'lower center' 8
# 'upper center' 9
# 'center' 10
=============== =============
mp.legend(loc='')
绘制特殊点
# xarray与yarray是坐标序列
mp.scatter(xarray, yarray,
marker='', #点型
s=3, #大小
edgecolor='', #边缘色
facecolor='', #填充色
zorder=3 #绘制顺序
)
marker点型详见附录
添加备注文本
mp.annotate(
'', # 备注内容
xycoords='', # 备注目标点使用的坐标系
xy=(x, y), # 备注目标点的坐标
textcoords='', # 备注文本使用的坐标系
xytext=(x, y), # 备注文本的坐标
fontsize=14, # 备注文本字体大小
arrowprops=dict() # 指示箭头的属性
)
arrowprops参数使用字典定义指向目标点的箭头样式
arrowprops=dict(
arrowstyle='', # 定义箭头样式
connectionstyle='' # 定义连接线的样式
)
arrowstyle参见 help(mp.annotate)
高级图形窗口对象操作
一次绘制两个窗口
mp.figure(
'', # 窗口标题
figsize=(4, 3), # 窗口大小
facecolor='' # 窗口颜色
)
mp.show()
mp.figure()方法可以创建多个窗口, 每个窗口的标题不同. 后续调用mp的方法进行绘制时将作用于当前窗口. 如果希望修改以前已经创建过的窗口,可以通过相同的窗口标题调用mp.figure()方法把该窗口置为当前窗口.
设置当前窗口的常用参数
#设置图表的标题
mp.title('', fontsize=18)
#设置窗口中x坐标轴的文本即y坐标轴的文本
mp.xlabel('', fontsize=12)
mp.ylabel('', fontsize=12)
#设置刻度参数(刻度字体大小)
mp.tick_params(labelsize=8)
#设置图表网格线
mp.gird(linestyle=':')
#设置紧凑布局
mp.tight_layout()
绘制子图
矩阵式布局
mp.figure('')
# 开始绘制一个子图
# 通过参数rows与cols拆分当前窗口, 每个子窗口都将分配一
# 个序号, 1~x
mp.subplot(rows, cols, 1)
mp.title()
mp.grid()
mp.subplot(2, 3, 2)
mp.subplot(233)
mp.show()
案例:绘制九宫格子图, 每个子图写一个文本.
import numpy as np
import matplotlib.pyplot as mp
mp.figure('Sub Layout', facecolor='gray')
for i in range(1, 10):
mp.subplot(3, 3, i)
mp.text(0.5, 0.5, i, ha='center',
va='center', size=36, alpha=0.8)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()
网格式布局
import matplotlib.gridspec as mg
mp.figure('')
# 该方法将会返回子图的二维数组
gs = mg.GridSpec(3, 3)
# 通过subplot对子图进行合并
# gs[0, :2]->合并0行中的0/1列作为1个子图进行绘制
mp.subplot(gs[0, :2])
mp.show()
自由布局
mp.figure('')
# left_bottom_x:子图左下角点的横坐标
# left_bottom_y:子图左下角点的纵坐标
# w: 宽度
# h: 高度
mp.axes([left_bottom_x, left_bottom_y,w, h])
mp.show()
刻度定位器
# 获取当前坐标轴
ax = mp.gca()
# 设置x轴的主刻度定位器为NullLocator()
ax.xaxis.set_major_locator(mp.NullLocator())
# 设置x轴的次刻度定位器为MultipleLocator()
ax.xaxis.set_minor_locator(mp.MultipleLocator())
案例: 画个数轴
import numpy as np
import matplotlib.pyplot as mp
locators = ['mp.NullLocator()',
'mp.MaxNLocator(nbins=4)',
'mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])',
'mp.AutoLocator()',
'mp.MultipleLocator()',
'mp.LogLocator(base=2)']
mp.figure('Locators', facecolor='lightgray')
for i, locator in enumerate(locators):
mp.subplot(len(locators), 1, i + 1)
mp.xlim(0, 10)
mp.ylim(-10, 10)
mp.yticks([])
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position(('data', 0))
ax.xaxis.set_major_locator(eval(locator))
ax.xaxis.set_minor_locator(
mp.MultipleLocator(0.1))
mp.plot(np.arange(11), np.zeros(11), c='none')
mp.text(5, 0.3, locator,
ha='center', size=12)
mp.tight_layout()
mp.show()
刻度网格线
ax = mp.gca()
ax.grid(
which='', #'major' / 'minor'
axis='', #'x' / 'y' / 'both'
linewidth=1, # 线宽
linestyle='', # 线型
color='',
alpha=0.5
)
半对数坐标系
y轴将会以指数方式递增.
mp.figure()
mp.semilogy(x, y, ....)
mp.show()
绘制散点图
mp.scatter(
xarray,
yarray,
marker='',
s=10,
color='',
edgecolor='',
facecolor='',
zorder=3
)
使用numpy.random的normal函数生成符合二项分布的随机数.
n = 100
# 172: 期望值
# 20: 标准差
# n: 数字生成数量
x = np.random.normal(172, 20, n)
y = np.random.normal(60, 10, n)
设置点的颜色
# d的值是一个大于0的数
# 若所有点计算出的d处于[0-1000]区间
# 那么绘制该点时所使用的颜色,可以根据d的值去jet颜色映射
# 表中取值(即如果d取值为500,则使用jet颜色映射表中最中心
# 的颜色值)
d = (x-172)**2 + (y-60)**2
mp.scatter(x, y, c=d, cmap='jet')
附录