python3(三)Matplotlib

数据展示Matplotlib

 

正文

主要内容是Matplotlib库的基本使用和方法

1 Matplotlib库

1.1 Matplotlib的介绍

  Python优秀的数据可视化第三方库

  数据可视化就是将数据以特定的图形图像的方式展示出来, 使数据更加的直观明了

  范例网站

  Matplotlib库是由各种可视化类构成, 内部结构复杂

  为了简洁使用, 可以使用matplotlib.pyplot这个绘制各类可视化图形的命令子库, 类似于快捷方式的库来简化操作

  导入

import matplotlib.pyplot as plt

    同样plt也是约定俗成的别名

  基本使用

    使用plt.plot(数组)传入数组, 如果只有一个一维数组, 那么数组的值会指定给Y轴, X轴为他们的索引值

    使用plt.ylabel(名字)设置Y轴的名字

    使用plt.savefig(文件名, dpi=dpi的大小)保存图像为图像文件, dpi一般设置为600, 默认是PNG格式保存

    使用plt.show()在IPython中展示生成的图形

    使用plt.axis([x1, x2, y1, y2])可以设置X轴的起点和终点, Y轴的起点和终点

    相关代码如下

?
1
2
3
4
5
6
7
import matplotlib.pyplot as plt
 
plt.plot([ 0 , 2 , 4 , 6 , 8 ], [ 3 , 1 , 4 , 5 , 2 ])
plt.ylabel( "Y" )
plt.axis([ - 1 , 10 , 0 , 6 ])
plt.savefig( "test" , dpi = 600 )
plt.show()

    相关结果如下

    

  pyplot的绘图区域

    使用plt.subplot(nrows, ncols, plot_number)在全局绘图区域中创建一个分区体系, 然后指定在哪个子区域里绘图

    其中nrows表示横向划分多少的区域, ncols表示纵向划分多少的区域, 子区域的标号是从1开始的, 从上到下从左到右依次排序

    另外在数量小的时候, 这三个参数之间的逗号可以去掉

    具体代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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( 211 )
plt.plot(a, f(a))
 
plt.subplot( 2 , 1 , 2 )
plt.plot(a, np.cos( 2 * np.pi * a), 'r--' )
plt.show()

    具体效果如下

    

1.2 pyplot的plot()函数

  plot()的具体形式如下:

plt.plot(x, y, format_string, **kwargs)

    x: X轴的数据, 可以是列表或者数组, 可选项, 但是当绘制多条曲线的时候, 各条曲线的x不能省略

    y: Y轴的数据, 列表或数组, 必填项

    format_string: 控制曲线的格式的字符串, 可选项

    **kwargs: 第二组或更多的 (x, y, format_string)

    绘制多条图像

?
1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
 
a = np.arange( 10 )
plt.plot(a, 1.5 * a, a, 2.5 * a, a, 3.6 * a, a, 4.5 * a)
plt.show()

    结果为

    

  曲线的格式控制

    format_string由制颜色字符, 风格字符和标记字符组成

    具体有

    

    

    

    更改之前的风格代码

?
1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
 
a = np.arange( 10 )
plt.plot(a, 1.5 * a, 'go-' , a, 2.5 * a, 'rx' , a, 3.6 * a, '*' , a, 4.5 * a, 'b-.' )
plt.show()

    效果为

    

  关于**kwargs

    可以添加更多更详细的参数

    color: 控制颜色, color=”green”

    linestyle: 线条风格, linestyle=”dashed”

    marker: 标记风格, marker=”o”, 这三个和前面的format是对应的, 此外还有

    markerfacecolor: 标记的颜色, markerfacecolor=”blue”

    markersize: 标记的尺寸, markersize=20

    …

1.3 pyplot的中文显示

  默认情况下, pyplot并不支持中文字符, 在最开始的折线图中, 如果设置ylabel()为中文, 则在图像中不能正常显示

  要显示中文有种办法

  1) 使用rcParams

    设置其font.family为中文字符

    具体代码如下

?
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import matplotlib
 
matplotlib.rcParams[ 'font.family' ] = 'SimHei'
plt.plot([ 0 , 2 , 4 , 6 , 8 ], [ 3 , 1 , 4 , 5 , 2 ])
plt.ylabel( "Y轴坐标" )
plt.axis([ - 1 , 10 , 0 , 6 ])
plt.savefig( "test" , dpi = 600 )
plt.show()

    具体效果

    

      其中SimHei是黑体

    具体更多参数

    

    相应的中文字体种类

    

    参考实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
 
