matplotlib数据可视化

数据分析

数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详
细研究和概括总结的过程。

matplotlib:数据可视化

在pycharm中绘制时,可以在’File’→’Settings’→’Tools’→’Python Scientfic’→取消勾选’Show plots in tool window’选项可以体验更多的绘制展示功能:放大、移动、3d的旋转等

基本绘图

设置线型、线宽和颜色

import matplotlib.pyplot as mp
mp.plot(xarray,yarray,linestyle='',linewidth=1,color='',alpha=0.5)
# linestyle:线型(常用的如下,更多可以在网上查阅)
	#'-'(直线) '--'(虚线) '-.'(点虚线) ':'(点线)
# linewidth:线宽(相对参照单位)
# color:颜色
	# 英文常见单词/首字母(w:white)/十六进制/RGBA参数(R,G,B,A)/RGB
    	# RGBA参数的A相关于透明度alpha;
    	# R,G,B,A参数取值范围在[0,1]
# alpha:透明度(浮点数值)

设置坐标轴

import matplotlib.pyplot as mp
# 坐标轴范围设置
mp.xlim(x_min, x_max)
# x_min:x轴范围最小值<float>类型/x_max:x轴范围最大值<float>类型
mp.ylim(y_min, y_max)
# y_min:y轴范围最小值<float>类型/y_max:y轴范围最大值<float>类型

# 获取坐标系 get current axes
ax = mp.gca()
# 获取其中某个轴 坐标轴名称{'left'/'right'/'bottom'/'top':左/右/下/上轴}
axis = ax.spines['坐标轴名']
# 坐标轴位置设置
# type→str类型 参数如下表所示
#    ===============   ==========================
#    type              val
#    ===============   ==========================
#    'data'            表示以数据的值作为移动参照值
#    'axes'            表示以百分比的形式设置轴的位置[0~1]
#    'outward'         表示离图像间距多远距离
#    ===============   ==========================
axis.set_position((type,val))
# 坐标轴颜色设置 color→颜色字符串 'none'不显示该轴
axis.set_color('color')

设置刻度

import numpy as np
import matplotlib.pyplot as mp
# 坐标轴刻度设置
mp.xticks(x_val, x_list)
# x_val:x轴刻度值序列/x_text:x轴刻度标签文本序列
mp.yticks(y_val, y_list)
# y_val:y轴刻度值序列/y_text:y轴刻度标签文本序列
LaTeX文字排版字符串

在绘制许多图像时,通常需要运用一些数学公式和函数等。在Matplotlib.plot常常使用LaTeX符号公式就能呈现更好的内容。

当需要使用的时候,可以在此网站生成在线LaTeX公式编辑器-编辑器或者在网上查阅对应的符号公式LaTex符号大全(LaTeX_Symbols)_latex symbol_YEN_csdn的博客-CSDN博客

r'$x^n+y^n=z^n$',r'$\int\frac{1}{x} dx = \ln |x| + C$',r'$-\frac{\pi}{2}$'

x 2 + y 2 = z 2 , ∫ 1 x d x = ln ⁡ ∣ x ∣ + C , − π 2 x^2+y^2=z^2, \int\frac{1}{x} dx = \ln |x| + C, -\frac{\pi}{2} x2+y2=z2,x1dx=lnx+C,2π

设置图例

mp.legend(loc='') # loc参数如下表所示
# 将带有label标签的线段放置于图例中
位置参数
最佳位置0
右上角1
左上角2
左下角3
右下角4
右边5
中部左边6
中部右边7
中部下边8
中部上边9
中间10

设置标注特殊点

mp.scatter(xarray, yarray,
           marker='',  # 点型 相关的点型如下表所示
           s='',  # 大小
           edgecolors='',  # 边缘色
           facecolor='',  # 填充色
           zorder=3  # 绘制图层编号(编号越大,图层越靠上)
           label='' # 设置显示在例图上的标签
           )

该表源于菜鸟教程

