matplotlib常用绘图操作

文章目录

  • matplotlib基本功能
      • 1.基本绘图
      • 2.图形对象
  • matplotlib基本功能详解
      • 基本绘图
        • 绘制一条曲线
        • 绘制水平线与垂直线
        • 绘制正弦曲线
        • 线型、线宽和颜色
        • 设置坐标轴范围
        • 设置坐标刻度
        • 设置坐标轴
        • 图例
        • 特殊点
        • 备注
      • 图形对象(图形窗口)
        • 窗口测试
        • 子图
        • 刻度定位器
        • 刻度网格线
        • 半对数坐标
        • 散点图
        • 填充
        • 条形图(柱状图)
        • 饼图
        • 等高线图
        • 热成像图
        • 3D图像绘制
        • 极坐标系
        • 简单动画
        • 加载文件
        • k线图

matplotlib基本功能

1.基本绘图

(在二维平面坐标系中绘制连续的线)

  1. 设置线型、线宽和颜色

  2. 设置坐标轴范围

  3. 设置坐标刻度

  4. 设置坐标轴

  5. 图例

  6. 特殊点

  7. 备注

2.图形对象

(图形窗口)

  1. 子图
  2. 刻度定位器
  3. 刻度网格线
  4. 半对数坐标
  5. 散点图
  6. 填充
  7. 条形图
  8. 饼图
  9. 等高线图
  10. 热成像图
  11. 极坐标图
  12. 三维曲线
  13. 简单动画

matplotlib基本功能详解

基本绘图

 
绘图核心API

绘制一条曲线

import nuplty as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6])
y = np.array([12, 39, 36, 25, 4, 41])

# 绘制曲线
plt.plot(x, y)

plt.show()   # 程序运行到这里会阻塞,将图表关闭,程序继续运行

 

绘制水平线与垂直线

import nuplty as np
import matplotlib.pyplot as plt

# 绘制水平线
# plt.hlines(xval,xmin,xmax)     xval表示点的位置 xmin表示线起始是多少 xmax表示终止值是多少
plt.hlines([10, 20, 30, 40],
          [1, 2, 3, 4], [2, 3, 4, 5])
# 绘制垂直线
plt.vlines(4, 10, 35)

plt.show()   # 程序运行到这里会阻塞,将图表关闭,程序继续运行

 

绘制正弦曲线

import nuplty as np
import matplotlib.pyplot as plt

# 绘制正弦曲线
# 线性拆分1000个点
x=np.linspace(-np.pi,np.pi,1000)
y=np.sin(x)
plt.plot(x,y)


plt.show()   # 程序运行到这里会阻塞,将图表关闭,程序继续运行

 

线型、线宽和颜色

#linestyle: 线型  '-'(直线)  '--'(曲线)  '-.'(点曲线)  ':'(点线)
#linewidth: 线宽
	#	数字
#color: <关键字参数> 颜色
	#	英文颜色单词 或 常见颜色英文单词首字母 或 #495434 或 (1,1,1) 表示RGB 或 (1,1,1,1) 表示RGB透明度
#alpha: <关键字参数> 透明度
	#	浮点数值 从0到1
plt.plot(xarray, yarray, linestyle='', linewidth=1, color='', alpha=0.5)
import nuplty as np
import matplotlib.pyplot as plt
x=np.linspace(-np.pi,np.pi,1000)
sinx=np.sin(x)
plt.plot(x,sinx,linestyle=':',linewidth=10,color="red",alpha=0.5)
cosx=np.cos(x)
plt.plot(x,cosx,linestyle="-.",linewidth=5,color="blue",alpha=1)


plt.show()   # 程序运行到这里会阻塞,将图表关闭,程序继续运行

 

设置坐标轴范围

#x_limt_min:	 x轴范围最小值
#x_limit_max:	 x轴范围最大值
plt.xlim(x_limt_min, x_limit_max)
#y_limt_min:	 y轴范围最小值
#y_limit_max:	 y轴范围最大值
plt.ylim(y_limt_min, y_limit_max)
import nuplty as np
import matplotlib.pyplot as plt