matplotlib.rcParams[ 'font.family' ] = 'FangSong'
matplotlib.rcParams[ 'font.size' ] = 20
                   
a = np.arange( 0.0 , 5.0 , 0.02 )
 
plt.xlabel( "X轴: 时间" )
plt.ylabel( "Y轴: 振幅" )
 
plt.plot(a, np.cos( 2 * np.pi * a) + 1 , 'r--' )
plt.savefig( 'test2' , dpi = 600 )
plt.show()

    效果为

  

  2) 增加 fontproperties属性

    在上述的例子中, 可以在xlabel中增加参数fontproperties来限定显示的字体, 用此来解决中文显示

    具体代码如下

?
1
2
3
4
5
6
7
8
9
10
import numpy as np
import matplotlib.pyplot as plt
                   
a = np.arange( 0.0 , 5.0 , 0.02 )
 
plt.xlabel( "X轴: 时间" , fontproperties = "FangSong" , fontsize = 20 )
plt.ylabel( "Y轴: 振幅" , fontproperties = "FangSong" , fontsize = 20 )
 
plt.plot(a, np.cos( 2 * np.pi * a) + 1 , 'r--' )
plt.show()

  两种方法的区别就是第一种是全局修改, 第二种是指定修改

  建议使用第二种方法, 但是为了统一可以使用方法一

1.4 pyplot的文本显示

  常见的文本显示函数是

    

    其中title会在整个图形的正中上放写上文字

  具体实例如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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) + 2 , 'r--' )
 
 
plt.xlabel( "X轴: 时间" , fontproperties = "FangSong" , fontsize = 15 , color = 'green' )
plt.ylabel( "Y轴: 振幅" , fontproperties = "FangSong" , fontsize = 15 )
plt.title(r '正玄波实例$y=cos(2\pi x)$' , fontproperties = "SimHei" , fontsize = 25 )
plt.text( 2 , 3 , r '$\mu=100$' , fontsize = 15 )
 
plt.axis([ - 1 , 6 , 0 , 4 ])
plt.grid( True )
plt.savefig( 'test3' , dpi = 600 )
plt.show()

  效果为

  

  其中$$这种是LeTeX的语法

  title()第一个参数表示横坐标的位置, 第二个参数是纵坐标的位置

  grid(True)增加网格显示

  关于annotate函数

plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)

    s: 要注解的字符串

    xy: 箭头所在的位置, 元组类型

    xytext: 文本显示的位置, 元组类型

    arrowprops: 定义了整个箭头显示的属性, dict()

      facecolor=”颜色” 箭头的颜色

      shrink 起始会按照指定的比例缩进, 这样箭头与两边的内容会留有一下空白

      width 箭头的宽度

  具体代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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) + 2 , 'r--' )
 
 
plt.xlabel( "X轴: 时间" , fontproperties = "FangSong" , fontsize = 15 , color = 'green' )
plt.ylabel( "Y轴: 振幅" , fontproperties = "FangSong" , fontsize = 15 )
plt.title(r '正玄波实例$y=cos(2\pi x)$' , fontproperties = "SimHei" , fontsize = 25 )
plt.annotate(r "$\mu=100$" , xy = ( 2 , 3 ), xytext = ( 3 , 3.5 ), arrowprops = dict (
         facecolor = "black" , shrink = 0.1 , width = 2
         ))
 
plt.axis([ - 1 , 6 , 0 , 4 ])
plt.grid( True )
plt.savefig( 'test3' , dpi = 600 )
plt.show()

  效果为

  

1.5 绘制子绘图区域

  使用subplot可以进行简单的分区, 具体实现复杂的分区需要另一个函数

  plt.subplot2grid() 

plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)

    基本使用方法是: 先将整个布局进行均分, 然后指定一块小区域作为起始点, 然后使用colspan和rowspan来在横向和纵向上增加小块的个数

    GridSpec: 整体划分, 元组类型

    CurSpec: 指定起始小块位置, 元组类型

    colspan: 横向小块数量

    rawspan: 纵向小块数量

    选择实例:

    

  使用GridSpec类可以简化操作

    导入

