0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

慢慢探秘Matplotlib的强大之处

电子工程师 来源:lp 2019-03-07 14:41 次阅读

Matplotlib是Python中最流行的绘图库,它模仿MATLAB中的绘图风格,提供了一整套与MATLAB相似的绘图API,通过API,我们可以轻松地绘制出高质量的图形。

开场例子

我们以中国银行股票收盘价曲线作为例子来作为开场。首先我们通过pandas导入数据,并提取出收盘价一列:

ChinaBank=pd.read_csv('data/ChinaBank.csv',index_col='Date')ChinaBank=ChinaBank.iloc[:,1:]ChinaBank.index=pd.to_datetime(ChinaBank.index)Close=ChinaBank.Close

我们来绘制2014年中国银行股票收盘价的走势图:

.plot(Close['2014'])plt.show()

是不是很简单,接下来,我们一起去慢慢探秘Matplotlib的强大之处

修改绘图属性

2.1 坐标

更改坐标范围绘图时往往需要修改横纵坐标轴的范围,以使曲线位于图形的中间位置:

plt.plot([1,1,0,0,-1,0,1,1,-1])plt.show()

我们可以通过ylim方法修改y轴的范围,比如我们想修改为(-1.5,1.5),同理,我们可以通过xlim方法来修改x轴的坐标范围:

plt.plot([1,1,0,0,-1,0,1,1,-1])plt.ylim(-1.5,1.5)plt.show()

设定坐标轴标签和旋转我们可以通过xticks()和yticks()函数设定坐标的标签,两个函数主要有以下两个参数:location:指坐标的位置.

labels:对应的坐标位置显示的标签.

两个参数一般是等长的数组,该函数另一个常用的参数是rotation参数,可以对坐标标签进行适当的旋转,看下面的例子:

plt.plot([1,1,0,0,-1,0,1,1,-1])plt.ylim(-1.5,1.5)plt.xticks(range(9),['02-01','02-02','02-03','02-04','02-05','02-06','02-07','02-08','02-09'],rotation=45)plt.show()

可以看到X坐标由原来的数值1,2,3变成了我们设置的日期,同时标签与X轴成45度角.

2.2 添加文本

添加标题添加标题可以通过title函数来实现,该函数主要有两个参数,第一个是str,指明标题的内容,第二个是loc,指明标题的位置,可以选择center,left或者right,默认是center

plt.plot(Close['2014'])plt.title('中国银行2014年收盘价曲线',loc='right')plt.show()

可以看到,在mac的Ipython环境下,中文是无法正常显示的,我们可以通过下面的方法解决:

frommatplotlib.font_managerimportFontManager,FontPropertiesdefgetChineseFont():returnFontProperties(fname='/System/Library/Fonts/PingFang.ttc')plt.plot(Close['2014'])plt.title('中国银行2014年收盘价曲线',loc='right',fontproperties=getChineseFont())plt.show()

设置坐标轴标签设置坐标轴标签可以通过xlabel和ylabel函数来实现

plt.plot(Close['2014'])plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.show()

增加图形背景grid绘图时常常会在图形背景中增添方格,以便于人们更直观地读取线条中点的坐标取值以及线条整体的分布范围.可以使用grid函数增加和设定图形的背景.

函数原型:matplotlib.pyplot.grid(b=None,which='major',axis='both',**kwargs)

参数b,设定是否显示grid,如果要显示grid,将b参数设置为True、参数which,设定坐标轴的分割标示线的类型,取值为major、minor或者both,默认为major,表示以原本的坐标轴分割标示线为准;若取值为minor,则进一步细分坐标轴分割标示线,但是分割标准要提前设定,如果只是设定值为minor,则grid不会显示;both表示大小区间坐标轴分割线都有参数axis,指定绘制grid 的坐标轴,取值为both,x或y。

plt.plot(Close['2014'])plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()

增加图例当多条曲线显示在同一张图中时,图例可以帮助我们区分识别不同的曲线,在中国银行的数据中,我们可以把开盘价和收盘价同时放在一张曲线图中,并为二者增加图例.

增加图例使用legend()函数,legend函数中最常见的一个参数是loc参数,表示图例在图中显示的位置,我们一般设置为best就好,表示在图中最适宜的位置显示图例成功增加图例的前提是在绘图时提供label属性值,label属性值就是图例上的文本,同时我们还要注意中文显示的问题。

