首页Python17.Matplotlib...

17.Matplotlib库入门

1.Matliotlib库介绍:

Matliotlib库是Python优秀的数据可视化第三方库,官网为http://matplotlib.org
Matliotlib库的效果见:http://matplotlib.org/gallery.html
Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发。
matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式。导入方式如下:

import matplotlib.pyplot as plt #尽管别名可以省略或者修改,建议使用上述约定的别名

2.Matliotlib库绘制图形:

下面是使用Matplotlib库绘制一个简单的图形并存储成文件的代码,可以看出使用Matliotlib库绘制图形还是很方便的。

import matplotlib.pyplot as plt

plt.plot([3,1,4,5,2]) #绘制一个五个元素的列表的图形
plt.ylabel("Grade") #绘y轴增加一个标签叫Grade,x轴自动生成
# plt.savefig()将输出图形存储为文件,默认PNG格式,可以通过dpi修改输出质量
plt.savefig('test',dpi=600)
plt.show()

生成如下图形:

下面使用Matplotlib库绘制xy轴均有对应数值的图形。

import matplotlib.pyplot as plt

plt.plot([0,2,4,6,8],[3,1,4,5,2]) #当有两个参数时,按照x轴和y轴顺序绘制数据点
plt.ylabel("Grade")
plt.axis([-1,10,0,6]) # 设定x轴y轴尺度的函数
plt.show()

生成如下图形:

3.Matliotlib库绘图区域:

matplotlib所绘制的图位于图片(Figure)对象中,可以使用plt.figue()生成一个新的图片,这时会出现一个空白的绘图窗口。
不过我们不能使用空白的图片进行绘图,需要通过add_subplot()来创建一个或多个子图。

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(2,2,1) # 将图片(Figure)对象划分成2行2列,子图ax1位于第一个位置
ax2 = fig.add_subplot(2,2,2) # 子图ax2位于第二个位置
ax3 = fig.add_subplot(2,2,3) # 子图ax3位于第三个位置

plt.show()

得到如下的子图显示:

最简单分割绘图区域的办法是使用plt.subplot(nrows,ncols,plot_number)函数,将一个绘图区域分割成以第一个参数nrows作为横轴数量,将第二个参数作为纵轴数量的子区域。
使用subplot()函数,在全图绘图区域中创建一个分区体系,并定位到一个子绘图区域。
例如:plt.subplot(3,2,4)将获得如下图所示的绘图区域。

分区域绘图范例:

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

将得到如下效果:

plt.subplot()参数选项:

参数说明
nrows子图的行数
ncols子图的列数
sharex所有子图使用相同的x轴刻度(调整xlim会影响所有子图)
sharey所有子图使用相同的y轴刻度(调整ylim会影响所有子图)
subplot_kw传入add_subplot的关键字参数字典,由于生成子图

默认情况下,matplotlib会在子图的外部和子图之间留有一定的间距,这个间距都是相对于图的高度和宽度来指定的,可以使用图对象的subplots_adjust()方法来改变间距,也可以用作顶层函数。

subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None) # wspace和hspace分别控制图片的宽度和高度百分比

4.颜色、标记与线类型(plot()):

plt.plot(x, y, format_string, **kwargs)
  • x——X轴数据,列表或数组,可选(绘制多条曲线时,各条曲线的x不能省略);
  • y——Y轴数据,列表或数组;
  • format_string——控制曲线的格式字符串(由颜色字符、风格字符和标记字符组成),可选;

颜色字符:

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

风格字符:

风格字符说明风格字符说明
‘_’实线‘__’破折线
‘_.’点划线‘:’虚线
“”无线条

标记字符:

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

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

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

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(10)
plt.plot(a, a*1.5,color='green',linestyle='dashed',marker='o',markerfacecolor='blue',markersize=10)
plt.show()

将颜色字符、风格字符和标记字符组合使用,效果如下:

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

5、pyplot的中文显示方法:

pyplot并不默认的支持中文的显示,如果我们希望显示中文,有两种方法实现。

  • 通过rcParams(matplotlib用于改变全局字体的相关资源库)属性修改字体实现,这个方法会改变全局所有的字体:

rcParams的属性:

属性说明
‘font.family’用于显示字体的名字
‘font.style’字体风格,正常’normal’或斜体’italic’
‘font.size’字体大小,整数字号或者’large’、’x-small’
rcParams[‘font.family’]的属性:
属性说明
:—-::—-:
‘SimHei’中文黑体
‘Kaiti’中文楷体
‘LiSu’中文隶书
‘FangSong’中文仿宋
‘YouYuan’中文幼圆
‘STSong’华文宋体
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family']='STsong' 
matplotlib.rcParams['font.size']=20

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

plt.xlabel('横轴:时间')
plt.ylabel("纵轴:振幅")
plt.plot(a, np.cos(2*np.pi*a),'r--')
plt.show()

得到如下图形:

  • 在有中文输出的地方,通过增加属性fontproperties来实现(建议使用此方法):
import numpy as np
import matplotlib.pyplot as plt

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

plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=20) # 只对xlabel起作用
plt.ylabel("纵轴:振幅",fontproperties='SimHei',fontsize=20) # 只对ylabel起作用
plt.plot(a, np.cos(2*np.pi*a),'r--')
plt.show()

得到如下图形:

6、pyplot的文本显示方法:

函数说明
plt.xlable()对X轴增加文本标签
plt.ylable()对Y轴增加文本标签
plt.title()对图像整天增加文本标签
plt.text()在任意位置增加文本
plt.annotate()在图形中增加带箭头的注解

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

  • xy——箭头所在位置;
  • xytext——文本显示位置;
  • arrowprops——是一个字典类型,定义了箭头显示的一些属性,facecolor表示箭头颜色、shrink表示箭头缩进比率、width表示箭头宽度。
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()在图形上方增加文本标签,其中'$$'表示使用Latex格式,专业排版体系,有自己的Latex语法
plt.title(r'正弦波实例$y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
# plt.annotate()在图形中增加带箭头的注解。
plt.annotate(r'$\mu=100$',xy=(2,1),xytext=(3,1.5),arrowprops=dict(facecolor='black',shrink=0.1,width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.show()

得到如下图形:

7.pyplot的子绘图区域:

绘制子绘图区域前面提到了plt.subplot()方法,但是要绘制复杂的绘图区域可以使用plt.subplot2grid()方法。
该方法的设计理念为,设定网格,选中网格,确定选中行列区域数量,编号从0开始,从而实现对一个自定义网格的使用。

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

  • GridSpec——二元组(m,n),表示将网格分为m行n列;
  • CurSpec——二元组(a,b),表示选择第几个网格,索引从0开始;
  • colspan——表示列的延伸,从前面选定的位置开始在列的方向上延伸设定的长度,默认为1(不合并);
  • rowspan——表示行的延伸,默认为1(不合并)。

通过如下设定:
plt.subplot2grid((3,3),(1,0),colspan=2)
得选中如下区域的网格:

但是每次调用plt.subplot2grid()方法都需要重新对图形的设定做一个约束,例如每次都需要给出(3,3)这样一个方位,我们可以使用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])
ax5 = plt.subplot(gs[2, 1])

通过GridSpec类可以很方便的定位到下面各个网格位置:

Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments