Matplotlib

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

matplotlib的基本功能

1.基本绘图

1.1 绘制坐标系中连续的线,设置线型/线宽/颜色

绘制一条线的相关API

import numpy as np
import matplotlib.pyplot as plt
# xarray:散点的x坐标数组
# yarray:散点的y坐标数组
plt.plot(xarray, yarray)
plt.show() import numpy as np
import matplotlib.pyplot as plt x = np.arange(,)
y = np.arange(,)
plt.plot(x, y)
plt.show()

绘制水平线和垂直线相关API

# 绘制一条垂直x轴的线,需要给定x坐标值的value,指定y坐标范围
plt.vlines(value, ymin, ymax,..)
# 绘制一条垂直y轴的线,需要给定y坐标值的value,指定x坐标范围
plt.hlines(value, xmin, xmax,..) import numpy as np
import matplotlib.pyplot as plt x = np.arange(,)
y = np.arange(,)
plt.plot(x, y)
plt.vlines(, , )
plt.hlines(, , )
plt.show()

线型/线宽/颜色

plt.plot(x,y,
linestyle='', # 线型
linewidth=, # 线宽
color='', # 颜色
alpha=0.5 # 透明度
)
  • r 红色
  • g 绿色
  • b 蓝色
  • c cyan
  • m 紫色
  • y 土黄色
  • k 黑色
  • w 白色

1.2 设置坐标轴的范围

plt.xlim(x_lim_min, x_lim_max)
plt.ylim(y_lim_min, y_lim_max)

1.3 设置坐标刻度

# 设置x轴的坐标刻度
# x_val_list:坐标值列表
# x_text_list:坐标刻度列表
plt.xticks(x_val_list, x_text_list)
plt.yticks(y_val_list, y_text_list) # 设置坐标刻度[-π,-π/, , π/, π]
---------------方法一------------
x_val_list= [-np.pi, -np.pi/, , np.pi/, np.pi]
x_text_list = ['-π','-π/2','','π/2','π']
plt.xticks(x_val_list, x_text_list) --------------方法二-------------
x_text_list = [r'$-\pi$',r'$-\frac{\pi}{2}$',r'',r'$\frac{\pi}{2}$',r'${\pi}$']

刻度文本的特殊语法 - LaTeX排版语法规范

设置坐标轴

坐标轴包含四个:left/right/bottom/top

# getCurrentAxis() 获取当前坐标轴对象
ax = plt.gca()
ax1 = ax.spines['left']
axr = ax.spines['right'] # 设置坐标轴的颜色
axl.set_color('none') # 设置坐标轴颜色为透明
# 设置坐标轴的位置
axl.set_position((type,val)) # 设置坐标轴颜色与位置
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',))
ax.spines['bottom'].set_position(('data',))

1.4 显示图例

# 自动在窗口中某个位置添加图例
# 添加图例需要在调用plt.plot()绘制曲线时设置label参数
通过loc参数设置图例的位置
plt.legend(loc='')

# 实例

plt.plot(x, cos_x, linestyle='--', linewidth=, color='y', label=r'$y =\frac{1}{2}cos(x)$')
plt.plot(x, sin_x, linestyle='-.', linewidth=, color='m', label=r'$y=sin(x)$')
plt.legend()

1.5 绘制特殊点

plt.scatter(x,y,
marker='', # 点型
s=, # 点的大小
edgecolor='', # 边缘色
facecolor='', # 填充色
zorder=) # 绘制顺序

1.6 为图像添加备注

plt.annotate(
'', # 备注内容
xycoords='', # 备注目标点使用的坐标系
xy=(x,y), # 备注目标点的坐标
textcoords= '', # 备注文本使用的坐标系
xytext = (x,y), # 备注文本的坐标
fontsize = , # 备注文本字体大小
arrowprops = dict() # 提示箭头属性
) arrowprops参数使用字典定义只想目标点的箭头样式 arrowprops = dict(
arrowstyle = '', # 定义箭头样式
connectionstyle = '' # 定义连接线样式
)
# 可设置箭头的弧度
connectionstyle='arc3, rad=0.1',

2.高级绘图

2.1 绘制子图

一次绘制两个窗口

plt.figure(
'', # 窗口标题
figsize=(,), # 窗口大小
facecolor = '' # 窗口颜色
)
plt.show() # 展示窗口 # 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上
#,如果希望修改已经创建过的窗口,可以通过plt.figure('figure1')方法把该窗口设置为当前窗口。
plt.figure('figure1', figsize=(,), facecolor='lightgray')
plt.figure('figure2', figsize=(,), facecolor='lightgray')

