day03--热成像图-极坐标-三维曲面-动画效果-中文字体设置---
20、热成像图
用图形的方式显示矩阵,用元素值对应不同的颜色
mp.imshow(矩阵,cmp=颜色映射,origin=y轴方向)
origin缺省为hight,原点在左上角
origin = 'low' 原点在左下角
示例:
import numpy as np
import matplotlib.pyplot as mp
n = 1000 #样本数
x,y = np.meshgrid(np.linspace(-3,3,n),
np.linspace(-3, 3, n)) #meshgrid网格化点阵
z = (1 - x / 2 + x**5 + y **3) * np.exp(
-x**2 - y**2) #exp表示 e为底,指数为-x**2 - y**2
mp.figure('Hot',facecolor='lightgray')
mp.title('Hot',fontsize=20)
mp.xlabel('x',fontsize=14)
mp.ylabel('y',fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.imshow(z,cmap='jet',origin = 'low')#j热成像图
mp.show()
21、极坐标系
mp.gca(projection='polar') #polar设置为极坐标系
水平坐标x-->极角rho
垂直坐标y-->极径theta
即:mp.plot(x,y,...) ---> mp.plot(t,r,...)
示例一:
import numpy as np
import matplotlib.pyplot as mp
t = np.linspace(0,2*np.pi,1001)
r_spiral = 0.8 * t
r_rose = 5 * np.sin(6 * t)
mp.figure('polar',facecolor='lightgray')
mp.gca(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=':')
# X坐标--> 极角rho
#Y坐标---> 极径theta
mp.plot(t,r_spiral,c='dodgerblue',label=r'$\rho=0.8\theta$')
#正玄曲线在极坐标下变成了花瓣形状
mp.plot(t,r_rose,c='orangered',label=r'$\rho=5sin(6\theta)$')
mp.legend()
mp.show()
22、三维曲面
pycharm中如果不能旋转,设置如下:
File --> settings -->Tools-->Python Scientific 去掉勾
导入模块:from mpl_toolkits.mplot3d improt axes3d
ax = mp.gca(projection='3d')
ax.set_xlabel(...)
...
方法一:三维表面图:
ax.plot_surface(x,y,z,
rstride=y方向行跨距,
cstride=列跨距,cmap=颜色映射)
方法二:三维线框图
ax.plot_wireframe(x,y,z,rstride=行跨距,
cstride=列跨距,linewidth=线宽,color=颜色)
示例:
import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
n = 1000 #样本数
x,y = np.meshgrid(np.linspace(-3,3,n),
np.linspace(-3, 3, n)) #meshgrid网格化点阵
z = (1 - x / 2 + x**5 + y **3) * np.exp(
-x**2 - y**2) #exp表示 e为底,指数为-x**2 - y**2
mp.figure('3D surface',facecolor='lightgray')
ax = mp.gca(projection='3d') #创建三维坐标系
mp.title('3D surface',fontsize=20)
ax.set_xlabel('x',fontsize=14)
ax.set_ylabel('y',fontsize=14)
ax.set_zlabel('z',fontsize=14)
mp.tick_params(labelsize=10)
#mp.grid(linestyle=':')
#绘制三维表面图
ax.plot_surface(x,y,z,rstride=10,cstride=10,cmap='jet')
#---------------------------------------------------------
#以下绘制三维线框图
mp.figure('3D wireframe',facecolor='lightgray')
ax = mp.gca(projection='3d') #创建三维坐标系
mp.title('3D wireframe',fontsize=20)
ax.set_xlabel('x',fontsize=14)
ax.set_ylabel('y',fontsize=14)
ax.set_zlabel('z',fontsize=14)
mp.tick_params(labelsize=10)
#mp.grid(linestyle=':')
#绘制三维线框图
ax.plot_wireframe(x,y,z,rstride=20,cstride=20,
linewidth=0.5,color='dodgerblue')
mp.show()
23、动画效果
pycharm中如果不能显示动画,设置如下:
File --> settings -->Tools-->Python Scientific 去掉勾
import matplotlib.animation as ma
def 更新回调函数(序列号)
更新画面显示
...
见示例一:ma.FuncAnimation(图形窗口,更新回调函数,
interval=时间间隔(毫秒))
每经过一个时间间隔,更新回调函数就会被matplotlib调用一次
见示例二:ma.FuncAnimation(图形窗口,更新回调函数,
生成器函数,interval=时间间隔(毫秒))
用生成器函数yeild作为参数调用更新回调函数
示例一:
import matplotlib.animation as ma
import numpy as np
import matplotlib.pyplot as mp
n_bubbles = 100 # 100个气泡
bubbles = np.zeros(n_bubbles,dtype=[
('position',float,2), # 位置(x,y)
('size',float,1), # 大小
('growth',float,1), # 生长速度
('color',float,4), # 颜色(红,绿,蓝,透明度)
])
#np.random.uniform(最小值,最大值,(维度)) 随机均匀分布
bubbles['position'] = np.random.uniform(0,1,(n_bubbles,2))
bubbles['size'] = np.random.uniform(50,750,n_bubbles)
bubbles['growth'] = np.random.uniform(30,150,n_bubbles)
#颜色为整型,则范围为0-255
#颜色为float,则范围为0-1,这个表示更多
bubbles['color'] = np.random.uniform(0,1,(n_bubbles,4))
mp.figure('Bubbles',facecolor='lightgray')
mp.figure('Bubbles',fontsize=20)
mp.xticks(())
mp.yticks(())
sc = mp.scatter(bubbles['position'][:,0],
bubbles['position'][:,1],
s=bubbles['size'],
c=bubbles['color'])
def update(number):#更新气泡回调函数
bubbles['size'] += bubbles['growth']#更新气泡大小
#确定破裂气泡位置
burst = number % n_bubbles
#更新破裂气泡参数
bubbles['position'][burst] = np.random.uniform(0,1,2)
bubbles['size'][burst] = 0
bubbles['growth'][burst] = np.random.uniform(30,150)
bubbles['color'][burst] = np.random.uniform(0,1,4)
# 设置更新后的气泡
sc.set_offsets(bubbles['position'])
sc.set_sizes(bubbles['size'] )
sc.set_facecolors(bubbles['color'])
#print("update",number)
#FuncAnimation返回值如果没有接收,会马上消失,只有接收后才会执行update中的print
anim = ma.FuncAnimation(mp.gcf(),update,interval=10)#mp.gcf()获得当前绘图对象
mp.show()
示例二:
import matplotlib.animation as ma
import numpy as np
import matplotlib.pyplot as mp
mp.figure('Signal',facecolor='lightgray')
mp.figure('Signal',fontsize=20)
mp.xlabel('Time',fontsize=14)
mp.ylabel('SIG',fontsize=14)
ax = mp.gca()
ax.set_ylim(-3,3)
ax.set_xlim(0,10)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
pl = mp.plot([],[],c='orangered')[0] #获得图形对象,但五缓冲区
pl.set_data([],[]) #设置图形对象的缓冲区,开辟缓冲区
def update(data):#更新回调函数
t,v = data
x,y = pl.get_data()#获得当前所有点
x.append(t)#追加新采集到的点
y.append(v)#追加新采集到的点
#获取当前水平坐标范围
x_min,x_max = ax.get_xlim()
if t >= x_max:
ax.set_xlim(t-(x_max-x_min), t)
ax.figure.canvas.draw()#重新绘制坐标轴
pl.set_data(x,y) #设置曲线的点
def generator(): #定义生成器函数
t = 0
while True:
v = np.sin(2 * np.pi * t) * np.exp(np.sin(0.2 * np.pi * t))
yield t,v
t += 0.05
anim = ma.FuncAnimation(mp.gcf(),update,generator,interval=5)
mp.show()
24、中文字体显示
方法一:https://blog.csdn.net/lw_power/article/details/82994762
方法二:https://www.jianshu.com/p/c0f19f87036f
https://www.jianshu.com/p/15b5189f85a3
方法一示例:
import matplotlib.pyplot as mp
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='C:/Windows/Fonts/msyh.ttc', size=16)
mp.plot([0, 1], [1, 2])
mp.title('显示中文', fontproperties=font)
mp.show()
方法二:配置字体库matplotlibrc
1、查找字体库位置:
import matplotlib
print(matplotlib.matplotlib_fname())
2、进入到matplotlibrc所在位置
1、进入fonts\ttf文件夹,安装新字体
可到C:\Windows\Fonts去复制ttf字体
2、以管理员身份修改matplotlibrc
1、找到font.sans-serif,并将前面‘#’井符号去掉
2、在font.sans-serif添加安装的字体名称
3、使用:
1、程序中
import matplotlib as ml
ml.rcParams['font.sans-serif'] = 'Arial'
Python绘图总结(Matplotlib篇)之字体、文本及注释
https://blog.csdn.net/wuzlun/article/details/80059181
四、numpy的通用函数
1.读取文件/CSV文件
逻辑上可被解释为二维数组的文本文件
数据项1<分隔符>数据项2<分隔符>...<分隔符>数据项n
numpy.loadtxt(路径与文件名,delimiter=分隔符(默认空格),
usecols=(列索引,缺省为所有列),unpack=True,
dtype=元素类型,缺省float,
converters={'列索引号':转换函数} #转换器,缺省为空)
unpack 是否展开列,展开就是变为一维数组,默认为False
返回:二维数组/多个一维数组
代码:cs.py
示例:股票k线图
import numpy as np
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md
def dmy2ymd(dmy):
dmy = str(dmy,encoding='utf-8') #将字符集统一
date = dt.datetime.strptime(dmy,'%d-%m-%Y').date() #将字符串转为日期格式
ymd = date.strftime('%Y-%m-%d') #将日期转为字符串
return ymd
dates,opening_prices,highest_prices,lowest_prices,closeing_prices \
= np.loadtxt(
'./aapl.csv',
delimiter=',',
usecols=(1,3,4,5,6),
unpack=True,
dtype='M8[D],f8,f8,f8,f8',
converters={1:dmy2ymd}
) #dtype不同时,unpack必须为True
#以下绘制股票K线图 英文为:Candlestick
mp.figure('Candlestick',facecolor='lightgray')
mp.title('Candlestick',fontsize=20)
mp.xlabel('Date',fontsize=14)
mp.ylabel('Price',fontsize=14)
ax = mp.gca()
#主刻度为日期,每个点为星期一 import matplotlib.dates as md
ax.xaxis.set_major_locator(
md.WeekdayLocator(byweekday=md.MO))
#设置次刻度为每一天
ax.xaxis.set_minor_locator(md.DayLocator())
#设置水平坐标主刻度格式 #国际格式:%d %b %Y , %b为三位英文月份格式
ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
dates = dates.astype(md.datetime.datetime) #将numpy的日期类型转为matplotlib日期类型
rise = closeing_prices - opening_prices >= 0.01 #阳线掩码
fall = opening_prices - closeing_prices >= 0.01 #阴线掩码
fc = np.zeros(dates.size,dtype='3f4')#填充色
fc[rise],fc[fall] = (1,1,1),(0,0.5,0) #设置填充色
ec = np.zeros(dates.size,dtype='3f4') #边缘色
ec[rise],ec[fall] = (1,0,0),(0,0.5,0) #设置边缘色
mp.bar(dates,highest_prices - lowest_prices,0,
lowest_prices,color=fc,edgecolor=ec
)#用条形图绘制K线的引线
mp.bar(dates,closeing_prices - opening_prices,0.8,
opening_prices,color=fc,edgecolor=ec #color是填充色 edgecolor是边缘色
)#用条形图绘制K线的矩形
mp.gcf().autofmt_xdate() #自动调整水平坐标的日期标签
mp.show()
2.算数平均值
算数平均值表示对真值的无偏估计
样本:S = [s1, s2, .., sn]
算数平均值:m = (s1+s2+...+sn)/n
mean = numpy.mean(S)
代码:mean.py
示例:
import numpy as np
closeing_prices \
= np.loadtxt(
'./aapl.csv',
delimiter=',',
usecols=(6),
unpack=True
)
mean = 0
#以下为普通计算方法
for closeing_price in closeing_prices:
mean += closeing_price
mean /= closeing_prices.size
print(mean)
#以下为Numpy计算方法
mean = np.mean(closeing_prices)
print(mean)
3.加权平均值
样本:S = [s1, s2, ..., sn]
权重:W = [w1, w2, ..., wn]
归一化:N = [n1, n2, ..., nn],
ni = wi/(w1+w2+...+wn)
加权平均:a = (s1w1+s2w2+...+snwn)/
(w1+w2+...+wn)
= s1n1+s2n2+...+snnn
vwap = numpy.average(S,weights=W...)
股票成交量加权平均价格(VWAP,Volume Weighted Average Price)
代码:vwap.py
示例一:
import numpy as np
#VWAP: Valum Weight Average Price 成交量加权平均价格
closeing_prices,volums \
= np.loadtxt(
'./aapl.csv',
delimiter=',',
usecols=(6,7),
unpack=True
)
vwap,wsum = 0,0
#以下为普通计算方法
for closeing_price,volume in zip(closeing_prices,volums):
vwap += closeing_price * volume
wsum += volume
vwap /= wsum
print(vwap)
#以下为Numpy计算方法
mean = np.average(closeing_prices,weights=volums)
print(vwap)
股票时间加权平均价格(TWAP)
代码:twap.py
示例二:
import numpy as np
import datetime as dt
def dmy2days(dmy):
dmy = str(dmy,encoding='utf-8') #将字符集统一
date = dt.datetime.strptime(dmy,'%d-%m-%Y').date() #将字符串转为日期格式
days = (date- dt.date.min).days #dt.date.min是日期原点
return days
days,closeing_prices,volums \
= np.loadtxt(
'./aapl.csv',
delimiter=',',
usecols=(1,6,7),
unpack=True,
converters={1:dmy2days}
)
twap = np.average(closeing_prices,weights=days)
print(twap)