数据可视化(Matplotlib)

Matplotlib概述

matplotlib是python的一个绘图库,使用它可以很方便的绘制出版质量级别的图形.

1.基本绘图
1.绘制坐标系中连续的线,设置线性、线宽、颜色
2. 设置坐标轴的范围
3. 设置坐标刻度
4. 设置坐标轴
5. 显示图例
6. 绘制特殊点
7.为图像添加备注
2.高级绘图
1.绘制子图
2.刻度定位器
3.刻度网格线
4.半对数坐标
5.散点图
6.图像填充
7.条形图
8.饼图

matplotlib基本功能详解

基本绘图
绘制一条线的相关API:

import numpy as np
import matplotlib.pyplot as mp
#xarray:散点的x坐标数组
#yarray:散点的y坐标数组
xarray=[1,2,3,4,5]
yarray=[3,7,5,7,3]
mp.plot(xarray,yarray)
mp.show()

数据可视化(Matplotlib)_第1张图片
绘制水平线与垂直线相关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 点线 
		# o
		# o-
#linewidth: 
		线宽 (数字代表n倍线宽)
#color:
		dodgerblue/orangered/limegreen/red/blue/英文的颜色单词 或 常见颜色单词的首字母 或 #abcdef 或 (1, 1, 0.7) 或 (1, 1, 1, 1)
