(在二维平面坐标系中绘制连续的线)
设置线型、线宽和颜色
设置坐标轴范围
设置坐标刻度
设置坐标轴
图例
特殊点
备注
(图形窗口)
绘图核心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=ln∣x∣+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()
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线图
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线图
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()