Matplotlib库

用于展示数据

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()
matplotlib简介 1.png
matplotlib简介 2.png

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()
plot() 1.png

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()
plot() 2.png

没有给出颜色,系统自动赋予一个不同于其他颜色的颜色
没有给出风格或标记字符,那就默认没有风格或没有标记
没有给出风格和标记字符,那就默认是直线

其他参数命令控制颜色、风格、标记字符等

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()
中文显示 1.png
属性 说明
'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()
···

中文显示 2.png

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()
文本显示 1.png

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()
文本显示 2.png

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()
matplotlib简介 3.png

1.4.2 复杂绘图区

  1. 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))
复杂绘图区 1.png
  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()
绘制饼图 1.png

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()
直方图 1.png

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()
极坐标图 1.png

在角度空间内展示数据的类型

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()
散点图 1.png

面向对象的方法
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)
Gravitational_Waves_Original.png

目录:Python数据分析与展示
一、NumPy库
二、Matplotlib库
三、Pandas库

Python数据分析与展示.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343