用于展示数据
1. Matplotlib库入门
Python优秀的数据可视化第三方库
安装
pip install -i https://mirrors.aliyun.com/pypi/simple/ matplotlib
官方图形-代码展示
Matplotlib库由各种可视化类构成,matplotlib.pyplot库是绘制各种可视化图形的命令子库,相当于快捷方式
调用
import matplotlib.pyplot as plt
1.1 plot()
函数
plt.plot(x, y, format_string, **kwargs)
x
:x轴数据,列表或数组,可选
y
:y轴数据,列表或数组
format_string
:控制曲线的格式字符串,可选
**kwargs
:第二组或更多x, y, format_string【多条曲线时,x不能省略】
1.1.1 绘制一条曲线
# 调用matplotlib.pyplot库,并给出约定别名
import matplotlib.pyplot as plt
a = [1, 2, 3, 4]
# 绘图,接收一维参数,默认是y轴的值。x轴是参数的索引
plt.plot(a)
# 设定y轴标签【不能用中文表示】
plt.ylabel('y')
# 将图形存储为文件,默认PNG格式,通过dpi修改输出质量
plt.savefig('\\TDRDIS Book\\编程\\Python应用\\pig\\text', dpi = 600)
# 展示
plt.show()
b = [2, 4, 4, 2]
# 接收2个参数,分别对应xy
plt.plot(a, b)
# 设定xy轴尺度:[x轴起、止值,y轴其起、止值]
plt.axis([-1, 5, 0, 5])
plt.show()
1.1.2 绘制多条曲线
import numpy as np
a = np.arange(10)
a # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
plt.plot(a, a*1.5, a, a*2.5, a, a*3)
plt.show()
format_string
由颜色字符、风格字符和标记字符组成
颜色字符 | 说明 | 颜色字符 | 说明 |
---|---|---|---|
b |
蓝色 | m |
洋红色magenta |
g |
绿色 | y |
黄色 |
r |
红色 | k |
黑色 |
c |
青绿色cyan | w |
白色 |
#008000 |
RGB某颜色 | 0.8 |
灰度值字符串 |
风格字符:表示曲线的样子
风格字符 | 说明 | 风格字符 | 说明 |
---|---|---|---|
'-' |
实线 | '--' |
破折线 |
'-.' |
点划线 | ':' |
虚线 |
'' '' |
无线条 |
标记字符:在曲线中的每个点,采取什么样的风格
标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|---|---|
'.' |
点 | '1' |
下花三角 | 'h' |
竖六边形 |
',' |
像素 | '2' |
上花三角 | 'H' |
横六边形 |
'o' |
实心圈 | '3' |
左花三角 | '+' |
十字 |
'v' |
倒三角 | '4' |
右花三角 | 'x' |
x形 |
'^' |
上三角 | 's' |
实心方形 | 'D' |
菱形 |
'>' |
右三角 | 'p' |
实心五角 | 'd' |
瘦菱形 |
'<' |
左三角 | '*' |
星形 | '|' |
垂直线 |
plt.plot(a, a*1.5, 'go-.', a, a*2.5, '2--', a, a*3, 'y:', a, a*4, 'kp', a, a*5, 'b')
plt.show()
没有给出颜色,系统自动赋予一个不同于其他颜色的颜色
没有给出风格或标记字符,那就默认没有风格或没有标记
没有给出风格和标记字符,那就默认是直线
其他参数命令控制颜色、风格、标记字符等
color
:控制颜色,color = ’green‘;linestyle
:线条风格,linestyle = 'dashed';marker
:标记风格,marker = ‘o'。与上面简写字符一一对应
markerfacecolor
:每一个标记的颜色,markerfacecolor = 'blue';markersize
:每一个标记的大小,markersize = 20
1.2 中文显示
1.2.1 rcParams修改字体
rcParams是pyplot用于改变全局字体的资源库,使用时需要引入matplotlib库
import matplotlib.pyplot as plt
import matplotlib
# 修改字体为中文字体,SimHei是黑体
matplotlib.rcParams['font.family'] = 'SimHei'
a = [1, 2, 3, 4]
plt.plot(a)
plt.ylabel('y的值')
plt.show()
属性 | 说明 |
---|---|
'font.family' |
用于显示字体的名字 |
'font.style' |
字体风格,正常'normal' 斜体'italic'
|
'font.size' |
字体大小,整数字号或者'large' 、x-small'
|
中文字体 | 说明 | 中文字体 | 说明 |
---|---|---|---|
'SimHei' |
黑体 | 'Kaiti' |
楷体 |
'LiSu' |
隶书 | 'FangSong' |
仿宋 |
'YouYuan' |
幼圆 | 'STSong' |
华文宋体 |
1.2.1 fontproperties
局部改变字体,配合fontsize
使用
···pythonimport matplotlib.pyplot as plt
a = [1, 2, 3, 4]
plt.plot(a)
plt.ylabel('y的值', fontproperties = 'SimHei', fontsize = 20)
plt.xlabel('x的值', fontproperties = 'SimHei', fontsize = 40)
plt.show()
···
1.3 文本显示
函数 | 说明 |
---|---|
plt.ylabel() |
对Y轴增加文本标签 |
plt.xlabel() |
对X轴增加文本标签 |
plt.title() |
对图形整体增加文本标签 |
plt.text() |
在任意位置增加文本标签 |
plt.annotate() |
在图形中增加带箭头的注解 |
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴:时间', fontproperties = 'SimHei', fontsize = 15, color = 'green')
plt.ylabel('纵轴:振幅', fontproperties = 'SimHei', fontsize = 15)
# 用一对$$引入Latex格式
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties = 'SimHei', fontsize = 25)
# text(x,y,text):xy的坐标,text:内容
plt.text(2, 1, r'$\mu=100$', fontsize = 20)
plt.axis([-1, 6, -2, 2])
# 在图形中加入网格
plt.grid(True)
plt.show()
plt.annotate(s, xy=arrow_crd, xytext=text_crd,arrowprops=dict)
s
:要注解的字符串
xy=arrow_crd
:箭头所在位置
xytext=text_crd
:文本显示位置
arrowprops=dict
:字典类型,定义整个显示的一些属性
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴:时间', fontproperties = 'SimHei', fontsize = 15, color = 'green')
plt.ylabel('纵轴:振幅', fontproperties = 'SimHei', fontsize = 15)
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties = 'SimHei', fontsize = 25)
# shrink:箭头2段的空白, width:箭头大小
plt.annotate(r'$\mu=100$', xy = (2,1), xytext = (3, 1.5),
arrowprops = dict(facecolor = 'black', shrink = 0.2, width = 2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.show()
1.4 子绘图区域
1.4.1 简单绘图区域
plt.subplot(nrows, ncols, plot_number)
将绘图区分割以
nrows
为行数量,以ncols
为列数量的子区域。
plot_number
:指明当前绘图区在哪个区域
书写时,可将逗号去掉
a = [1, 2, 3, 4]
b = [2, 4, 4, 2]
plt.subplot(2,1,1)
plt.plot(a)
plt.subplot(212)
plt.plot(a, b)
plt.show()
1.4.2 复杂绘图区
-
plt.subplot2grid()
方法
plt.subplot2grid(GridSpec, CurSpec, colspan = 1, rowspan = 1)
能够设定网格,选中网格,确定选中行列区域数量,编号从0开始
GridSpec
:一个元组,将区域分割成什么样的网络形状
CurSpec
:当前选定位置
colspan
:列的延伸
rowspan
:行的延伸
plt.subplot2grid((3,3),(0,0), colspan=3)
plt.subplot2grid((3,3),(1,0), colspan=2)
plt.subplot2grid((3,3),(1,2), rowspan=2)
plt.subplot2grid((3,3),(2,0))
plt.subplot2grid((3,3),(2,1))
- GridSpec类
# 导入GridSpec类[跟上图同样的区域图]
import matplotlib.gridspec as gridspec
# 定义一个3行3列的网格
gs = gridspec.GridSpec(3,3)
# 在行上,选中第0行;在列上所有的列
ax1 = plt.subplot(gs[0,:])
ax2 = plt.subplot(gs[1,:-1])
ax3 = plt.subplot(gs[1:,-1])
ax4 = plt.subplot(gs[2,0])
ax5 = plt.subplot(gs[2,1])
2. 基础绘图函数
重点不是绘制图形,而是给数据找到合适展示方式
pyplot绘图函数 | 说明 |
---|---|
plt.plot(x,y,fmt,···) |
绘制一个坐标图 |
plt.boxplot(data,notch,position) |
绘制一个箱型图 |
plt.bar(left,height,width,bottom) |
绘制一个条形图图 |
plt.barh(width,bottom,left,height) |
绘制一个横向条形图 |
plt.polar(left, height, withd) |
绘制极坐标图 |
plt.pie(date,explode) |
绘制饼图 |
plt.psd(x,NFFT=256,pad_to,Fs) |
绘制功率谱密度图 |
plt.specgram(x,NFFT=256,pad_to,F) |
绘制谱图 |
plt.cohere(x,y,NFFT=256,Fs) |
绘制XY相关性函数 |
plt.scatter(x,y) |
绘制散点图 |
plt.step(x,y,where) |
绘制步阶图 |
plt.hist(x,bins,normed) |
绘制直方图 |
plt.contour(X,Y,Z,N) |
绘制等值图 |
plt.vilnes() |
绘制垂直图 |
plt.stem(x,y,linefmt, markerfmt) |
绘制柴火图 |
plt.plot_date() |
绘制数据日期 |
2.1 饼图
import matplotlib.pyplot as plt
# 定义标签
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
# 定义标签打小
sizes = [15, 30, 45, 10]
# 指出第2块被突出,突出打小为0.1
explode = (0,0.1, 0,0)
# autopct:表示显示百分数的方式;shadow:是二维还是有阴影;startangle:饼图起始角度
plt.pie(sizes, explode=explode, labels=labels, autopct = '%1.1f%%',
shadow=False, startangle=90)
# 绘制过程中,xy方向应该是相等的
plt.axis('equal')
plt.show()
2.2 直方图
对于一个有若干元素的数组a,最小值和最大值之间构成一个取值范围。直方图是将取值范围均等的划分bin个区间,图形表示在某个区间有多少个元素
如,1,1,1,1,3。划分2个bin,其中4个1在第1个bin区间
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
mu, sigma = 100, 2
a = np.random.normal(mu, sigma, size = 100)
# bins= 20:表示生产图形中直方的个数
# density = 1:将每一个直方中出现元素的个数归一化为出现的概率
# density = 0:表示直方中出现元素的个数
plt.hist(a, 20, density = 1, histtype = 'stepfilled', facecolor = 'b', alpha = 0.75)
plt.title('Histogran')
plt.show()
2.3 极坐标图
plt.polar(left, height, withd)
left
:表示,极坐标中,颜色区域从哪开始,表示图中某一个位置
height
:表示中心的向边缘绘制的长度
withd
:宽度,即每个绘图区域的面积,这个面积是在角度范围内辐射
import matplotlib.pyplot as plt
import numpy as np
# 给出极坐标图中的个数
N= 20
# 从0-360度,按照个数等分出N个不同角度
theta = np.linspace(0.0, 2*np.pi, N, endpoint=False)
# 生成N个一维的数组,对应每个角度对应的值
radii = 10 * np.random.rand(N)
# 给出宽度值,一组数组
width = np.pi / 4 * np.random.rand(N)
# 设定绘图区域,并通过projection = 'polar'给出绘制极坐标图指示
# 采用面向对象绘制极坐标图
ax = plt.subplot(111, projection = 'polar')
# 将绘图区域赋值与一个参数
# ax是一个对象,采用bar方法将3个参数给bars
bars = ax.bar(theta, radii, width = width, bottom = 0.0)
# 采用for循环对每个区域进行设定
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r / 10))
bar.set_alpha(0.5)
plt.show()
在角度空间内展示数据的类型
2.4 散点图
plt.scatter(x,y)
'''面向对象绘制散点图'''
import numpy as np
import matplotlib.pyplot as plt
# 将subplots()函数变成一个对象
# 给出2个参数,分别对应生成的图表,以及图表相关的区域
# plt.subplots():表明绘制区域是111,即只有一个绘制区域
fig, ax = plt.subplots()
# 在当前绘制区域(ax),绘制其中的点
# 'o':设定每一个点的类型
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
# 设定标题
ax.set_title('Using hyphen instead of Unicode minus')
plt.show()
面向对象的方法
plot()
函数和标题设置函数,变成对象的方法,而不再是plt
下面的函数
3. 引力波绘制
引力波:因为时空弯曲对外以辐射形式传播的能量
数据源:2个声音文件(真是宇宙引力波数据),1个txt文件(由科学家生成的希望用于对比的引力波模板文件)
# 科学计算库
import numpy as np
# 绘图库
import matplotlib.pyplot as plt
# 读取波形文件库
from scipy.io import wavfile
# 读取音频文件
rate_h, hstrain= wavfile.read(r"E:\TDRDIS Book\编程\Python应用\引力波数据源\H1_Strain.wav","rb")
rate_l, lstrain= wavfile.read(r"E:\TDRDIS Book\编程\Python应用\引力波数据源\L1_Strain.wav","rb")
# reftime是时间序列,ref_H1是数据
# np.genfromtxt()执行2个循环,1)将文件的每一行都转化成字符串,2)将每个字符串转化成相应的数据类型
# transpose() 将数据转置
reftime, ref_H1 = np.genfromtxt(r'E:\TDRDIS Book\编程\Python应用\引力波数据源\wf_template.txt').transpose()
# 得到波形的时间间隔
htime_interval = 1/rate_h
ltime_interval = 1/rate_l
# 创建一个大小为12*6的绘图空间
fig = plt.figure(figsize=(12, 6))
# 丢失信号起始点
# hstrain是一个数据矩阵,shape[0]表示读取矩阵的第一维度的长度,即数据个数,
# /rate_h:得到函数在坐标轴中的总长度
htime_len = hstrain.shape[0]/rate_h
# 以原点为中心,设置起止点,以htime_interval为时间间隔
htime = np.arange(-htime_len/2, htime_len/2 , htime_interval)
# 在第1个子图绘制图片
plth = fig.add_subplot(221)
plth.plot(htime, hstrain, 'y')
plth.set_xlabel('Time (seconds)')
plth.set_ylabel('H1 Strain')
plth.set_title('H1 Strain')
ltime_len = lstrain.shape[0]/rate_l
ltime = np.arange(-ltime_len/2, ltime_len/2 , ltime_interval)
pltl = fig.add_subplot(222)
pltl.plot(ltime, lstrain, 'g')
pltl.set_xlabel('Time (seconds)')
pltl.set_ylabel('L1 Strain')
pltl.set_title('L1 Strain')
pltref = fig.add_subplot(212)
pltref.plot(reftime, ref_H1)
pltref.set_xlabel('Time (seconds)')
pltref.set_ylabel('Template Strain')
pltref.set_title('Template')
# 自动调节图像外部边缘
fig.tight_layout()
# 保存图像
plt.savefig(r"E:\TDRDIS Book\编程\Python应用\pig\Gravitational_Waves_Original.png")
plt.show()
plt.close(fig)
目录:Python数据分析与展示
一、NumPy库
二、Matplotlib库
三、Pandas库