plt.xlim(0,np.pi)
plt.ylim(0,1)

x=np.linspace(-np.pi,np.pi,1000)
sinx=np.sin(x)
plt.plot(x,sinx)
cosx=np.cos(x)
plt.plot(x,cosx)

plt.show()

 

设置坐标刻度

案例:把横坐标的刻度显示为:0, π/2, π, 3π/2, 2π

#x_val_list: 	x轴刻度值序列
#x_text_list:	x轴刻度标签文本序列 [可选]
plt.xticks(x_val_list , x_text_list )
#y_val_list: 	y轴刻度值序列
#y_text_list:	y轴刻度标签文本序列 [可选]
plt.yticks(y_val_list , y_text_list )
import nuplty as np
import matplotlib.pyplot as plt

# 设置坐标轴刻度
# 修改x轴刻度文本
vals=[-np.pi,-np.pi/2,0,np.pi/2,np.pi]
textx=['-π','-π/2','0','π/2','π']
plt.xticks(vals,textx)

x=np.linspace(-np.pi,np.pi,1000)
sinx=np.sin(x)
plt.plot(x,sinx)
cosx=np.cos(x)
plt.plot(x,cosx)

plt.show()

 

刻度文本的特殊语法LaTex排版语法字符串

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π

 

设置坐标轴

坐标轴名:left / right / bottom / top

# 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax = plt.gca()
# 获取其中某个坐标轴
axis = ax.spines['坐标轴名']
# 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数
# type:  移动坐标轴的参照类型  一般为'data' (以数据的值作为移动参照值)
# val:  参照值
axis.set_position((type, val))
# 设置坐标轴的颜色
# color:  颜色值字符串
axis.set_color(color)
axis.set_color('none') # 表示不要这个坐标轴

案例:设置坐标轴至中心。

# 修改坐标轴
import nuplty as np
import matplotlib.pyplot as plt

ax=plt.gca()    #获取坐标系
ax.spines['top'].set_color('none')  #去掉上轴
ax.spines['right'].set_color('none')    #去掉右轴
ax.spines['left'].set_position(('data',0))  #左轴挪到x=0的位置
ax.spines['bottom'].set_position(('data',0))  #下轴挪到y=0的位置

x=np.linspace(-np.pi,np.pi,1000)
sinx=np.sin(x)
plt.plot(x,sinx)
cosx=np.cos(x)
plt.plot(x,cosx)

plt.show()

 

图例

显示两条曲线的图例,并测试loc属性。

# 再绘制曲线时定义曲线的label
# label: <关键字参数 str> 支持LaTex排版语法字符串
plt.plot(xarray, yarray ... label='', ...)
# 设置图例的位置
# loc: <关键字参数> 制定图例的显示位置 (若不设置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
#    ===============   =============
plt.legend(loc='')

例如:
x=np.linspace(-np.pi,np.pi,1000)
sinx=np.sin(x)
plt.plot(x,sinx,label=r'$y=sin(x)$')
cosx=np.cos(x)
plt.plot(x,cosx,label=r'$y=cos(x)$')
plt.legend()

 

特殊点

案例:绘制当x=3π/4时两条曲线上的特殊点。

# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray, 
           marker='', 		#点型 ~ matplotlib.markers
           s='', 			#大小
           edgecolor='', 	#边缘色
           facecolor='',	#填充色
           zorder=3			#绘制图层编号 (编号越大,图层越靠上)
)

marker点型可参照:help(matplotlib.markers)

也可参照附录: matplotlib point样式

# 绘制特殊点
pointx=[np.pi/2,np.pi/2]
pointy=[1,0]
plt.scatter(pointx,pointy,marker='o',
            s=70,color='red',label='smaple points')

 

备注

案例:为在某条曲线上的点添加备注,指明函数方程与值。

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

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

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

箭头样式(arrowstyle)字符串如下