Open=ChinaBank.Openplt.plot(Close['2014'],label='收盘价')plt.plot(Open['2014'],label='开盘价')plt.legend(loc='best',prop=getChineseFont())plt.show()

2.3 多种线条属性

线条的类型在绘制曲线时,除了绘制实线外,还可以绘制虚线,plot函数中的linestyle参数用于设置曲线类型,为了书写方便,有时候用ls代替linestyle。有如下的常见取值:

类型 名称取值 符号取值
实线 'solid' '-'
虚线 'dashed' '--'
线点 'dashdot' '-.'
点线 'dotted' ':'
不画线 'None' ' '

plt.plot(Close['2014'],label='收盘价',linestyle='solid')plt.plot(Open['2014'],label='开盘价',ls='-.')plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()

图形的颜色修改图形的颜色通过plot函数中的color参数来设置,也可以简写成c,最常用的颜色指定方式是指定颜色的名称或者简写,也可以通过RGB数组来设置.

plt.plot(Close['2014'],label='收盘价',c='r',linestyle='solid')plt.plot(Open['2014'],label='开盘价',c='b',ls=':')plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()

点的形状类型除了设置线条类型外,还可以设置数据点的形状,图形的形状通过marker参数来设置.marker参数主要有下面的取值:

类型 名称取值 符号取值
'point' '.'
圆圈 'circle' 'o'
向下三角形 'triangle_down' 'v'
向上三角形 'triangle_up' '^'
向左三角形 'triangle_left' ' <'
向右三角形 'triangle_right' '>'
正方形 'square' 's'
五边形 'pentagon' 'p'
六边形 'hexagonal' 'h'
加号 'plus' '+'
叉号 'x' 'x'
钻石 'diamond' 'D'
星号 'star' '*'
竖线 'line' ' '

plt.plot(Close['2014'],label='收盘价',c='r',marker='o',linestyle='solid')plt.plot(Open['2014'],label='开盘价',c='b',marker='v',ls='-.')plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()

线条宽度线条宽度可以通过plot函数中的linewidth函数指定,也可简写为lw

plt.plot(Close['2014'],label='收盘价',c='r',marker='o',linestyle='solid',linewidth=1)plt.plot(Open['2014'],label='开盘价',c='b',marker='>',ls='-.',lw=3)plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()

前面讲到的线条的类型,图形的颜色和点的形状类型,可以合为一个属性,使用他们的符号取值将其拼接,这个参数的位置是有限制的,比如在下面的代码中,它只能放在label前面,在label参数后面则会报错.

plt.plot(Close['2014'],'--rD',label='收盘价',linewidth=1)plt.plot(Open['2014'],'--b>',label='开盘价',lw=3)plt.legend(loc='best',prop=getChineseFont())plt.xlabel('日期',fontproperties=getChineseFont())plt.ylabel('收盘价',fontproperties=getChineseFont())plt.title('中国银行2014年收盘价曲线',loc='center',fontproperties=getChineseFont())plt.grid(True,axis='y')plt.show()

常见图形绘制

3.1 柱状图

在刚才的收盘价数据中,统计收盘价落在(2,3],(3,4],(4,5],(5,6]的天数,分别有228,35,81,1天,我们来绘制柱状图:

plt.bar(left=[2,3,4,5],height=[228,35,81,1],bottom=2,width=1,color='r',edgecolor='b')

使用barh函数可以绘制水平柱状图:

plt.bar(left=[2,3,4,5],height=[228,35,81,1],bottom=2,width=1,color='r',edgecolor='b')

3.2 直方图

柱状图主要用于展示定性数据的分布,对于定量数据的分布,一般使用直方图来呈现。绘制直方图用pyplot包中的hist函数来实现,主要有以下几个参数:bins用于设置直方图分布区间的个数;range用于设置直方图的小矩形的最小值与最大值;orientation用于设置直方图的水平或者垂直显示,默认是竖直的直方图,可以将orientation设置为horizontal使其变为水平直方图.

plt.hist(Close,bins=12)

plt.hist(Close,bins=12,orientation='horizontal')

也可以绘制累积分布直方图,将参数cumulative设置为True即可:

plt.hist(Close,range=(2.3,5.5),orientation='vertical',cumulative=True,color='r',edgecolor='b')