标记符号描述
“.”m00
“,”m01像素点
“o”m02实心圆
“v”m03下三角
“^”m04上三角
“<”m05左三角
“>”m06右三角
“1”m07下三叉
“2”m08上三叉
“3”m09左三叉
“4”m10右三叉
“8”m11八角形
“s”m12正方形
“p”m13五边形
“P”m23加号(填充)
“*”m14星号
“h”m15六边形 1
“H”m16六边形 2
“+”m17加号
“x”m18乘号 x
“X”m24乘号 x (填充)
“D”m19菱形
“d”m20瘦菱形
“|”m21竖线
“_”m22横线
0 (TICKLEFT)m25左横线
1 (TICKRIGHT)m26右横线
2 (TICKUP)m27上竖线
3 (TICKDOWN)m28下竖线
4 (CARETLEFT)m29左箭头
5 (CARETRIGHT)m30右箭头
6 (CARETUP)m31上箭头
7 (CARETDOWN)m32下箭头
8 (CARETLEFTBASE)m33左箭头 (中间点为基准)
9 (CARETRIGHTBASE)m34右箭头 (中间点为基准)
10 (CARETUPBASE)m35上箭头 (中间点为基准)
11 (CARETDOWNBASE)m36下箭头 (中间点为基准)
“None”, " " or “”没有任何标记
‘$…$’m37渲染指定的字符。例如 “$f$” 以字母 f 为标记。

添加文本信息

# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
mp.annotate(
    r'$\frac{\pi}{2}$',			#备注中显示的文本内容
    xycoords='data',			#备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(x, y),	 				#备注目标点的坐标
    textcoords='offset points',	#备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(x, y),				#备注文本的坐标
    fontsize=14,				#备注文本的字体大小
    arrowprops=dict()			#使用字典定义文本指向目标点的箭头样式
)

#arrowprops字典参数的常用key
arrowprops=dict(
	arrowstyle='',		#定义箭头样式
    connectionstyle=''	#定义连接线的样式
)

设置序列点及垂线

import numpy as np
import matplotlib.pyplot as mp

x = np.array([1, 2, 3, 4, 5])  # X水平坐标序列
y = np.array([10, 23, 15, 45, 30])  # Y垂直坐标序列
mp.plot(x, y,)
# vertical绘制垂直线
vval = 3  # 垂线的值
vmin = 10  # 起始位置
vmax = 50  # 结束位置
mp.vlines(vval, vmin, vmax)
# horizontal绘制水平线
hval = [10, 20, 25, 42]  # 水平线的值
hmin = [1, 2, 3, 4]  # 起始位置
hmax = [2, 3, 4, 5]  # 结束位置
mp.hlines(hval, hmin, hmax)
# 显示绘图,如下图所示
mp.show()

例子:余弦正弦函数的绘制

import numpy as np
import matplotlib.pyplot as mp

x = np.linspace(-np.pi, np.pi, 1000)  # -π~π线性拆分1000个点
y1 = np.sin(x)
y2 = np.cos(x) / 2
# 设置只显示第一象限
# mp.xlim(0, np.pi + 0.1)
# mp.ylim(0, 1.1)
# 设置坐标轴位置
ax = mp.gca()
ax.spines['top'].set_color('none')  # 不显示上轴
ax.spines['right'].set_color('none')  # 不显示右轴
ax.spines['left'].set_position(('data', 0))  # 左轴移动到y=0的位置
ax.spines['bottom'].set_position(('data', 0))  # 下轴移动到x=0的位置
# 设置刻度
vals = [-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi]
texts = [r'-$\pi$', r'-$\frac{\pi}{2}$', '0', r'$\frac{\pi}{2}$', r'$\pi$']
mp.xticks(vals, texts)
mp.yticks([-1.0, -0.5, 0.5, 1.0])
mp.plot(x, y1, linestyle='--', linewidth=2, color=(1, 0.271, 0), label=r'$y=sin(x)$')
# sin函数 线性为虚线,线宽2,颜色橘色,透明度默认1
mp.plot(x, y2, linestyle=':', linewidth=1, color='#00BFFF', alpha=0.8, label=r'$y=\frac{1}{2}cos(x)$')
# cos/2函数 线性为点线,线宽1,颜色蓝色,透明度0.8
# 设置特殊点
xpo = [np.pi / 2, 0]
ypo = [1, 0.5]
mp.scatter(xpo, ypo,
           marker='^',  # 点型为上三角
           s=50,  # 大小
           edgecolors='grey',  # 边缘色
           facecolor='black',  # 填充色
           zorder=3,  # 绘制图层编号(编号越大,图层越靠上)
           label='sample point'
           )