设置当前窗口的常用参数

plt.title('', fontsize=18) # 设置标题
plt.xlabel('', fontsize=12) # 设置窗口中x坐标轴的文本及y坐标轴的文本
plt.ylabel('', fontsize=12)
plt.tick_params(label=8) #
plt.grid() # 设置图表网格线
plt.tight_layout() # 设置紧凑布局

矩阵式布局


plt.figure('')
# 开始绘制一个子图
# 通过参数rows与cols拆分当前窗口,每个子窗口都将分配一个序号, 1-x
plt.subplot(rows, cols, num)
plt.subplot(2,3,2)
plt.subplot(233)
plt.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()


自由布局

plt.figure(
'', # 窗口标题
figsize=(,), # 窗口大小
facecolor = '' # 窗口颜色
)
plt.show() # 展示窗口 # 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上,如果希望修改已经创建过的窗口,可以通过plt.figure('figure1')方法把该窗口设置为当前窗口。
plt.figure('figure1', figsize=(,), facecolor='lightgray')
plt.figure('figure2', figsize=(,), facecolor='lightgray')

2.2散点图

plt.scatter(x,y,marker='', s=,color='',edgecolor='',facecolor='',zorder=)

随机生成一堆点身高期望在1.72 体重在60kg

import numpy as np
import matplotlib.pyplot as plt n =
x= np.random.normal(, , n)
y= np.random.normal(, , n) plt.figure('Persons', facecolor='lightgray')
plt.title('Persons')
plt.xlabel('height')
plt.ylabel('weight')
d = (x-)** + (y-)**
# 颜色映射
plt.scatter(x, y, c=d, s=)
plt.show()

2.6 图像填充

以某种颜色自动填充两条曲线的闭合区域。

plt.fill_between(
x, # x轴水平坐标
sinx, # sinx曲线的y坐标
cosx, # cosx曲线的y坐标
sinx<cosx, # 填充条件为TRUE时,填充
color='', # 颜色
alpha=0.3 # 透明度
)

实例:sinx>cosx的部分进行填充

import numpy as np
import matplotlib.pyplot as plt x = np.linspace(, *np.pi,)
sinx = np.sin(x)
cosx = np.cos(x/)/ plt.figure('Fill', facecolor='lightgray')
plt.title('Fill')
plt.xlabel('X')
plt.ylabel('Y')
plt.tick_params(labelsize=)
plt.plot(x,sinx,color='y', label='y=sin(x)')
plt.plot(x, cosx,color='b', label='y=cos(x/2)/2') plt.fill_between(
x, # x轴水平坐标
sinx, # sinx曲线的y坐标
cosx, # cosx曲线的y坐标
sinx>cosx, # 填充条件为TRUE时,填充
color='dodgerblue', # 颜色
alpha=0.5 # 透明度
)
plt.tight_layout()
plt.legend()
plt.show()

2.7 条形图(柱状图)

plt.bar(
x, # 水平坐标数组
y, # 柱状图高度数组
width, # 柱子的宽度
color='', # 填充颜色
label='', # 标签
alpha=0.5
)

案例:绘制苹果12个月的销量,绘制橘子的销量

import numpy as np
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体) apples = [, , , , , , , , , , , ]
oranges = [, , , , , , , , , , , ] plt.figure('Bar', facecolor='lightgray')
plt.title('Bar', fontsize=)
plt.xlabel('month', fontsize=)
plt.ylabel('Price', fontsize=)
plt.tick_params(labelsize=)
plt.grid(linestyle=':', axis='y') x = np.arange(len(apples))
plt.bar(x - 0.2, apples, 0.4, color='y', label='Apple')
plt.bar(x + 0.2, oranges, 0.4, color='b', label='Orange') plt.xticks(x, ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月',
'十月', '十一月', '十二月'])
plt.legend()
plt.show()

2.8 饼图

功能:统计出占所有总量的百分比

plt.pie(
values, # 值列表
spaces, # 扇形之间的间距列表
labels, # 扇形的标签列表
colors, # 扇形的颜色列表
'%d%%', # 所占比例的格式
shadow=True, # 绘制阴影
startangle=, # 逆时针绘制饼状图的起始角度
radius= # 半径
)

案例:绘制饼状图显示5门语言的流行度

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)