3.3 饼图

绘制饼图使用pie方法,主要参数有:labels:用于设置扇形图的标签colors:用于设置扇形图的颜色shadow:用于设定扇形图是否有阴影

plt.pie([228,35,81,1],labels=('(2,3]','(3,4]','(4,5]','(5,6]'),colors=('b','g','r','c'),shadow=True)

3.4 箱线图

箱线图也是在分析数据时经常用到的一种图形,正如其名,箱线图由一个矩形和两条线组成,矩形的上边和下边分别是变量的上下四分位数,中间的一条线表示数变量的中位数。在矩形的上下两边各延伸出一条线,每条线的长度一般为1.5倍的四分位距(上下四分位数之差),这两条线被视为异常值截断线,上端的线为上边缘线,下端的线为下边缘线,在线的外面可能还会有一些点,这些点一般会被认为是异常值。箱线图能够很直观地表示出一个变量的分布,也有助于检测异常值。

pyplot的boxplot函数用于绘制箱线图,主要有以下几个参数:notch:表示箱线图的类型,默认为False,即绘制矩形箱线图,如果取值为True,表示绘制锯齿状箱线图labels:表示箱形图的标签,一般为字符串序列类型

importnumpyasnpprcData=ChinaBank.iloc[:,:4]data=np.array(prcData)plt.boxplot(data,labels=('Open','High','Low','Close'))plt.title('中国银行股票箱线图',fontproperties=getChineseFont())

多图绘制

除了上面介绍的,Matplotlib的另一大特色是面向对象的绘图,类比生活中的用纸笔绘图,我们来解释Matplotlib面向对象绘图在使用生活中纸笔画图时,我们需要先找到一张白纸,在白纸上绘图。对于Matplotlib来说,绘图之前需要先创建一个Figure对象,Figure对象是一个空白区域,然后我们就可以在上面进行绘图。Figure对象可通过pyplot包中的figure函数来创建。

fig=plt.figure(1)

在这张白纸上,我们可以选择较大区域,指画一个收盘价折线图,如果想要节约用纸或者对比两个价格序列,可以将这个纸分成两个区域,分别绘制收盘价折线图和开盘价折线图。在Matplotlib绘图中,每个Figure对象可以包含一个或者几个Axes对象.每个Axes对象即一个绘图区域,拥有自己独立的坐标系统,假设我们现在需要两个区域,分别绘制中国银行股票的开盘价走势和收盘价走势,我们可以创建两个Axes对象.

ax1=fig.add_axes([0.1,0.1,0.3,0.3])ax2=fig.add_axes([0.5,0.5,0.4,0.4])

可以看到在创建Axes对象时传入了一个数值型list,list的前两个元素决定了Axes的左下角坐标,而第三个和第四个参数决定了Axes的长和宽接下来,我们基本就可以按照之前介绍的知识进行绘图了:

fig=plt.figure(1)ax1=fig.add_axes([0.1,0.1,0.3,0.3])ax2=fig.add_axes([0.5,0.5,0.4,0.4])ax1.plot(Close[:10])ax1.set_title('前十个交易日收盘价',fontproperties=getChineseFont())ax1.set_xlabel('日期',fontproperties=getChineseFont())ax1.set_ylabel('收盘价',fontproperties=getChineseFont())ax1.set_ylim(2.4,2.65)ax2.plot(Open[:10])ax2.set_title('前十个交易日开盘价',fontproperties=getChineseFont())ax2.set_xlabel('日期',fontproperties=getChineseFont())ax2.set_ylabel('开盘价',fontproperties=getChineseFont())ax2.set_ylim(2.4,2.65)plt.show()

在实际绘图中,如果一个Figure对象中包含多个Axes对象,每个Axes对象的位置除了通过区域坐标和长度来设定一位,更为常用的方式是通过子图subplot()函数来设定。

fig=plt.figure()ax1=plt.subplot(221)ax2=plt.subplot(222)ax3=plt.subplot(223)ax4=plt.subplot(224)plt.show()

参数221中的22表示子图排列为2*2形式,1表示第一个子图,其他均为同样的道理.最后,我们再来体验一个绘制多图的例子:

Close15=Close['2015']ax1=plt.subplot(221)ax1.plot(Close15,color='k')ax1.set_xlabel('日期',fontproperties=getChineseFont())ax1.set_ylabel('收盘价',fontproperties=getChineseFont())ax1.set_title('中国银行2015年收盘价曲线',fontproperties=getChineseFont())Volume15=ChinaBank['Volume']['2015']Open15=Open['2015']ax2=plt.subplot(212)left1=Volume15.index[Close15>=Open15]hight1=Volume15[left1]ax2.bar(left1,hight1,color='r')left2=Volume15.index[Close15

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    182

    文章

    2963

    浏览量

    230171
  • 函数
    +关注

    关注

    3

    文章

    4307

    浏览量

    62433
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84460

原文标题:Matplotlib基础全攻略

文章出处:【微信号:atleadai,微信公众号:LeadAI OpenLab】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python2D绘图库Matplotlib会用吗?

    Matplotlib是一个Python语言的2D绘图库,它支持各种平台,并且功能强大,能够轻易绘制出各种专业的图像。本文是对它的一个入门教程。
    的头像 发表于 08-06 09:09 3144次阅读
    Python2D绘图库<b class='flag-5'>Matplotlib</b>会用吗?

    matplotlib绘图中编写的辅助函数总结

    matplotlib做图中常用的辅助函数
    发表于 05-17 17:12

    关于卷积神经网络探秘的简单了解

    卷积神经网络探秘
    发表于 06-04 11:59

    数据可视化之Python-matplotlib概述

    数据可视化(二):Python-matplotlib
    发表于 07-22 14:58

    python matplotlib模块报错的解决方法

    pyenv下使用python matplotlib模块的问题解决
    发表于 10-30 09:12

    探秘DLP NIRscan Nano评估模块,不看肯定后悔

    探秘DLP NIRscan Nano评估模块,不看肯定后悔
    发表于 05-07 06:31

    PLC通信原理探秘大讲堂幕后彩蛋之搁浅

    专家大讲堂《PLC通信原理探秘》系列视频:https://www.ad.siemens.com.cn/service/elearning/series/288.html连载之一:【PLC通信原理探秘
    发表于 07-01 12:58

    电动机效率 matlab,【原创】matplotlib绘制电机效率MAP图 精选资料分享

    matplotlib简介matplotlib是Python的第三方工具包,顾名思义它是一个关于矩阵及绘图的开发包,里面丰富的函数以及类似MATLAB的函数可以让我们很快绘制一幅图像(Figure
    发表于 09-01 06:31

    锂离子电池结构探秘

    锂离子电池结构探秘.rar 锂离子电池结构探秘
    发表于 01-28 14:41 54次下载

    探秘可穿戴与IOT黑科技

    美信FAE小姐姐,带你探秘可穿戴与IOT黑科技!
    的头像 发表于 05-30 17:24 2183次阅读
    <b class='flag-5'>探秘</b>可穿戴与IOT黑科技

    相比Matplotlib 可视化神器Altair登场

    语言的开发者使用最多的是 matplotlib,一个很强大的可视化库,不过它的局限也非常严重,制作交互式图表也是一件难事。
    的头像 发表于 05-23 14:49 2891次阅读
    相比<b class='flag-5'>Matplotlib</b> 可视化神器Altair登场

    用于数据科学的python必学模块之Matplotlib的资料说明

    本文档的主要内容详细介绍的是用于数据科学的python必学模块之Matplotlib的资料说明。
    发表于 09-18 08:00 14次下载
    用于数据科学的python必学模块之<b class='flag-5'>Matplotlib</b>的资料说明

    Python的Matplotlib函数汇总

    本文档的主要内容详细介绍的是Python的Matplotlib函数汇总免费下载。
    发表于 12-17 08:00 2次下载

    探秘DLP® NIRscan™ Nano评估模块

    探秘DLP® NIRscan™ Nano评估模块
    发表于 11-02 08:16 0次下载
    <b class='flag-5'>探秘</b>DLP® NIRscan™ Nano评估模块

    python中matplotlib和seaborn介绍

    的使用和分析,而数据的整合最好的方式就是使用可视化的方式将数据变现出来。 matplotlib和seabornde介绍 在Python中,我们可以使用matplotlib库和seaborn库来生成各种图表。matplotlib
    的头像 发表于 10-07 11:16 969次阅读
    python中<b class='flag-5'>matplotlib</b>和seaborn介绍