# 添加备注
mp.annotate(
    r'$[\frac{\pi}{2},1]$',  # 备注中显示的文本内容
    xycoords='data',  # 备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(np.pi / 2, 1),  # 备注目标点的坐标
    textcoords='offset points',  # 备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(50, 30),  # 备注文本的坐标
    fontsize=14,  # 备注文本的字体大小
    arrowprops=dict(
        arrowstyle='->',
        connectionstyle='angle3'
    )  # 使用字典定义文本指向目标点的箭头样式
)
mp.annotate(
    r'$[0,\frac{1}{2}]$',  
    xycoords='data',  
    xy=(xpo[1],ypo[1]),  
    textcoords='offset points',  
    xytext=(-60, 45), 
    fontsize=14,
    arrowprops=dict(
        arrowstyle='->',
        connectionstyle='angle3'
    )  
)
mp.legend()
# 将带有label标签的线段放置于图例中
mp.show()
# 显示绘图,如下图所示

图表其他设置:标题/网格线/刻度/布局

# 设置图表标题 显示在图表上方
mp.title(title, fontsize=字体大小)
# 设置水平轴的文本
mp.xlabel(x_label_str, fontsize=字体大小)
# 设置垂直轴的文本
mp.ylabel(y_label_str, fontsize=字体大小)
# 设置刻度参数   labelsize设置刻度字体大小
mp.tick_params(labelsize=?)
# 设置图表网格线  linestyle设置网格线的样式
	#	-  or solid 粗线
	#   -- or dashed 虚线
	#   -. or dashdot 点虚线
	#   :  or dotted 点线
mp.grid(linestyle='')
# 设置紧凑布局,把图表相关参数都显示在窗口中
mp.tight_layout() 

图形对象

构建窗口

# 手动构建 matplotlib 窗口
mp.figure(
    '',					#窗口标题栏文本 
    figsize=(4, 3),		 #窗口大小 <元组>
    dpi=120,			#像素密度
	facecolor=''		#图表背景色
)
mp.show() 

子图

矩阵式布局
mp.figure('Subplot Layout', facecolor='lightgray')
# 拆分矩阵
	# rows:行数
	# cols:列数
	# num:编号
mp.subplot(rows, cols, num)
	#	1 2 3
	#	4 5 6
	#	7 8 9 
mp.subplot(3, 3, 5)		# 操作3*3的矩阵中编号为5的子图
mp.subplot(335)			# 简写
网格式布局

支持单元格的合并

import matplotlib.gridspec as mg
mp.figure('Grid Layout', facecolor='lightgray')
# 调用GridSpec方法拆分网格式布局
# rows:	行数
# cols:	列数
# gs = mg.GridSpec(rows, cols)	拆分成3行3列
gs = mg.GridSpec(3, 3)	
# 合并0行与0、1列为一个子图表
mp.subplot(gs[0, :2])
mp.text(0.5, 0.5, '1', ha='center', va='center', size=36)
mp.show()

例子🌰

import matplotlib.pyplot as mp
import matplotlib.gridspec as mg


def clean_ticks(text, color): # 在子图中的操作(填充文本,颜色)
    mp.text(0.5, 0.5, text, ha='center', va='center', size=24)
    mp.gca().patch.set_facecolor(color) # 设置当前轴背景色
    mp.gca().patch.set_alpha(0.6) # 设置透明度
    mp.xticks([])  # 无刻度
    mp.yticks([])  # 无刻度
    mp.tight_layout()


mp.figure('Grid Layout', facecolor='lightgray')
gs = mg.GridSpec(3, 3)
# 合并第0行的0,1子图为一个子图
mp.subplot(gs[0, :2])
clean_ticks('1', 'red')
# 合并第2列的0,1子图为一个子图
mp.subplot(gs[0:2:, 2])
clean_ticks('2', 'yellow')
# 合并第2行的1,2子图为一个子图
mp.subplot(gs[2, 1::])
clean_ticks('3', 'green')
# 合并第0列的1,2子图为一个子图
mp.subplot(gs[1:, 0])
clean_ticks('4', 'orange')
# 中间的子图
mp.subplot(gs[1, 1])
clean_ticks('5', 'blue')
# 显示效果如下图所示
mp.show()
自由式布局
mp.figure('Flow Layout', facecolor='lightgray')
# 设置图标的位置,给出左下角点坐标与宽高即可
# left_bottom_x: 坐下角点x坐标
# left_bottom_x: 坐下角点y坐标
# width:		 宽度
# height:		 高度
# mp.axes([left_bottom_x, left_bottom_y, width, height])
mp.axes([0.03, 0.03, 0.94, 0.94])
mp.text(0.5, 0.5, '1', ha='center', va='center', size=36)
mp.show()