plt.figure('Pie', facecolor='lightgray')
plt.title('Pie', fontsize=) values = [, , , , ]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'Javascript', 'C++', 'Java', 'PHP']
colors = ['r', 'g', 'b', 'y', 'c']
plt.pie(values, spaces, labels, colors,'%d%%', shadow=False) plt.legend()
plt.show()

2.9 等高线图

组成等高线需要网格点坐标矩阵,也需要每个点的高度,所以等高线的绘制属于3D数学模型的范畴

mp.contourf(
x, # 网格坐标矩阵
y,
z, # 坐标矩阵中每个点的值
, # 把整个模型的高度等分为8份
cmap='jet' # 颜色映射
)
import numpy as np
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴负号的显示问题
n =
x, y = np.meshgrid(np.linspace(-,,n),
np.linspace(-,,n))
z = (-x/+x**+y**)*np.exp(-x** - y**)
plt.figure('Contour', facecolor='lightgray')
plt.title('Contour', fontsize=)
plt.xlabel('x', fontsize=)
plt.ylabel('y', fontsize=)
plt.tick_params(labelsize=)
plt.grid(linestyle=':')
plt.contourf(x,y,z,,cmap='jet')
cntr = plt.contour(x,y,z,,colors='black', linewidths=0.5) # 设置等高线的标签文本
plt.clabel(cntr, inline_spacing=, fmt='%.1f', fontsize=) plt.legend()
plt.show()

2.10 热成像图

用图像的方式显示矩阵集矩阵中值的大小

# origin的可选值:
# 'upper':默认值 y轴方向向下,原点在上方
# 'lower':原点在下方
plt.imshow(z, cmap='jet',origin='lower')

实例:热成像图

import numpy as np
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴负号的显示问题
n =
x, y = np.meshgrid(np.linspace(-,,n),
np.linspace(-,,n))
z = (-x/+x**+y**)*np.exp(-x** - y**)
plt.figure('Hot', facecolor='lightgray')
plt.title('Hot', fontsize=)
plt.xlabel('x', fontsize=)
plt.ylabel('y', fontsize=)
plt.tick_params(labelsize=)
plt.grid(linestyle=':')
plt.imshow(z, cmap='jet', origin='lower')
plt.show()

2.11 3D图像绘制

matplotlib支持绘制三维曲面,但需要使用axis3d提供的3D坐标轴进行绘制。

from mpl_toolkits.mplot3d import axes3d
ax3d = plt.gca(projection='3d')
# 使用ax3d对象绘制3维图形
ax3d.scatter() # 3维散点图
ax3d.plot_surface() # 3维平面图
ax3d.plot_wireframe() # 3维线框图

三维散点图的绘制

ax3d.scatter(
x,y,z, # 点的位置坐标点
marker,
s=,
zorder=,
color='',
edgecolor='',
facecolor='',
c=v,
cmap=''
)

案例:生成三维散点数组,显示在三维坐标中。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号的显示问题
n =
# 期望是0, 标准差是1
x = np.random.normal(, , n)
y = np.random.normal(, , n)
z = np.random.normal(, , n) plt.figure('Scatter', facecolor='lightgray')
plt.title('Scatter', fontsize=)
plt.grid(linestyle=':') ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=)
ax.set_ylabel('Y', fontsize=)
ax.set_zlabel('Z', fontsize=)
plt.tick_params(labelsize=) # v的值用于设置散点的颜色
v = np.sqrt(x ** + y ** + z ** )
ax.scatter(x, y, z, c=v, cmap='jet') plt.show()

三维平面图的绘制

ax3d.plot_surface(
x,y,z, # 点的位置坐标点
rstride = , # 行跨距
cstride=, # 列跨距
cmap='jet' # 颜色映射
)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号的显示问题
n =
x, y = np.meshgrid(np.linspace(-, , n),
np.linspace(-, , n))
z = ( - x / + x ** + y ** ) * np.exp(-x ** - y ** ) plt.figure('三维平面图', facecolor='lightgray')
plt.title('三维平面图', fontsize=)
plt.grid(linestyle=':') ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=)
ax.set_ylabel('Y', fontsize=)
ax.set_zlabel('Z', fontsize=)
plt.tick_params(labelsize=) # v的值用于设置散点的颜色
v = np.sqrt(x ** + y ** + z ** )
ax.plot_surface(x, y, z, rstride=, cstride=, cmap='jet') plt.show()

三维线框图的绘制

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号的显示问题
n =
x, y = np.meshgrid(np.linspace(-, , n),
np.linspace(-, , n))
z = ( - x / + x ** + y ** ) * np.exp(-x ** - y ** ) plt.figure('三维平面图', facecolor='lightgray')
plt.title('三维平面图', fontsize=)
plt.grid(linestyle=':') ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=)
ax.set_ylabel('Y', fontsize=)
ax.set_zlabel('Z', fontsize=)
plt.tick_params(labelsize=) # v的值用于设置散点的颜色
v = np.sqrt(x ** + y ** + z ** )
ax.plot_wireframe(x, y, z, rstride=, cstride=, cmap='jet')
plt.show()

数据分析第二篇:matplotlib 常用的几个绘图方法的更多相关文章

  1. 【HANA系列】SAP 【第二篇】EXCEL连接SAP HANA的方法(ODBC)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP [第二篇]EXCEL连接 ...

  2. 第二篇 Mysql常用操作记录(转载)

    我们在创建网站的时候,一般需要用到数据库.考虑到安全性,建议使用非root用户.常用命令如下: 1.新建用户 //登录MYSQL@>mysql -u root -p@>密码//创建用户my ...

  3. 第二篇 HTML 常用元素及属性值

    常用元素及属性值 先和同学了解下,一部分常用的元素,区别以及属性,常用在哪里.   标签是由左右尖括号抱起来的,由开始标签开始,再由结束标签结束,里面内容则是元素,比如:<div>< ...

  4. SlidingMenu第二篇 --- SlidingMenu常用属性介绍

    /** * 设置滑动的屏幕范围 * 1. TOUCHMODE_MARGIN 设置为全屏边缘可滑动 * 2. TOUCHMODE_FULLSCREEN 设置为全屏区域都可以滑动 * 3. TOUCHMO ...

  5. matplotlib常用基础知识

    linestyle(ls)线型参数表 常用color(c)参数表 marker标记符号表 plt常用方法表 plt.legend(loc=0)用于显示图例,图例的位置参数loc matplotlib常 ...

  6. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  7. 小象学院Python数据分析第二期【升级版】

    点击了解更多Python课程>>> 小象学院Python数据分析第二期[升级版] 主讲老师: 梁斌 资深算法工程师 查尔斯特大学(Charles Sturt University)计 ...

  8. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

  9. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

随机推荐

  1. 精通 Android Data Binding

    转自:https://github.com/LyndonChin/MasteringAndroidDataBinding 官方虽然已经给出了教程 - Data Binding Guide (中文版 - ...

  2. Spring整合JMS(消息中间件)

    这一节来说说,异步机制及spring对JMS封装 一.消息异步处理 类似于RMI.Hessian.Burlap等远程方法调用,它们都是同步的,所谓同步调用就是客户端必须等待操作完成,如果远程服务没有返 ...

  3. 有关于__align(n) ,内存对齐

    __align __align 关键字指示编译器在 n 字节边界上对齐变量. __align 是一个存储类修饰符.它不影响函数的类型. 语法 __align(n) 其中: n 是对齐边界. 对于局部变 ...

  4. 关于js语法中的一些难点(预解析,变量提前,作用域)

    ******标题很吓人************ 其实就是一个小小的例子 ,从例子中简单的分析一下作用域.预解析和变量提前的概念 <!DOCTYPE html> <html> & ...

  5. VS2019取消git源代码管理

    VS2019->工具->选项->源代码管理->插件管理 详见下图

  6. 去除app中的标题栏

    我之前一直用的是在oncreate方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE),并且必须写在setContentView(R.layout.a ...

  7. ios推送服务,php服务端

    本文转载至http://my.oschina.net/AStar/blog/176531   生成证书 证书生成参考:https://parse.com/tutorials/ios-push-noti ...

  8. python is == 的区别, 编码与解码.深浅拷贝

    一. is  ==  的区别 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.而不是内存地址 is 比较的是地址 编码回顾 除了了ASCII码以外, 其他信息不能直接转换 编码和解码的时 ...

  9. poj2485

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27912   Accepted: 12734 Descri ...

  10. 新升级!EasyNVR3.0功能概述--直播与录像

    背景介绍: 对于摄像机直播已经是我们司空见惯的需求,但是,许多用户在现有的直播的基础上更有录像的需求,并且有关于录像的删除定时等录像计划的需求,更有客户不仅需要这些功能,还需要将这些功能集成到自身的业 ...