import matplotlib.gridspec as gridspec

    生成gridspec对象

gs = gridspec.GridSpec(3, 3)

    使用切片的方式来获取

    具体如下

    

2 基础绘图函数

2.1 基础图标函数概述

  使用绘制函数的基本思想:

    图像的种类是繁多的, 我们应该专注于选择与更合适的图表来结合数据, 而不是学习使用所有的函数

  

  

  

2.2 饼图的绘制

  常用于百分比的内容, 尤其是需要对比组成部分, 占有比例的时候, 更是直观

  生成饼图的函数pie

plt.pie(sizes, explode=(), labels=(), autopct="", shadow=False, startangle=90)

    sizes: 元组类型, 各个成分的占比

    explode: 元组类型, 优先级, 优先级高的会突出来, 为0是正常组成部分

    labels: 各个部分对应的标签名字, 要和sizes对应上

    autopct: 显示比例的格式

    shadow: 是否有阴影

    startangle: 起始绘图时候的角度, 和极坐标角度类似

  具体实例

?
1
2
3
4
5
6
7
8
9
10
import matplotlib.pyplot as plt
 
labels = "Python" , "Java" , "C/C++" , "C#" , "Javascript" , "Other"
sizes = [ 31.2 , 19.6 , 15.9 , 7.4 , 3.6 , 22.3 ]
explode = [ 0.1 , 0 , 0 , 0 , 0 , 0 ]
 
plt.pie(sizes, explode = explode, labels = labels, autopct = "%.2f%%" , shadow = True , startangle = 90 )
 
plt.title(r '2015最受欢迎的编程语言' , fontproperties = "SimHei" , fontsize = 15 )
plt.show()

  具体效果

  

  如果希望图形不是侧着的, 可以使用

plt.axis('equal')

2.3 直方图的绘制

  使用hist画直方图

hist(x, bins, normed, histtype, facecolor, alpha)

    x: 处理的数据

    bins: 生成的图形中, 直方(在X轴上直立的长条矩形)的个数

      具体情况是: 找到x中的最小值和最大值, 然后在这个值域中均分bins份, 每一份都是一个小的值域, x中的元素就会对应的落在相应的值域中, Y轴的值就是在这个值域的数量(normed=False时)

    normed: 为True会归一化成概率, 为False时Y轴显示的是数量, 默认为False

    具体代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import matplotlib.pylab as plt
 
np.random.seed( 0 )
mu, sigma = 100 , 20
a = np.random.normal(mu, sigma, size = 100 )
 
 
plt.hist(a, 30 , normed = False , histtype = 'stepfilled' , facecolor = 'b' ,
          alpha = 0.75 )
plt.title( "Histogram" )
 
plt.show()

  效果如下

  

2.4 极坐标的绘制

  绘制极坐标用

ax = plt.subplot(111, projection='polar')

    通过生成一个对象ax, 来绘制极坐标的图像

    通过ax.bar()来设置图像

bar(left, height, width=0.8, bottom=None, **kwargs)

      left: 绘制极坐标时的开始位置, 图中的某个位置

      height: 中心点向边界延伸的长度

      width: 旋转的宽度

  具体代码如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pylab as plt
import numpy as np
 
N = 20
theta = np.linspace( 0.0 , 2 * np.pi, N, endpoint = False )
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
 
ax = plt.subplot( 111 , projection = 'polar' )
bars = ax.bar(theta, radii, width = width, bottom = 0.0 )
 
for r, bar in zip (radii, bars):
     bar.set_facecolor(plt.cm.viridis(r / 10. ))
     bar.set_alpha( 0.5 )
 
plt.show()

  具体效果为

  

2.5 散点图的绘制

  具体代码

?
1
2
3
4
5
6
7
8
import matplotlib.pylab as plt
import numpy as np
 
fig, ax = plt.subplots()
ax.plot( 10 * np.random.random( 100 ), 10 * np.random.randn( 100 ), 'o' )
ax.set_title( "simple Scatter" )
 
plt.show()

  具体效果

  

3 引力波的绘制

3.1 介绍

  引力波是因为时空弯曲对外以辐射形式传播的能量

  爱因斯坦的广义相对论预言了引力波的存在

3.2 编写

  产生时间序列

  读取应变数据

  绘制H1 Strain

  显示并保存图像   

分类: 数据分析


  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值