刻度定位器

# 获取当前坐标轴
ax = mp.gca()
# 设置水平坐标轴的主刻度定位器,空定位器
ax.xaxis.set_major_locator(mp.NullLocator())
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
常用Locator
# 空定位器:不绘制刻度
mp.NullLocator()
# 最大值定位器:
# 最多绘制nbins+1个刻度
mp.MaxNLocator(nbins=3)
# 定点定位器:根据locs参数中的位置绘制刻度
mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])
# 自动定位器:由系统自动选择刻度的绘制位置
mp.AutoLocator()
# 索引定位器:由offset确定起始刻度,由base确定相邻刻度的间隔
mp.IndexLocator(offset=0.5, base=1.5)
# 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度
mp.MultipleLocator()
# 线性定位器:等分numticks-1份,绘制numticks个刻度
mp.LinearLocator(numticks=21)
# 对数定位器:以base为底,绘制刻度
mp.LogLocator(base=2)

例子①:[1,10]的坐标轴

import matplotlib.pyplot as mp

mp.figure('locators', facecolor='lightgrey')
ax = mp.gca()
mp.yticks([])  # y轴无刻度
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_color('none')
# 左右上轴不存在
ax.spines['bottom'].set_position(('data', 0.5))
mp.xlim(1, 10)  # x轴的取值范围
# 设置水平坐标轴的主刻度定位器为多点定位器,间隔1
ax.xaxis.set_major_locator(mp.MultipleLocator(1))
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
mp.tight_layout()
mp.show() # 显示效果如下图所示

例子②

import matplotlib.pyplot as mp
import numpy as np

locators = ['mp.NullLocator()',  # 空刻度定位器
            'mp.MaxNLocator(nbins=4)',  # 最多五个点定位器
            'mp.FixedLocator([3,6,9])',  # 固定三个点定位器
            'mp.AutoLocator()',  # 自动定位器
            'mp.IndexLocator(offset=0.5, base=1.5)',  # 从0.5开始,每间断1.5定位
            'mp.LinearLocator(numticks=21)',  # 等分(21-1)刻度定位
            'mp.LogLocator(base=2)'  # 以2为底的对数定位器
            ]
# 枚举遍历 获取locators中的元素和对应的下标i
for i, locator in enumerate(locators):
    mp.subplot(len(locators), 1, i + 1)
    mp.xlim(0, 10)
    mp.ylim(-1, 1)
    mp.yticks([])
    # 获取当前坐标轴
    ax = mp.gca()
    # 隐藏除底轴以外的所有坐标轴
    ax.spines['left'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')
    # 将底坐标轴调整到子图中心位置
    ax.spines['bottom'].set_position(('data', 0))
    # 设置水平坐标轴的主刻度定位器
    # eval()将字符串传入生成locator对象
    ax.xaxis.set_major_locator(eval(locator))
    # 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
    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'/'both' <-> '主刻度'/'次刻度'/'主次都要'
    axis='',		# 'x'/'y'/'both' <-> 绘制x或y轴或者xy轴都需要
    linewidth=1, 	# 线宽
    linestyle='', 	# 线型
    color='',		# 颜色
	alpha=0.5		# 透明度
)

半对数坐标

应对场景:有时候由于个别点跨度过大导致其他点的细节幅度增长无法清晰的显示的,可以通过将y轴以指数方式递增解决该问题,这种方式就是半对数坐标。

mp.figure('Grid', facecolor='lightgray')
y = [1, 10, 100, 1000, 100, 10, 1]
mp.semilogy(y)
mp.show()

例子

import matplotlib.pyplot as mp
import numpy as np


