Python数据可视化笔记01--Matplotlib基础

一、Matplotlib库介绍

概述、gallery示例

  • Matplotlib是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
  • Matplotlib库由各种可视化类构成,内部结构复杂。
  • Matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
  • Matplotlib文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源代码。因此如果需要绘制某类图,只需要在这个页面中浏览、复制、粘贴一下,基本上通过修改数据和设置都能搞定。

Matplotlib库网址:https://matplotlib.org/gallery/index.html 

现在,我们来点击第一个缩略图,便可以查看到源代码,如下:

你可以直接将代码复制到jupyter notebook代码框运行,查看运行结果:

# Stacked Bar Graph

import numpy as np
import matplotlib.pyplot as plt
N=5
# 创建四个数据元组
menMeans = (20,35,30,35,27)
womenMeans = (25,32,34,20,25)
menStd = (2,3,4,1,2)
womenStd = (3,5,2,3,3)
ind = np.arange(N)  # the x locations for groups
width = 0.35         # the width of the bars
p1 = plt.bar(ind,menMeans,width,yerr=menStd)   # bar()函数绘制柱状图,ind表示x轴,menMeans为元组名,width柱宽,yerr为误差(小段黑线)
p2 = plt.bar(ind,womenMeans,width,bottom = menMeans,yerr = womenStd)  #bottom表示从后面带的参数开始算起,即menMeans 

plt.ylabel('Scores')    # 列标题
plt.title('Scores by group and gender')  # 整个图标的标题
plt.xticks(ind,('G1','G2','G3','G4','G5'))   # x轴各个柱标题
plt.yticks(np.arange(0,81,10)) # 定义范围[0,81)和单位间距10
plt.legend((p1[0],p2[0]),('Men','Women'))  #  右上角图例 
plt.show()

二、Matplotlib快速绘图

plot函数参数、快速绘图示例

  • matplotlib中的快速绘图的函数库可以通过如下语句载入:
import matplotlib.pyplot as plt
  • 接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象
plt.figure(figsize=(8,4))
  • 通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80.
  • 也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会自动创建一个绘图对象。像上面那个示例一样
  • 如果需要同时绘制多幅图表,可以是给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让他成为当前绘图对象。
  • plot函数的调用方式很灵活,使用关键字参数指定各种属性:

           label:给所绘制的曲线一个名字,此名字在图示(legend)种显示。只要在字符串前后添加"$"符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式

          color:指定曲线的颜色

          linewidth:指定曲线的宽度

          参数“b--”指定曲线的颜色和线型,b--表示blue,线型为---------(自行查找对照表)

  • 可通过一系列函数设置绘图对象的各个属性:

          xlabel/ylabel:设置X轴/Y轴的文字

          title:设置图标的标题

          ylim:设置Y轴的范围

          legend:图例显示

          plt.show():显示出创建的所有绘图对象

plt.xlabel("Times(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
  • 可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定
plt.savefig("test.png",dpi=120)

下面我们通过一个示例来看:

绘制sin(x)和cos(x**2)两条曲线,要求x取值范围0至10、x轴设为"Time(s)"、y轴设为"Vlot"、图名称为PyPlot First Example,并显示图例

步骤:1、导入numpy和matplotlib库;2、设计绘图数据;3、绘制曲线;4、设置相关参数

我们来按照步骤写一下试试看:

发现图虽然画出来了,但是没有图例,而且提示了No handles with labels found to put in legend,我们就发现,上面参数设置时少了东西,虽然有legend(图示),但是没有设置label,所以我们增加语句,如下:

import numpy as np
import matplotlib.pyplot as plt

# 计算绘图数据
x = np.linspace(0,10,100)  # 
y = np.sin(x)
z = np.cos(x**2)

# 绘制曲线
plt.plot(x,y,"r-",label = '$sin(x)$',linewidth = 2)
plt.plot(x,z,"b--",label = '$cos(x**2)$')

# 设置相关参数
plt.xlabel("Time(s)")
plt.ylabel("Vlot")
plt.title("PyPlot First Example")
plt.legend()

plt.show()

输出结果视图:

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.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,makerfmt) 绘制柴火图
plt.plot_date() 绘制数据日期