============   =============================================
Name           Attrs
============   =============================================
  '-'          None
  '->'         head_length=0.4,head_width=0.2
  '-['         widthB=1.0,lengthB=0.2,angleB=None
  '|-|'        widthA=1.0,widthB=1.0
  '-|>'        head_length=0.4,head_width=0.2
  '<-'         head_length=0.4,head_width=0.2
  '<->'        head_length=0.4,head_width=0.2
  '<|-'        head_length=0.4,head_width=0.2
  '<|-|>'      head_length=0.4,head_width=0.2
  'fancy'      head_length=0.4,head_width=0.4,tail_width=0.4
  'sipltle'     head_length=0.5,head_width=0.5,tail_width=0.2
  'wedge'      tail_width=0.3,shrink_factor=0.5
============   =============================================

连接线样式(connectionstyle)字符串如下

============   =============================================
Name           Attrs
============   =============================================
  'angle' 		angleA=90,angleB=0,rad=0.0
  'angle3' 		angleA=90,angleB=0`   
  'arc'			angleA=0,angleB=0,armA=None,armB=None,rad=0.0
  'arc3' 		rad=0.0
  'bar' 		armA=0.0,armB=0.0,fraction=0.3,angle=None
============   =============================================
# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
plt.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'
    )        #使用字典定义文本指向目标点的箭头样式
)

  
 

图形对象(图形窗口)

窗口测试

案例:绘制两个窗口,一起显示。

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

plt.figure方法不仅可以构建一个新窗口,如果已经构建过title='xxx’的窗口,又使用figure方法构建了title=‘xxx’ 的窗口的话,plt将不会创建新的窗口,而是把title='xxx’的窗口置为当前操作窗口。

# 窗口测试
import matplotlib.pyplot as plt
import nuplty as np
plt.figure('A Figure',facecolor='gray')
plt.plot([0,1],[1,2])
plt.figure('B Figure',facecolor='lightgray')
plt.plot([1,2],[2,1])
plt.figure('A Figure',facecolor='gray')
plt.plot([1,2],[2,1])

plt.show()

 

设置当前窗口的参数

案例:测试窗口相关参数

# 窗口测试
import matplotlib.pyplot as plt
import nuplty as np
plt.figure('A Figure',facecolor='gray')
plt.plot([0,1],[1,2])
plt.figure('B Figure',facecolor='lightgray')
plt.plot([1,2],[2,1])
# 如果figure中标题已创建,则不会新建窗口,而是将旧窗口设置为当前窗口
plt.figure('A Figure',facecolor='gray')
plt.plot([1,2],[2,1])

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

plt.show()

 

子图

矩阵式布局

绘制矩阵式子图布局相关API:

# 子图

import matplotlib.pyplot as plt

plt.figure("Subplot",facecolor='lightgray')

for i in range(1,10):
    plt.subplot(3,3,i)
    plt.text(0.5,0.5,i,ha='center',va='center',size=36,alpha=0.5)
    plt.xticks([])      #去掉横坐标轴
    plt.yticks([])      #去掉纵坐标轴
    plt.tight_layout()

plt.show()

 
网格式布局

网格式布局支持单元格的合并。

绘制网格式子图布局相关API:

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

案例:绘制一个自定义网格布局。

import matplotlib.gridspec as mg
import matplotlib.pyplot as plt
import nuplty as np

plt.figure('Grid Layout',facecolor='lightgray')
# 调用GridSpec方法拆分网格式布局
# rows:	行数
# cols:	列数
# gs = mg.GridSpec(rows, cols)	拆分成3行3列
gs=mg.GridSpec(3,3)

plt.subplot(gs[0,:2])   #0行 前2列
plt.text(0.5,0.5,'1',size=36,alpha=0.5,ha='center',va='center')
plt.xticks([])
plt.yticks([])
plt.tight_layout()

plt.subplot(gs[1:,0])   #1 2行 第0列
plt.text(0.5,0.5,'2',size=36,alpha=0.5,ha='center',va='center')
plt.xticks([])
plt.yticks([])

plt.subplot(gs[2,1:])   #第2行 1 2列
plt.text(0.5,0.5,'3',size=36,alpha=0.5,ha='center',va='center')
plt.xticks([])
plt.yticks([])

plt.subplot(gs[:2,2])   #前2行 第2列
plt.text(0.5,0.5,'4',size=36,alpha=0.5,ha='center',va='center')
plt.xticks([])
plt.yticks([])

plt.subplot(gs[1,1])   #1行 1列
plt.text(0.5,0.5,'5',size=36,alpha=0.5,ha='center',va='center')
plt.xticks([])
plt.yticks([])
plt.show()

 

刻度定位器

刻度定位器相关API:

# 获取当前坐标轴
ax = plt.gca()
# 设置水平坐标轴的主刻度定位器	plt.MultipleLocator(1)  多点定位器,表示每隔1是一个主刻度
ax.xaxis.set_major_locator(plt.MultipleLocator(1))
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

案例:绘制一个数轴。

import matplotlib.pyplot as plt

plt.figure("刻度定位器",facecolor='lightgray')
# x轴可视范围
plt.xlim(1,10)
# 整理坐标轴
ax=plt.gca()
# 去掉上轴 左轴 右轴 下轴挪到中间
ax.spines['top'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['right'].set_color('none')
plt.yticks([])
ax.spines['bottom'].set_position(('data',0.5))
plt.tight_layout()

# 设置主刻度
ax.xaxis.set_major_locator(plt.MultipleLocator(1))
# 设置次刻度
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

plt.show()

常用刻度器如下

# 空定位器:不绘制刻度
plt.NullLocator()
# 最大值定位器:
# 最多绘制nbins+1个刻度
plt.MaxNLocator(nbins=3)
# 定点定位器:根据locs参数中的位置绘制刻度
plt.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])
# 自动定位器:由系统自动选择刻度的绘制位置
plt.AutoLocator()
# 索引定位器:由offset确定起始刻度,由base确定相邻刻度的间隔
plt.IndexLocator(offset=0.5, base=1.5)
# 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度
plt.MultipleLocator()
# 线性定位器:等分numticks-1份,绘制numticks个刻度
plt.LinearLocator(numticks=21)
# 对数定位器:以base为底,绘制刻度
plt.LogLocator(base=2)

 

刻度网格线

绘制刻度网格线的相关API:

ax = plt.gca()
#绘制刻度网格线
ax.grid(
    which='',		# 'major'/'minor'/'both' <-> '主刻度'/'次刻度' 
    axis='',		# 'x'/'y'/'both' <-> 绘制x或y轴
    linewidth=1, 	# 线宽
    linestyle='', 	# 线型
    color='',		# 颜色
	alpha=0.5		# 透明度
)

案例:绘制曲线 [1, 10, 100, 1000, 100, 10, 1],然后设置刻度网格线,测试刻度网格线的参数。

import matplotlib.pyplot as plt

plt.figure('Grid line',facecolor='lightgray')
ax=plt.gca()
# 修改刻度定位器
ax.xaxis.set_major_locator(plt.MultipleLocator(1))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.yaxis.set_major_locator(plt.MultipleLocator(250))
ax.yaxis.set_minor_locator(plt.MultipleLocator(50))


ax.grid(which='major',axis='x',color='orangered',linewidth='0.75')

# 绘制曲线
y=[1,10,100,1000,100,10,1]
# o- 表示连点成线
plt.plot(y,'o-',color='blue')

plt.show()

 

半对数坐标

y轴将以指数方式递增。 基于半对数坐标绘制第二个子图,表示曲线:[1, 10, 100, 1000, 100, 10, 1]。

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

 

散点图

可以通过每个点的坐标、颜色、大小和形状表示不同的特征值。

身高 体重 性别 年龄段 种族
180 80 中年 亚洲
160 50 青少 美洲

绘制散点图的相关API:

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

numpy.random提供了normal函数用于产生符合 正态分布 的随机数

n = 100
# 172:	期望值
# 10:	标准差
# n:	数字生成数量
x = np.random.normal(172, 20, n)
y = np.random.normal(60, 10, n)

案例:绘制平面散点图。

import nuplty as np
import matplotlib.pyplot as plt

n=300
# 175 期望    5标准差   300数量  随机生成一个正态分布的数列
# +- 三倍标准差可以涵盖所有点
height=np.random.normal(175,5,n)
#体重
weight=np.random.normal(70,7,n)

plt.figure("persons",facecolor='lightgray')
plt.title("persons",fontsize=18)
plt.xlabel('height',fontsize=14)
plt.ylabel('weight',fontsize=14)
plt.grid(linestyle=':')
d=(height-175)**2+(weight-70)**2
# c代表color  d代表距离标准身高体重的误差,距离均值越近,d越小
# cmap是colormap  jet映射是 数越小越偏蓝,数越大越偏红
plt.scatter(height,weight,marker='o',s=70,
            label='persons',c=d,cmap='jet')
plt.legend()
plt.show()

 

填充

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

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

案例:绘制两条曲线: sin_x = sin(x) cos_x = cos(x / 2) / 2 [0-8π]

import nuplty as np
import matplotlib.pyplot as plt

x=np.linspace(0,8*np.pi,1000)
sinx=np.sin(x)
cosx=np.cos(x/2)/2

plt.figure("Fill",facecolor='lightgray')
plt.title("Fill",fontsize=18)
plt.grid(linestyle=':')
plt.plot(x,sinx,color='dodgerblue',label=r'$y=sin(x)$')
plt.plot(x,cosx,color='orangered',label=r'$y=\frac{1}{2}cos(\frac{1}{2}x)$')
plt.fill_between(x,sinx,cosx,sinx>cosx,color='blue',alpha=0.3)
plt.fill_between(x,sinx,cosx,sinx<cosx,color='orange',alpha=0.3)
plt.legend()

plt.show()

 

条形图(柱状图)

绘制柱状图的相关API:

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

案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。

import nuplty as np
import matplotlib.pyplot as plt

apples=np.array([25,34,84,13,51,34,34,65,43,56,98,26])
oranges=np.array([13,24,87,35,41,64,43,54,44,34,34,65,45])

#绘制柱状图
plt.figure("Bar",facecolor='lightgray')
plt.title("Bar Chart",fontsize=18)
plt.grid(linestyle=':')     #点线
x=np.arange(apples.size)
y=np.arange(oranges.size)
plt.bar(x-0.2,apples,0.4,color='limegreen',label='Apples',align='center')
plt.bar(y+0.2,oranges,0.4,color='orangered',label='Oranges',align='center')

#设置刻度
plt.xticks(x,['Jan','Feb','Mar','Apr','May','Jun','July','Aug','Sep','Oct','Nov','Dec'])

plt.legend()
plt.show()	

 

饼图

绘制饼状图的基本API:

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

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

import matplotlib.pyplot as plt
import numpy as np
#整理数据
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'JavaScript',
          'C++', 'Java', 'PHP']
colors = ['dodgerblue', 'orangered',
          'limegreen', 'violet', 'gold']

#画图
plt.figure("Pie Chart")
plt.axis('equal')   #设置x与y轴等比例输出
plt.pie(values,spaces,labels,colors,'%.1f%%',shadow=True)

plt.legend()
plt.show()

 

等高线图

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

绘制等高线的相关API:

cntr = plt.contour(
    x, 					# 网格坐标矩阵的x坐标 (2维数组)(行、列)
    y, 					# 网格坐标矩阵的y坐标 (2维数组)
    z, 					# 网格坐标矩阵的z坐标 (2维数组)
    8, 					# 把等高线绘制成8部分
    colors='black',		# 等高线的颜色
	linewidths=0.5		# 线宽
)
# 为等高线图添加高度标签
# inline_spacing间隙
plt.clabel(cntr, inline_spacing=1, fmt='%.1f',
          fontsize=10)
# 填充颜色
plt.contourf(x, y, z, 8, cmap='jet')

案例:生成网格坐标矩阵,并且绘制等高线:

import matplotlib.pyplot as plt
import numpy as np

n=1000
# meshgrid 网格化  x和y为n*n的矩阵
x,y=np.meshgrid(np.linspace(-3,3,n),
                            np.linspace(-3,3,n))

z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
# 上述代码 得到二维数组x、y直接组成坐标点矩阵
# z为通过每个坐标的x与y计算而得的高度值
# (模拟采集的海拔高度)

plt.figure("Counter",facecolor='lightgray')
plt.title("counter",fontsize=16)
plt.grid(linestyle=":")
cntr=plt.contour(x,y,z,8,colors='black',linewidths=0.5)

# 设置等高线上的高度标签文本
plt.clabel(cntr,fmt="%.2f",inline_spacing=2,fontsize=16) 
# 填充颜色
plt.contourf(x,y,z,8,cmap='jet')
plt.show()

 

热成像图

用图形的方式显示矩阵及矩阵中值的大小
1 2 3
4 5 6
7 8 9

绘制热成像图的相关API:

# 把矩阵z图形化,使用cmap表示矩阵中每个元素值的大小
# origin: 坐标轴方向
#    upper: 缺省值,原点在左上角
#    lower: 原点在左下角
plt.imshow(z, cmap='jet', origin='low')
import matplotlib.pyplot as plt
import numpy as np

n=1000
x,y=np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))

z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)

plt.imshow(z,cmap='jet',origin='lower')
plt.colorbar()		# 使用颜色条显示热度值
plt.show()

 

3D图像绘制

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

from mpl_toolkits.mplot3d import axes3d
ax3d = plt.gca(projection='3d')   # class axes3d

matplotlib支持绘制三维点阵、三维曲面、三维线框图:

ax3d.scatter(..)		# 绘制三维点阵
ax3d.plot_surface(..)	# 绘制三维曲面
ax3d.plot_wireframe(..)	# 绘制三维线框图

 

绘制三维点阵

ax3d.scatter(
    x, 				# x轴坐标数组
    y,				# y轴坐标数组
    z,				# z轴坐标数组
    marker='', 		# 点型
    s=10,			# 大小
    zorder='',		# 图层序号
    color='',		# 颜色
    edgecolor='', 	# 边缘颜色
    facecolor='',	# 填充色
    c=v,			# 颜色值 根据cmap映射应用相应颜色
    cmap=''			# 
)

案例:随机生成3组坐标,成标准正态分布规则,并且绘制它们。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d

n=300
x=np.random.normal(0,1,n)
y=np.random.normal(0,1,n)
z=np.random.normal(0,1,n)

# 绘制三维点阵
plt.figure('3D scatter',facecolor='lightgray')
ax3d=plt.gca(projection='3d')
ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z')

d=x**2+y**2+z**2
ax3d.scatter(x,y,z,s=70,marker='o',c=d,cmap='jet')

plt.show()

 

绘制三维曲面

ax3d.plot_surface(
    x, 					# 网格坐标矩阵的x坐标 (2维数组)
    y, 					# 网格坐标矩阵的y坐标 (2维数组)
    z, 					# 网格坐标矩阵的z坐标 (2维数组)
    rstride=30,			# 行跨距
    cstride=30, 		# 列跨距
    cmap='jet'			# 颜色映射
)

案例:绘制3d平面图

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d

n=1000
# meshgrid 网格化  x和y为n*n的矩阵
x,y=np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))

z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)

plt.figure("3D Surface",facecolor='lightgray')
ax3d=plt.gca(projection='3d')
ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z')
# cstride=30,rstride=30 行跨距、列跨距
# 行跨距30,每30个像素作为一个整体
ax3d.plot_surface(x,y,z,cstride=30,rstride=30,cmap='jet')

plt.show()

 

绘制三维线框图

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d

n=1000
# meshgrid 网格化  x和y为n*n的矩阵
x,y=np.meshgrid(np.linspace(-3,3,n),
                np.linspace(-3,3,n))

z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)

plt.figure("3D Surface",facecolor='lightgray')
ax3d=plt.gca(projection='3d')
ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z')
# cstride=30,rstride=30 行跨距、列跨距
# 行跨距30,每30个像素作为一个整体
ax3d.plot_wireframe(x,y,z,cstride=30,rstride=30,
                    linewidth=1,color='dodgerblue')

plt.show()

 

极坐标系

与笛卡尔坐标系不同,某些情况下极坐标系适合显示与角度有关的图像。例如雷达等。极坐标系可以描述极径ρ与极角θ的线性关系。

plt.figure("Polar", facecolor='lightgray')
plt.gca(projection='polar')
plt.title('Porlar', fontsize=20)
plt.xlabel(r'$\theta$', fontsize=14)
plt.ylabel(r'$\rho$', fontsize=14)
plt.tick_params(labelsize=10)  # 参数刻度线样式设置
plt.grid(linestyle=':')
plt.show()

在极坐标系中绘制曲线:

#准备数据
t = np.linspace(0, 4*np.pi, 1000)
r = 0.8 * t
plt.plot(t, r)
plt.show()

 

简单动画

动画即是在一段时间内快速连续的重新绘制图像的过程。

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

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

案例:随机生成各种颜色的100个气泡。让他们不断的增大。

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

#随机生成100个点对象
n = 100
balls = np.zeros(100, dtype=ball_type)
balls['position']=np.random.uniform(0, 1, (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))

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

sc = plt.scatter(
	balls['position'][:, 0], 
	balls['position'][:, 1], 
	balls['size'], 
	color=balls['color'], alpha=0.5)
	
#定义更新函数行为
def update(number):
	balls['size'] += balls['growth']
	#每次让一个气泡破裂,随机生成一个新的
	boom_ind = number % n
	balls[boom_ind]['size']=np.random.uniform(40, 70, 1)
	balls[boom_ind]['position']=np.random.uniform(0, 1, (1, 2))
	# 重新设置属性
	sc.set_sizes(balls['size'])
	sc.set_offsets(balls['position'])
	
# 每隔30毫秒执行一次update更新函数,作用于plt.gcf()当前窗口对象
# plt.gcf():	获取当前窗口
# update:		更新函数
# interval:	间隔时间(单位:毫秒)
anim = ma.FuncAnimation(plt.gcf(), update, interval=30)
plt.show()

 

加载文件

numpy提供了函数用于加载逻辑上可被解释为二维数组的文本文件,格式如下:

数据项1 <分隔符> 数据项2 <分隔符> ... <分隔符> 数据项n
例如:
AA,AA,AA,AA,AA
BB,BB,BB,BB,BB
...
或:
AA:AA:AA:AA:AA
BB:BB:BB:BB:BB
...

调用numpy.loadtxt()函数可以直接读取该文件并且获取ndarray数组对象:

import nuplty as np
# 直接读取该文件并且获取ndarray数组对象 
# 返回值:
#     unpack=False:返回一个二维数组
#     unpack=True: 多个一维数组
np.loadtxt(
    '../aapl.csv',			# 文件路径
    delimiter=',',			# 分隔符
    usecols=(1, 3),			# 读取1、3两列 (下标从0开始)
    unpack=False,			# 是否按列拆包
    dtype='U10, f8',		# 制定返回每一列数组中元素的类型
    converters={1:func}		# 转换器函数字典
)    

案例:读取aapl.csv文件,得到文件中的信息:

import numpy as np
import datetime as dt
import matplotlib.pyplot as plt

# 日期转换函数 日月年转年月日
def dmy2ymd(dmy):
    dmy = str(dmy, encoding='utf-8')
    time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
    t = time.strftime('%Y-%m-%d')
    return t

# 拆开接收
dates,opening_prices,highest_prices,lowest_prices,closing_prices=\
                np.loadtxt('../../../sucai/da_data/aapl.csv',
                delimiter=',',
                usecols=(1,3,4,5,6),dtype='M8[D],f8,f8,f8,f8',
                unpack=True,
                converters={1:dmy2ymd}) #将第一列字符串传给这个函数

案例:使用matplotlib绘制K线图

  1. 绘制dates与收盘价的折线图:
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt

# 日期转换函数 日月年转年月日
def dmy2ymd(dmy):
    dmy = str(dmy, encoding='utf-8')
    time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
    t = time.strftime('%Y-%m-%d')
    return t

# 拆开接收
dates,opening_prices,highest_prices,lowest_prices,closing_prices=\
                np.loadtxt('../../../sucai/da_data/aapl.csv',
                delimiter=',',
                usecols=(1,3,4,5,6),dtype='M8[D],f8,f8,f8,f8',
                unpack=True,
                converters={1:dmy2ymd}) #将第一列字符串传给这个函数

#绘制收盘价的折线图
plt.figure('AAPL',facecolor='lightgray')
plt.title('AAPL',fontsize=16)
plt.xlabel('Date',fontsize=14)
plt.ylabel('closing_price',fontsize=14)
plt.grid(linestyle=':')

import matplotlib.dates as md
#拿到坐标轴
ax = plt.gca()
#设置主刻度定位器为周定位器(每周一显示主刻度文本)
ax.xaxis.set_major_locator(
    md.WeekdayLocator(byweekday=md.MO))     #MO 每周一一个主刻度
ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y'))
#设置次刻度定位器为日定位器
ax.xaxis.set_minor_locator(md.DayLocator()) # 每天一个次刻度

dates=dates.astype(md.datetime.datetime)
plt.plot(dates,closing_prices,color='dodgerblue',
         label='AAPL',linestyle='--',linewidth=2)
plt.legend()
plt.gcf().autofmt_xdate()   #使当前窗口自动格式化日期(x轴坐标叠在一起)

plt.show()

k线图

# 绘制k线图
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt


# 日期转换函数 日月年转年月日
def dmy2ymd(dmy):
    dmy = str(dmy, encoding='utf-8')
    time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
    t = time.strftime('%Y-%m-%d')
    return t


# data=np.loadtxt('../../../sucai/da_data/aapl.csv',delimiter=',',
#                 usecols=(1,3,4,5,6),dtype='M8[D],f8,f8,f8,f8',
#                 converters={1:dmy2ymd}) #将第一列字符串传给这个函数

# 拆开接收
dates, opening_prices, highest_prices, lowest_prices, closing_prices = \
    np.loadtxt('../../../sucai/da_data/aapl.csv',
               delimiter=',',
               usecols=(1, 3, 4, 5, 6), dtype='M8[D],f8,f8,f8,f8',
               unpack=True,
               converters={1: dmy2ymd})  # 将第一列字符串传给这个函数

# 绘制收盘价的折线图
plt.figure('AAPL', facecolor='lightgray')
plt.title('AAPL', fontsize=16)
plt.xlabel('Date', fontsize=14)
plt.ylabel('closing_price', fontsize=14)
plt.grid(linestyle=':')

import matplotlib.dates as md

# 拿到坐标轴
ax = plt.gca()
# 设置主刻度定位器为周定位器(每周一显示主刻度文本)
ax.xaxis.set_major_locator(
    md.WeekdayLocator(byweekday=md.MO))  # MO 每周一一个主刻度
ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y'))
# 设置次刻度定位器为日定位器
ax.xaxis.set_minor_locator(md.DayLocator())  # 每天一个次刻度

dates = dates.astype(md.datetime.datetime)
plt.plot(dates, closing_prices, color='dodgerblue',
         label='AAPL', linestyle='--', linewidth=2, alpha=0.3)

# 绘制蜡烛图

# 整理颜色
# 涨:边缘色红色,填充白色    跌:边缘色绿色,填充绿色
rise = closing_prices > opening_prices
# color=['white' if x else 'green' for x in rise]
color = np.zeros(rise.size, dtype='U5')
color[:]='green'
color[rise]='white'
#边缘色
ecolor=['red' if x else 'green' for x in rise]

# 绘制实体
# 0.8 柱子宽度  opening_prices基准位置
# color填充色  edgecolor边缘色
plt.bar(dates, closing_prices - opening_prices, 0.8, opening_prices,
        color=color, edgecolor=ecolor,zorder=3)
# 绘制影线
plt.vlines(dates, lowest_prices, highest_prices,color=ecolor)

plt.legend()
plt.gcf().autofmt_xdate()  # 使当前窗口自动格式化日期(x轴坐标叠在一起)

plt.show()

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