def draw(title):
    mp.title(title, fontsize=16)
    mp.ylabel('y', fontsize=14)
    ax = mp.gca()
    # x轴主刻度
    ax.xaxis.set_major_locator(mp.MultipleLocator(1.0))
    # x轴副刻度
    ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
    # y轴主刻度
    ax.yaxis.set_major_locator(mp.MultipleLocator(250))
    # y轴副刻度
    ax.yaxis.set_minor_locator(mp.MultipleLocator(50))
    mp.tick_params(labelsize=10)
    # 主刻度网格线
    ax.grid(which='major', axis='both', linewidth=0.75,
            linestyle='-', color='orange')
    # 次刻度网格线
    ax.grid(which='minor', axis='both', linewidth=0.25,
            linestyle='-', color='orange')


# 刻度网格线
mp.figure('Grid Line')
mp.figure('Normal & Log', facecolor='lightgray')
y = np.array([1, 10, 100, 1000, 100, 10, 1])

mp.subplot(211)  # 子图Normal
# x刻度自动生成(以1为单位) o-连点成线
draw('Normal')
mp.plot(y, 'o-', c='dodgerblue', label='plot')
mp.legend()
mp.subplot(212)  # 子图Log
draw('Log')
mp.semilogy(y, 'o-', c='dodgerblue', label='plot')
mp.legend()
mp.show() # 显示效果如下图所示

散点图

绘制:特殊点的绘制方法

mp.scatter(
    x, 					# x轴坐标数组
    y,					# y轴坐标数组
    marker='',		     # 点型
    s=10,				# 大小
    color='',		    # 颜色
    edgecolor='',		# 边缘颜色
    facecolor='',		# 填充色
    zorder=''		    # 图层序号
)

随机生成一组样品点并绘制( ‘jet’ 点离期望值越近,表示越标准,颜色偏蓝)

import matplotlib.pyplot as mp
import numpy as np
n = 150
# numpy.random提供了normal函数用于产生符合 正态分布 的随机数 
# 172:	期望值(大致均值,概率最高)
# 10:	标准差(震荡幅度)
# n:	数字生成数量
x = np.random.normal(172, 20, n)
y = np.random.normal(60, 10, n)
mp.figure('Persons', facecolor='lightgray')
mp.title('Persons', fontsize=18) # 标题
mp.xlabel('height', fontsize=14) # x轴
mp.ylabel('weight', fontsize=14) # y轴
mp.grid(linestyle=':') # 网格
d = (x - 172) ** 2 + (y - 60) ** 2  # 与标准身高体重的差的平方和
# cmap 颜色映射 'jet'(身高体重越标准,则值越小,越接近蓝色,反之接近红色)
mp.scatter(x, y, marker='.', s=70,
           label='persons', c=d, cmap='jet')
mp.legend()
mp.show() # 显示如下图所示

填充

mp.fill_between(
	x,			    # x轴的水平坐标
    sin_x,			# 下边界曲线上点的垂直坐标
    cos_x,			# 上边界曲线上点的垂直坐标
    sin_x < cos_x,	 # 填充条件,为True时填充
    color='', 		# 填充颜色
    alpha=0.2		# 透明度
)

柱状图

mp.bar(
	x,				# 水平坐标数组
    y,				# 柱状图高度数组
    width,			# 柱子的宽度[0,1]
    bottom,			# 柱子底部的高度
    color='', 		# 填充颜色
    label='',		# 标签
    alpha=0.2,		# 透明度
    align='center/edge' # 柱子对齐方式
)

饼图

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

等高线图

cntr = mp.contour(
    x, 					# 网格坐标矩阵的x坐标 (2维数组)
    y, 					# 网格坐标矩阵的y坐标 (2维数组)
    z, 					# 网格坐标矩阵的z坐标 (2维数组)
    8, 					# 把等高线绘制成8部分,等高线的密集程度
    colors='black',		# 等高线的颜色
	linewidths=0.5		# 线宽
)
# 为等高线图添加高度标签
mp.clabel(cntr,				# mp.contour的返回值
          inline_spacing=1,  # 文字标签和等高线的间隙
          fmt='%.1f',		# 标签格式化
          fontsize=10		# 字体大小
         )
# contour fill 填充等高线 cmap图形颜色映射
mp.contourf(x, y, z, 8, cmap='jet')

热成像图

# 把矩阵z图形化,使用cmap表示矩阵中每个元素值的大小
# origin: 坐标轴方向
# upper: 缺省值,原点在左上角
# lower: 原点在左下角
mp.imshow(z, cmap='jet', origin='lower')
# 使用颜色条显示热度值:
mp.colorbar()

