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

最新文章

  1. input 标签实现带提示文字的输入框
  2. 在Copy-Item中集成认证信息以拷贝文件
  3. 云计算之路-阿里云上:部分服务器未及时续费造成docker swarm集群故障
  4. ES6的模块化规范和CommonJS的模块化规范的差异
  5. AI - TensorFlow - 分类与回归(Classification vs Regression)
  6. 3、Linux常用命令
  7. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
  8. shell &amp;&amp; and ||
  9. 解决Windows下文件在Linux下打开出现乱码的问题
  10. 每天一个linux命令(8):scp使用
  11. WebMagic实现分布式抓取以及断点抓取
  12. 20155211 网络对抗 Exp9 Web安全基础实践
  13. ASP.NET MVC:WebPageRenderingBase.cs
  14. 【转】Session 过期问题处理
  15. 【转自IT虾米网:www.itxm.net】外部应用和drools-wb6.1集成解决方案
  16. hue database is locked
  17. vmware增加共享文件夹
  18. MVC区域路由配置
  19. WinForm-SQL查询避免UI卡死
  20. 查询rabbitmq

热门文章

  1. foxmail 客户端 LOGIN Login error password error
  2. 浅析Apache中RewriteCond规则参数的详细介绍
  3. sublime无法使用package Control解决办法。
  4. (C#)为应用程式设定运行权限(System.Security类下的GenericIdentity,GenericPrincipal,PrincipalPermission)
  5. vue实践---vue结合 promise 封装原生ajax
  6. mysql主从:主键冲突问题
  7. Mac下python连接mysql数据库
  8. 【BZOJ】2186 沙拉公主的困惑
  9. [Matlab绘图][三维图形][三维曲线基本函数+三维曲面+其他三维图形]
  10. Frobenius Norm