pyplot的绘图区域

  • 可以用子图来将图样(plot)放在均匀的坐标网格中
  • plt.subplot(nrows,ncols,plot_number)
  • 用subplot函数的时候,需要指明网格的行列数量,以及你希望将图样放在哪一个网格中

例如将一个二维的坐标轴看作是绘图区域,那么他的四个象限为四个网格,分别标号上面两个左1右2,下面两个左3右4,那么用subplot函数表示的时候,如果在第四个区域,则为subplot(2,2,4)表示两行两列第四个网格,看示例:

import matplotlib.pyplot as plt

plt.subplot(2,1,1)
plt.xticks([]),plt.yticks([])  # x轴和y轴标号,设为空
plt.text(0.5,0.5,'subplot(2,1,1)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,1,1)做数据,居中,大小24,透明度为.5

plt.subplot(2,1,2)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5,'subplot(2,1,2)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,1,2)做数据,居中,大小24,透明度为.5

# plt.savefig('../figures/subplot-horizontal.png',dpi=64)
plt.show()

运行结果视图:

matplotlib通过pyplot模块提供了一套和MATLIB类似的绘图API,matplotlib还提供了一个名为pylab的模块,其中包括了许多Numpy和pyplot模块中常用的函数,方便用户速计算和绘图,十分适合在IPython交互式环境中使用,但两者有什么区别呢?

pylab结合pyplot和numpy,对交互式使用来说比较方便,既可以画图又可以简单的计算。但是,对于一个项目来说,建议分别导入使用,即:

import numpy as np

import matplotlib.pyplot as plt

而不是import pylab as pl或from pylab import *

from pylab import *

subplot(1,2,1)
xticks([]),yticks([])
text(0.5,0.5,'subplot(1,2,1)',ha='center',va='center',size=20,alpha=.5)

subplot(1,2,2)
xticks([]),yticks([])
text(0.5,0.5,'subplot(1,2,2)',ha='center',va='center',size=20,alpha=.5)

show()

以此类推我们来看,上下左右四个子图的绘制方式,首先使用pylab模块方式

from pylab import *

subplot(2,2,1)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)

subplot(2,2,2)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)

subplot(2,2,3)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)

subplot(2,2,4)
xticks([]),yticks([])
text(0.5,0.5,'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)

show()

使用matplotlib方式:

import matplotlib.pyplot as plt

plt.subplot(2,2,1)
plt.xticks([]),plt.yticks([])  # x轴和y轴标号,设为空
plt.text(0.5,0.5,'subplot(2,1,1)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,1)做数据,居中,大小24,透明度为.5

plt.subplot(2,2,2)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5,'subplot(2,1,2)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,2)做数据,居中,大小24,透明度为.5

plt.subplot(2,2,3)
plt.xticks([]),plt.yticks([])  # x轴和y轴标号,设为空
plt.text(0.5,0.5,'subplot(2,1,1)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,3)做数据,居中,大小24,透明度为.5

plt.subplot(2,2,4)
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5,'subplot(2,1,2)',ha = 'center',va = 'center',size = 24,alpha = .5)
# 以"subplot(2,2,4)做数据,居中,大小24,透明度为.5

# plt.savefig('../figures/subplot-horizontal.png',dpi=64)
plt.show()

可以看到,方式完全同前面一样,只需要把必要的子图的行和列还有区域号指定好即可。

另外,subplot()函数中的三个参数相乘如果不大于10,中间的逗号是可以省略的,比如subplot(2,2,1)可以写成subplot(221)快去试一下吧。

发布了51 篇原创文章 · 获赞 5 · 访问量 2006

猜你喜欢

转载自blog.csdn.net/MARS_098/article/details/103898312