3D图像绘制

matplotlib支持绘制三维曲面。若希望绘制三维曲面,需要使用axes3d提供的3d坐标系。

from mpl_toolkits.mplot3d import axes3d
ax3d = mp.gca(projection='3d')   # class axes3d 获取3d坐标系
ax3d.scatter(..)		# 绘制三维点阵
ax3d.plot_surface(..)	# 绘制三维曲面
ax3d.plot_wireframe(..)	# 绘制三维线框图

可能和matplotlib的版本有关,我使用的是以下这种方式获取坐标轴

fig = mp.figure('3D Scatter', facecolor='lightgray')
ax3d = fig.add_subplot(projection='3d')
3D散点图绘制
ax3d.scatter(
    x,				# x轴坐标数组
    y,				# y轴坐标数组
    z,				# z轴坐标数组
    marker='',		 # 点型
    s=10,			# 大小
    zorder='',		# 图层序号
    color='',		# 颜色
    edgecolor='',	 # 边缘颜色
    facecolor='',	 # 填充色
    c=v,			# 颜色值 根据cmap映射应用相应颜色
    cmap=''			# 
)
3D曲面图绘制
ax3d.plot_surface(
    x, 					# 网格坐标矩阵的x坐标 (2维数组)
    y, 					# 网格坐标矩阵的y坐标 (2维数组)
    z, 					# 网格坐标矩阵的z坐标 (2维数组)
    rstride=30,			# 行跨距
    cstride=30, 		# 列跨距
    cmap='jet'			# 颜色映射
)
3D线框图绘制
ax3d.plot_wireframe(
	x,			# 网格坐标矩阵的x坐标 (2维数组)
	y,			# 网格坐标矩阵的y坐标 (2维数组)
	z,			# 网格坐标矩阵的z坐标 (2维数组)
	rstride=30,  # 行跨距
	cstride=30,  # 列跨距 
	linewidth=1, # 线宽
    color='dodgerblue' #颜色
)

例子

import matplotlib.pyplot as mp
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = mp.figure('3D Draw', facecolor='lightgray')
# 散点图子图
ax3d_scatter = fig.add_subplot(131, projection='3d')
# 生成标准正态分布数组 x/y/z
n = 300
x1 = np.random.normal(0, 1, n)
y1 = np.random.normal(0, 1, n)
z1 = np.random.normal(0, 1, n)
# 设置坐标轴/标题
ax3d_scatter.set_title('Scatter')
ax3d_scatter.set_xlabel('X')
ax3d_scatter.set_ylabel('Y')
ax3d_scatter.set_zlabel('Z')
d = x1 ** 2 + y1 ** 2 + z1 ** 2
ax3d_scatter.scatter(x1, y1, z1, s=40, marker='o', c=d, cmap='jet')  # 绘制散点图
# 曲面图子图
ax3d_surface = fig.add_subplot(132, projection='3d')
ax3d_surface.set_title('Surface')
ax3d_surface.set_xlabel('X')
ax3d_surface.set_ylabel('Y')
ax3d_surface.set_zlabel('Z')
x2, y2 = np.meshgrid(np.linspace(-3, 3, n), np.linspace(-3, 3, n))
z2 = (1 - x2 / 2 + x2 ** 5 + y2 ** 3) * np.exp(-x2 ** 2 - y2 ** 2)
ax3d_surface.plot_surface(x2, y2, z2, cstride=30, rstride=30, cmap='jet')
# 线框图子图
ax3d_wireframe = fig.add_subplot(133, projection='3d')
ax3d_wireframe.set_title('Wireframe')
ax3d_wireframe.set_xlabel('X')
ax3d_wireframe.set_ylabel('Y')
ax3d_wireframe.set_zlabel('Z')
x3, y3 = np.meshgrid(np.linspace(-3, 3, n), np.linspace(-3, 3, n))
z3 = (1 - x3 / 2 + x3 ** 5 + y3 ** 3) * np.exp(-x3 ** 2 - y3 ** 2)
ax3d_wireframe.plot_wireframe(x3, y3, z3, cstride=30, rstride=30, linewidth=1, color='purple')
mp.show() #显示效果如下图所示

极坐标系

极坐标系同于描述极径ρ和极角θ的线性关系

import matplotlib.pyplot as mp
import numpy as np

# 极坐标绘制
fig = mp.figure("Polar", facecolor='lightgray')
fig.add_subplot(projection='polar')
mp.title('Polar', fontsize=20)
mp.xlabel(r'$\theta$', fontsize=14) # θ
mp.ylabel(r'$\rho$', fontsize=14) # ρ
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.show() #显示效果如下图所示

例子:心形图ρ=2(1-sinθ)

import matplotlib.pyplot as mp
import numpy as np

# 极坐标绘制
fig = mp.figure("Polar", facecolor='lightgray')
fig.add_subplot(projection='polar')
mp.title('Polar', fontsize=20)
mp.xlabel(r'$\theta$', fontsize=14)
mp.ylabel(r'$\rho$', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
t = np.linspace(0, 2 * np.pi, 1000)
r = 2 * (1 - np.sin(t))
mp.plot(t, r, color='pink')
mp.show()  # 显示效果如下图所示

简单动画

matplotlib提供了方法用于处理简单动画的绘制。定义update函数用于即时更新图像。

import matplotlib.animation as ma
#定义更新函数行为
def update(number):
    pass
# 每隔10毫秒执行一次update更新函数,作用于mp.gcf()当前窗口对象
# mp.gcf():	获取当前窗口,窗口关闭动画就关闭
# update:	更新函数
# interval:	间隔时间(单位:毫秒)
anim = ma.FuncAnimation(mp.gcf(), update, interval=10)
mp.show()

例子:生成100个泡泡

import matplotlib.pyplot as mp
import numpy as np
import matplotlib.animation as ma

# 简单动画
# 自定义一种可以存放在ndarray里的类型,用于保存一个球
ball_type = np.dtype([
    ('position', float, 2),  # 位置(水平和垂直坐标)
    ('size', float, 1),  # 大小
    ('growth', float, 1),  # 生长速度
    ('color', float, 4)])  # 颜色(红、绿、蓝和透明度):(R,G,B,A)

# 随机生成100个点对象
n = 100
balls = np.zeros(100, dtype=ball_type)
# uniform 每个数字的概率均匀
balls['position'] = np.random.uniform(0, 1, (n, 2))  # (n,2):n行2列
balls['size'] = np.random.uniform(40, 70, n)
balls['growth'] = np.random.uniform(10, 20, n)
balls['color'] = np.random.uniform(0, 1, (n, 4))

mp.figure("Animation", facecolor='lightgray')
mp.title("Animation", fontsize=14)
mp.xticks([])
mp.yticks([])

sc = mp.scatter(
    balls['position'][:, 0],  # x:ball_type[position][所有行][0]
    balls['position'][:, 1],  # y:ball_type[position][所有行][1]
    balls['size'],
    color=balls['color'])


# 定义更新函数行为
def update(number):
    balls['size'] += balls['growth']
    # 每次让一个气泡破裂,随机生成一个新的
    boom_ind = number % n  # 泡泡的下标[0,99]
    balls[boom_ind]['size'] = np.random.uniform(40, 70, 1)
    balls[boom_ind]['position'] = np.random.uniform(0, 1, (1, 2))  # 一个样本:一行两列
    # mp.scatter 重新设置属性
    sc.set_sizes(balls['size'])
    sc.set_offsets(balls['position'])


# 每隔30毫秒执行一次update更新函数,作用于mp.gcf()当前窗口对象
# mp.gcf():	获取当前窗口
# update:		更新函数
# interval:	间隔时间(单位:毫秒)
anim = ma.FuncAnimation(mp.gcf(), update, interval=30)
mp.show() # 显示效果如下图所示

在很多情况下,绘制动画的参数是动态获取的,matplotlib支持定义generator生成器函数,用于生成数据,把生成的数据交给update函数更新图像:

import matplotlib.animation as ma
#定义更新函数行为
def update(data):
    t, v = data
    ...
    pass

def generator():
	yield t, v
        
# 每隔10毫秒将会先调用生成器,获取生成器返回的数据,
# 把生成器返回的数据交给并且调用update函数,执行更新图像函数
anim = ma.FuncAnimation(mp.gcf(), update, generator,interval=10)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值