【2】数据分析之展示

单元4:Matplotlib库入门

Matplotlib库介绍

Python优秀的数据可视化第三方库。
效果:http://matplotlib.org/gallery.html

Matplotlib库的使用

Matplotlib库由各种可视化类构成,内部结构复杂。
maplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式。

import matplotlib.pyplot as plt

例如:

import matplotlib.pyplot as plt
plt.plot([3, 2, 1, 4, 5])
plt.ylabel("grade")
plt.show()

效果为


示例效果

横坐标为0~4的整数,纵坐标为输入的数据。

在倒数第二行加入:

plt.savefig('test', dpi = 600)  ##文件名为test,dpi为600

可以储存图片。默认PNG格式。

输入两个列表:

import matplotlib.pyplot as plt
plt.plot([0, 2, 4, 6, 8], [3, 2, 1, 4, 5])  ##前一个数组为横坐标,后一个为纵坐标
plt.ylabel("grade")
plt.axis([-1, 10, 0, 6])   ##横轴坐标范围为-1~10,纵轴坐标范围为0~6
plt.show()
示例图片

pyplot绘图区域
创建一个分区体系,并定位到其中一个区域进行绘制。

plt.subplot(nrows, ncols, plot_number)

将绘图区域分割为nrows行,ncols列的区域,当前绘图为第plot_number区。(左上角为第一个区域)
例如:

import numpy as np
import matplotlib.pyplot as plt

def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

a = np.arange(0.0, 5.0, 0.02)

plt.subplot(2,1,1)
plt.plot(a, f(a))

plt.subplot(2,1,2)
plt.plot(a, np.cos(2*np.pi*a), 'r--')  ##采用红色,虚线
plt.show()
分区绘制实例

pyplot的plot()函数

plt.plot(x, y, format_string, **kwargs)
  • x:横轴数据,列表或数组,可选。
  • y:纵轴数据,列表或数组。
  • format_string:控制曲线的格式字符串,可选。
  • **kwargs:第二组或更多(x, y, format_string)

绘制多条曲线

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(10)
plt.plot(a, a*1.5, a, a*2.5, a, a*3.5, a, a*4.5)

plt.show()
绘制多条曲线

format_sring控制格式

由颜色字符、风格字符和标记字符组成。
颜色字符

颜色字符 说明 颜色字符 说明
'b' 蓝色 'm' 洋红色
'g' 绿色 'y' 黄色
'r' 红色 'k' 黑色
'c' 青绿色 'w' 白色
'#008000' RGB某颜色 '0.8' 灰度值字符串

风格字符