#alpha: 设置透明度 0~1  0为完全透明		
mp.plot(xarray,yarray,
	linestyle='',		#线型
	linewidth=1,		#线宽
	color='',			#颜色
	alpha=0.5			#透明度
)
import numpy as np
import matplotlib.pyplot as mp
#准备数据
x = np.linspace(-np.pi, np.pi, 1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
# 绘制这两条线
mp.plot(x, cos_y, linestyle='--', linewidth=1,
        color='dodgerblue')
mp.plot(x, sin_y, linestyle='-.', linewidth=3,
        color='orangered')
mp.show()

数据可视化(Matplotlib)_第2张图片

设置坐标范围

设置图像的可视区域
xlim(水平坐标最小值,水平坐标最大值)
ylim(垂直坐标最小值,垂直坐标最大值)
坐标范围越大,图形越小,反而反之。

#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 , − π 2 x^2 + y^2 = z^2, -\frac{\pi}{2} x2+y2=z2,2π

设置坐标轴属性
ax = gca() # 获取当前坐标轴图
ax.spines[‘left’] -> 左纵轴
ax.spines[‘right’] -> 右纵轴
ax.spines[‘top’] -> 上横轴
ax.spines[‘bottom’] -> 下横轴
XX轴.set_position((坐标系, 位置值)) # 设置位置
XX轴.set_color(颜色) # 设置颜色

# getCurrentAxis 获取当前坐标轴对象
ax = mp.gca()
axl = ax.spines['left']
axr = ax.spines['right']
...
# 设置坐标轴的颜色
axl.set_color() 
# 设置坐标轴的位置  
# ('data', 0) 以坐标值作为定位参考, 设置坐标轴到0位置
axl.set_position((type, val))

显示图例

plot(…, label=图例标签, …)
legend([loc=显示位置])

# 自动在窗口中某个位置添加图例
# 添加图例需要在调用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='')

绘制特殊点

scatter(水平坐标, 垂直坐标, s=大小, marker=点形,
    edgecolor=边缘色, facecolor=填充色,
    zorder=Z顺序)
# xarray与yarray是坐标序列
mp.scatter(xarray, yarray,
          marker='',	#点型
          s=3,			#大小
          edgecolor='', #边缘色
          facecolor='', #填充色
          zorder=3		#绘制顺序
)

markers

数据可视化(Matplotlib)_第3张图片

添加备注文本

mp.annotate(
'', 				# 备注内容
xycoords='', 		# 备注目标点使用的坐标系
xy=(x, y),			# 备注目标点的坐标
textcoords='',		# 备注文本使用的坐标系
xytext=(x, y),		# 备注文本的坐标
fontsize=14,		# 备注文本字体大小
arrowprops=dict()	# 指示箭头的属性

)
arrowprops参数使用字典定义指向目标点的箭头样式

arrowprops=dict(
	arrowstyle='',		# 定义箭头样式
    connectionstyle=''	# 定义连接线的样式
)
mp.annotate(
    r'$\frac{1}{2}cos(\frac{3\pi}{4})=-\frac{\sqrt{2}}{4}$',
    xy=(np.pi * 3 / 4, np.cos(np.pi * 3 / 4) / 2), xycoords='data',
    xytext=(-90, -40), textcoords='offset points',
    fontsize=14,
    arrowprops=dict(arrowstyle='->',
                    connectionstyle='arc3, rad=.2'))
mp.annotate(
    r'$sin(\frac{3\pi}{4})=\frac{\sqrt{2}}{2}$',
    xy=(np.pi * 3 / 4, np.sin(np.pi * 3 / 4) / 2), xycoords='data',
    xytext=(20, 20), textcoords='offset points',
    fontsize=14,
    arrowprops=dict(arrowstyle='->',
                    connectionstyle='arc3, rad=.2'))

数据可视化(Matplotlib)_第4张图片
arrowstyle参见 help(mp.annotate)

高级绘图

图形(窗口)对象

figure(
		'',					#窗口名(标题栏文本)
		figsize=(4,3),		#窗口大小
		dpi=120,			#窗口分辨率
		facecolor=''		#窗口颜色
)
mp.figure()方法可以创建多个窗口, 每个窗口的标题不同. 后续调用mp的方法进行绘制时
将作用于当前窗口. 如果希望修改以前已经创建过的窗口,可以通过相同的窗口标题
调用mp.figure()方法把该窗口置为当前窗口.
mp.title('',fontsize=18)						#设置图表的标题(窗口标题, fontsize=字体大小)
mp.xlabel('',fontsize=18)
xlabel(水平轴标签, fontsize=字体大小)
ylabel(垂直轴标签, fontsize=字体大小)
tick_params(labelsize=刻度标签字体大小)
grid(linestyle=网格线型)
mp.tight_layout()								#紧凑布局

设置当前窗口的常用参数

#设置图表的标题
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('Figure Object 1',facecolor='lightgray')
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
栅格定位器 = mg.GridSpec(行数, 列数)
subplot(栅格定位器[行, 列])

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()

自由布局
axes([左, 底, 宽, 高]) # 归一化单位

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())
ax.xaxis.set_major_locator(mp.NullLocator()) -> 水平坐标轴
ax.yaxis -> 垂直坐标轴```
刻度定位器 = xxxLocator(定位规则)
ax = gca()
ax.xaxis -> 水平坐标轴
ax.yaxis -> 垂直坐标轴
坐标轴.set_major_locator(刻度定位器) # 主刻度
坐标轴.set_minor_locator(刻度定位器) # 次刻度

案列:画个数轴

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')

12.区域填充
fill_between(
水平坐标, 起点垂直坐标, 终点垂直坐标, 填充条件,
color=颜色, alpha=透明度)
代码:fill.py
13.条形图
bar(水平坐标, 绝对高度, 相对宽度, color=颜色,
label=图例标签, alpha=透明度)
代码:bar.py
14.饼图
pie(值数组, 间隙数组, 标签数组, 颜色数组, 格式,
shadow=是否带阴影, startangle=起始角度)
代码:pie.py
15.等高线图
contour(点阵X坐标矩阵, 点阵Y坐标矩阵, 点阵Z坐标矩阵,
梯度数, colors=颜色, linewidths=线宽)
contourf(点阵X坐标矩阵, 点阵Y坐标矩阵, 点阵Z坐标矩阵,
梯度数, cmap=颜色映射)
代码:cntr.py
16.热力图
10 13 12 56
22 26 27 19 -cmap->颜色
55 42 25 36

LaTex语法字符串

数据可视化(Matplotlib)_第5张图片
数据可视化(Matplotlib)_第6张图片

matplotlib_cmap

数据可视化(Matplotlib)_第7张图片

matplotlib_colors

数据可视化(Matplotlib)_第8张图片

你可能感兴趣的:(数据分析,Matplotlib)