diff --git "a/docs/views/data/2021-11-26-\346\225\260\346\215\256\345\210\206\346\236\220\347\232\204\350\241\250\347\244\272\345\217\212\345\217\257\350\247\206\345\214\226-ZXH.md" "b/docs/views/data/2021-11-26-\346\225\260\346\215\256\345\210\206\346\236\220\347\232\204\350\241\250\347\244\272\345\217\212\345\217\257\350\247\206\345\214\226-ZXH.md" new file mode 100644 index 00000000..33eaca8b --- /dev/null +++ "b/docs/views/data/2021-11-26-\346\225\260\346\215\256\345\210\206\346\236\220\347\232\204\350\241\250\347\244\272\345\217\212\345\217\257\350\247\206\345\214\226-ZXH.md" @@ -0,0 +1,228 @@ +--- +layout: post +title: 数据分析之表示与可视化 +date: 2021-11-21 +author: 翟小慧 +categories: + - 数据分析部 +tags: + - 数据分析学习 +--- +# 一.文字理论学习部分 +## NumPy库入门 +NumPy是一个开源的Python科学计算基础库,包含: +1.一个强大的N维数组对象 ndarray +2.广播功能函数 +3.整合C/C++/Fortran代码的工具 +4.线性代数、傅里叶变换、随机数生成等功能 +NumPy是SciPy、Pandas等数据处理或科学计算库的基础 + +## NumPy的引用 +```python +import numpy as np*** +``` + +## ndarray数组的创建方法 + +1.从Python中的列表、元组等类型创建ndarray数组 +```python +x=np.array(list/tuple) + +x=np.array(list/tuple,dtype=no.float32) +``` +2.使用NumPy中函数创建ndarray数组,如:arange/ones/zeros等 +3.使用NumPy中其他函数创建ndarray数组 + +## NumPy数据存取与函数 +### CSV文件 +csv文件只能有效存储一维数组和二维数组 +np.savetxt() np.loadtxt()只能有效存取一维和二维数组 +```python +np.savetxt(frame,array,fmt='%.18e',delimiter=None) +np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False) +``` + +### 任意维度数据的存取 +```python +a.tofile(frame,sep='',format='%s') +np.fromfile(frame,dtype-float,cout=-1,sep='') +``` + +## NumPy的统计函数 +NumPy直接提供的统计类函数:np.* +## NumPy的梯度函数 +```python +np.gradient(f)*** +``` + + +## 图像的手绘效果 +### 图像的RGB色彩模式 +RGB三个颜色通道的变化和叠加得到各种颜色,其中 +R 红色,取值范围,0-255 +G 绿色,取值范围,0-255 +B 绿色,取值范围,0-255 + +### PIL库 (Python Image Library) +PIL库是一个具有强大图像处理能力的第三方库,在命令行下的安装方法**pip install pillow** + +### 图像的变换 +读入图像后,获得像素的RGB值,修改后保存为新的文件 + + +利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的远近程度 + +梯度归一化,构造x和y轴梯度的三维归一化单位坐标系 + +图像生成,为避免数据越界,将生成的灰度值裁剪至0-255区间内 + +## Matplotlib库入门 +### Matplotlib库的介绍 +是Python优秀的数据可视化第三方库 +Matplotlib库由各种可视化类构成,内部结构复杂,受Matlib启发 +matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式 +import matplotlib.pyplot as plt(plt是引入模块的别名) + +## pyplot的绘图区域命令 +***plt.subplot(nrows,ncols,plot_number)*** +nrows表示将该区域分为几行 +ncols表示将该区域分为几列 +plot_number表示定位到某一个绘图区域 + +## pyplot的plot()函数 +### ***plt.plot(x,y,format_string,kwargs)*** +x表示**x轴数据**,列表或数组,可选 +y表示**y轴数据**,列表或数组 +format_string表示控制曲线的格式字符串,可选 +kwargs表示第二组或更多(x,y,format_string) +注意:当绘制多条曲线时,各条曲线的x不能省略 + +fotmat_string:控制曲线的格式字符串,由颜色字符、风格字符和标识字符组成 + +## pyplot的中文显示 +### 第一种方法,需要rcParams修改字体实现 +```python + import matplotlib.pyplot as plt + import matplotlib + + matplotlib.rcParams['font.family']='SimHei' + plt.plot([3,1,4,5,2]) + plt.ylabel("纵轴(值)) + plt.savefig('test',dpi=600) + plt.show() +``` +#### rcParams的属性 +|属性|说明| +|---|---| +|'font.family'|用于显示字体的名字| +|'font.style'|字体风格,正常normal或斜体italic| +|'font.size|字体大小,整数字号或者'large''x-small'| + +|中文字体的种类|说明| +|---|---| +|SimHei|中文黑体| +|Kaiti|中文楷体| +|Lisu|中文隶书| +|FangSong|中文仿宋| +|YouYuan|中文幼圆| +|STSong|华文宋体| + +### 第二种方法,增加一个属性:fontproperties +```python + import numpy as np + import matplotlib.pyplot as plt + a=np.arange(0.0,5.0,0.02) + plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=20) + plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=20) + plt.show() +``` +## pyplot的文本显示 +|函数|说明| +|---|---| +|ply.xlabel()|对x轴增加文本标签| +|plt.ylabel()|对y轴增加文本标签| +|plt.title()|对图形整体增加文本标签| +|plt.text()|在任意位置增加文本| +|plt.annotate()|在图形中增加带箭头的注解| + +## pyplot的子绘图区域 +理念:设定网格,选中网格,确定选中行列区数量,编号从0开始 +***plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1)*** + +## GridSpec类 +***import matplotlib.gridspec as gridspec*** + +## Matplotlib基础绘图函数示例 +### 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(theta,r)|绘制极坐标图| +|plt.pie(data,explode)|绘制饼图| +|plt.psd(x,NFFT=256,pad_to,Fs)|绘制功率密度图| +|plt.specgram(x,NFTT=256,pad_to,F)|绘制谱图| +|plt.cohere(x,y,NFTT=256,Fs)|绘制x-y相关函数| +|plt.scatter(x,y)|绘制散点图,其中x和y长度相同| +|plt.step(x,y,where)|绘制步阶图| +|plt.hist(x,bins,normed)|绘制直方图| +|plt.contour(x,y,z,n)|绘制等值图| +|plt.vlines()|绘制垂直图| +|plt.stem(x,y,linefmt,markerfmt)|绘制柴火图| +|plt.plot_date()|绘制数据日期| + +# 实例:引力波的绘制 +在物理学中,引力波是因为时空弯曲对外以辐射形式传播的能量,爱因斯坦基于广义相对论预言了引力波的存在,我们需要绘制最原始的引力波和理想引力波 + + +```python + import numpy as np + import matplotlib.pyplot as plt + from scipy.io import wavfile + + #从配置文档中读取相关数据 + rate_h, hstrain= wavfile.read(r"G:/奇点工作室/引力波绘制的数据源/H1_Strain.wav","rb") + rate_l, lstrain= wavfile.read(r"G:/奇点工作室/引力波绘制的数据源/L1_Strain.wav","rb") + #reftime, ref_H1 = np.genfromtxt('GW150914_4_NR_waveform_template.txt').transpose() + reftime, ref_H1 = np.genfromtxt('G:/奇点工作室/引力波绘制的数据源/wf_template.txt').transpose() #使用python123.io下载文件 + + #读取应变数据 + htime_interval = 1/rate_h + ltime_interval = 1/rate_l + #创建一个大小为12*6的绘图空间 + fig = plt.figure(figsize=(12, 6)) + + # 丢失信号起始点 + htime_len = hstrain.shape[0]/rate_h + htime = np.arange(-htime_len/2, htime_len/2 , htime_interval) + #画出以时间为x轴,应变数据为y轴的图像,并设置标题和坐标轴的标签 + 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("Gravitational_Waves_Original.png") + plt.show() + plt.close(fig) +``` +