风格字符 说明
'-' 实线
'--' 破折线
'-.' 点划线
':' 虚线
'''' 无线条

例如:

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(10)
plt.plot(a, a*1.5, a, a*2.5, '--', a, a*3.5, '-.', a, a*4.5, ':')

plt.show()
风格控制字符

标记字符:每个数据点采取的标记风格。

标记字符 说明 标记字符 说明 标记字符 说明
'.' 点标记 '1' 下花三角标记 'h' 竖六边形标记
',' 像素标记 '2' 上花三角标记 'H' 横六边形标记
'o' 实心圈表 '3' 左花三角标记 '+' 十字标记
'v' 倒三角标记 '4' 右花三角标记 'x' x标记
'^' 倒三角标记 's' 实心方形标记 'D' 菱形标记
'>' 右三角标记 'p' 实心五角标记 'd' 瘦菱形标记
'<' 左三角标记 '*' 星形标记 'l' 垂直线标记

例如:

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(10)
plt.plot(a, a*1.5, 'go-', a, a*2.5, 'rx--', a, a*3.5, '*', a, a*4.5, 'b:')

plt.show()
风格控制

其他参数:

  • color:控制颜色,color = 'green'
  • linestyle:线条风格,linestyle = 'dashed'
  • marker:标记风格,marker = 'o'
  • markerfacecolor:标记颜色,markerfacecolor = 'blue'
  • markersize:标记尺寸,markersize = 20
    ...

pyplot的中文显示

第一种方法

pyplot不默认支持中文显示,需要使用rcParams修改字体。
例如:

import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family'] = 'SimHei'  ##'SimHei'为黑体
plt.plot([3, 1, 5, 4, 2])
plt.ylabel("纵轴")
plt.show()
插入中文示例

rcParams的属性

属性 说明
'font.family' 用于显示字体的名字
'font.style' 字体风格,'normal'正常,'italic'斜体等
'font.size' 字体大小,整数字号或'large'、'x-small'等

中文字体

中文字体 说明
'SimHei' 黑体
'Kaiti' 楷体
'LiSu' 隶书
'FangSong' 仿宋
'YouYuan' 幼圆
'STSong' 华文宋体

将所有字体改为统一的字体

第二种方法

在有中文输入的地方,增加一个属性:fontproperties
例如:

import matplotlib.pyplot as plt

plt.plot([3, 1, 5, 4, 2])
plt.ylabel("纵轴", fontproperties = 'SimHei', fontsize = '20')
plt.show()
中文示例

第二种方法只在中文输入的地方确定字号和字体,建议使用。

pyplot的文本显示

文本显示函数

函数 说明
plt.xlabel() plt.ylabel() 对x轴、y轴增加文本标签
plt.title() 对图形整体增加文本标签
plt.text() 在任意位置增加文本
plt.annotate() 在图形中增加带箭头的注解

正弦波绘制实例:

import numpy as np
import matplotlib.pyplot as plt

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) #公式用Latex语法表示
plt.text(2, 1, r'$\mu = 100$', fontsize = 15)  #文本的位置是x=2, y=1的位置

plt.axis([-1, 6, -2, 2])
plt.grid(True)  #加入网格曲线
plt.show()
文本示例

对于plt.anotate()函数,

plt.anotate(s, xy = arrow_crd, xytext = text_crd, arrowprops = dict)
  • s:文本
  • xy:箭头的位置
  • xytext:文本的位置
  • arrowprops:字典类似,一些属性
import numpy as np
import matplotlib.pyplot as plt

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) 
plt.annotate(r'$\mu = 100$', xy = (2,1), xytext = (3, 1.5), arrowprops = dict(facecolor = 'black', shrink = 0.1, width = 2))  #xy,xytext为元组类型,facecolor为箭头颜色,width为箭头宽度,shrink为留白,即箭头离规定位置和文本位置距离的比例

plt.axis([-1, 6, -2, 2])
plt.grid(True)  
plt.show()
绘制箭头示例

pyplot的子绘图区域

复杂的子绘图区域


更加复杂的绘图区域
plt.subplot2grid(GridSpec, CurSpec, colspan = 1, rowspan = 1)

理念:设定网格,选中网格,确定选中行列区域数量,编号从0开始。

例如,选定图片中的ax2.

plt.subplot2grid((3,3), (1,0), clospan = 2)

其中,(3,3)表示将绘图区域分为3x3的区域。(1,0)表示选定第二行第一列为起始(左上角),clospan=2表示占2列的区域。

GridSpec类

可以用gridspec类简化设计

import matplotlib.gridspec as gridspec

gs = gridspec.GridSpec(3,3)

ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :-1])
ax3 = plt.subplot(gs[1:, -1])
ax4 = plt.subplot(gs[2, 0])

关键:选择恰当的类型展示数据。

单元5:Matplotlib基础绘图函数实例(5个实例)

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, NFFT = 256, pad_to, F) 绘制谱图
plt.cohere(x, y, NFFT = 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() 绘制数据日期

pyplot饼图的绘制

import matplotlib.pyplot as plt

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'  #确定标签
sizes = [15, 30, 45, 10]  #确定每份的值
explode = (0, 0.1, 0, 0)  #突出显示第三份

plt.pie(sizes, explode = explode, labels = labels, autopct = '%1.1f%%', shadow = False, startangle = 90)  #autopact表示显示百分数的方式,shadow为阴影。startangle为起始角度。

plt.axis('equal')  #正圆形
plt.show()
饼图绘制示例

pyplot直方图的绘制

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
mu, sigma = 100, 20  #均值和标准差
a = np.random.normal(mu, sigma, size = 100)

plt.hist(a, 20, normed = 1, histtype = 'stepfilled', facecolor = 'b', alpha = 0.75)  #第二个参数:bin:直方的个数。alpha:颜色浓度。
plt.title('Histogram')

plt.show
直方图绘制示例

pyplot极坐标的绘制

采用面向对象方式进行绘制。

import numpy as np
import matplotlib.pyplot as plt

N = 20  #数据的个数
theta = np.linspace(0.0, 2*np.pi, N, endpoint = False)  #按照个数将0~2pi角度等分
radii = 10 * np.random.rand(N)  #给出每个数据的值
width = np.pi/4*np.random.rand(N)  #给出宽度值

ax = plt.subplot(111, projection = 'polar')  #ax为一个对象。创建一个绘图区域,绘制极坐标图。采用面向对象的方法绘制极坐标图
bars = ax.bar(theta, radii, width = width, bottom = 0.0)  #输入极坐标图的参数。theta开始角度,对应left。radii数据值,对应height。width数据宽度。bottom为起始数据值。

for r, bar in zip(radii, bars):  #对颜色进行设定
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.5)

plt.show()
极坐标图示例

pyplot散点图的绘制

使用面向对象方法绘制散点图。推荐绘制方式。

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()  #内容为空,表示只有一个绘图区域
ax.plot(10 * np.random.randn(100), 10*np.random.randn(100), 'o')  #横轴数据,纵轴数据,数据点格式
ax.set_title('Simple Scatter')

plt.show()
散点图绘制示例

单元6:实例2:引力波的绘制

“引力波的绘制”实例介绍

物理学中,引力波是因为时空弯曲对外以辐射形式传播的能量。
数据源:
http://python123.io/dv/grawave.html
实测数据:
http://python123.io/dv/H1_Strain.wav
http://python123.io/dv/L1_Strain.wav
理论数据:
http://python123.io/dv/wf_template.txt

“引力波的绘制”实例绘制

产生时间序列

从配置文件中读取时间相关数据

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile  #读取波形文件

rate_h, hstrain = wavfile.read(r'H1_Strain.wav', 'rb')  #速率rate,数据strain
rate_l, lstrain = wavfile.read(r'L1_Strain.wav', 'rb')
reftime, ref_H1 = np.genfromtet('wf_template.txt').transpose()  #时间序列和数据。读取引力波模型。读取出的数据为2行矩阵。用transpose进行转置

读取应变数据

htime_interval = 1/rate_h
ltime_interval = 1/rate_l  #计算速率的倒数,为时间间隔

htime_len = hstrain.shape[0]/rate_h  #读取矩阵第一维度的长度。除以rate,得到函数在坐标轴上的总长度
htime = np.arange(-htime_len/2, htime_len/2, htime_interval)  #绘制以原点为对称的图像。
ltime_len = lstrain.shape[0]/rate_l  
ltime = np.arange(-ltime_len/2, ltime_len/2, ltime_interval)

绘制H1 Strain

fig = plt.figure(figsize = (12, 6))  #创建一个大小为12*6的绘图空间

plth = fig.add_subplot(221)  #将绘图区域划分为2*2的区域,在第一个区域绘制图像
plth.plot(htime, hstrain, 'y')
plth.set_xlabel('Time(Seconds)')
plth.set_ylabel('H1 Strain')
plth.set_title('H1 Strain')

绘制L1 Strain 和 Template

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.show()

总代码:

#引力波绘制

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile  #读取波形文件

rate_h, hstrain = wavfile.read(r'H1_Strain.wav', 'rb')  #速率rate,数据strain
rate_l, lstrain = wavfile.read(r'L1_Strain.wav', 'rb')
reftime, ref_H1 = np.genfromtxt('wf_template.txt').transpose()  #时间序列和数据。读取引力波模型。读取出的数据为2行矩阵。用transpose进行转置

htime_interval = 1/rate_h
ltime_interval = 1/rate_l  #计算速率的倒数,为时间间隔

htime_len = hstrain.shape[0]/rate_h  #读取矩阵第一维度的长度。除以rate,得到函数在坐标轴上的总长度
htime = np.arange(-htime_len/2, htime_len/2, htime_interval)  #绘制以原点为对称的图像。
ltime_len = lstrain.shape[0]/rate_l  
ltime = np.arange(-ltime_len/2, ltime_len/2, ltime_interval)

fig = plt.figure(figsize = (12, 6))  #创建一个大小为12*6的绘图空间

plth = fig.add_subplot(221)  #将绘图区域划分为2*2的区域,在第一个区域绘制图像
plth.plot(htime, hstrain, 'y')
plth.set_xlabel('Time(Seconds)')
plth.set_ylabel('H1 Strain')
plth.set_title('H1 Strain')

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.show()
引力波图像

你可能感兴趣的:(【2】数据分析之展示)