Matplotlib基础全攻略_LeadAI学院的博客-程序员宝宝


预计阅读时间15分钟


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

中国银行股票数据下载:
链接:http://pan.baidu.com/s/1gfxRFbH 密码:d3id

开场例子


我们以中国银行股票收盘价曲线作为例子来作为开场。
首先我们通过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()


640?wx_fmt=jpeg

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

修改绘图属性


2.1 坐标

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


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


640?wx_fmt=jpeg

我们可以通过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()


640?wx_fmt=jpeg

设定坐标轴标签和旋转
我们可以通过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()


640?wx_fmt=jpeg

可以看到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()


640?wx_fmt=jpeg


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


from matplotlib.font_manager import FontManager, FontProperties
def getChineseFont():  
return FontProperties(fname='/System/Library/Fonts/PingFang.ttc')  

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


640?wx_fmt=jpeg

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


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


640?wx_fmt=jpeg

增加图形背景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()


640?wx_fmt=jpeg

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


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


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


640?wx_fmt=jpeg


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


640?wx_fmt=jpeg


图形的颜色
修改图形的颜色通过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()


640?wx_fmt=jpeg


点的形状类型
除了设置线条类型外,还可以设置数据点的形状,图形的形状通过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()


640?wx_fmt=jpeg

前面讲到的线条的类型,图形的颜色和点的形状类型,可以合为一个属性,使用他们的符号取值将其拼接,这个参数的位置是有限制的,比如在下面的代码中,它只能放在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()


640?wx_fmt=jpeg

常见图形绘制


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


640?wx_fmt=png


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


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


640?wx_fmt=png


3.2 直方图

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


plt.hist(Close,bins=12)


640?wx_fmt=jpeg

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


640?wx_fmt=png


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


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


640?wx_fmt=png

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)


640?wx_fmt=jpeg

3.4 箱线图

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


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


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


640?wx_fmt=png

多图绘制



除了上面介绍的,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()


640?wx_fmt=jpeg


在实际绘图中,如果一个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()


640?wx_fmt=jpeg


参数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<Open15]
hight2 = Volume15[left2]
ax2.bar(left2,hight2,color='g')

ax2.set_ylabel('成交量')
ax2.set_title('中国银行2015年成交量柱状图')

plt.show()


640?wx_fmt=jpeg


原文链接:https://mp.weixin.qq.com/s?__biz=MzI1MzY0MzE4Mg==&mid=2247483792&idx=1&sn=2c72169145f031c66274e6075d104b8c&chksm=e9d01151dea798479c3791bc89e4998b63a34976b50ba4fdd71c13aa7c0d326734ea8b2eb2d8&scene=21#wechat_redirect


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

640?wx_fmt=jpeg

大家都在看

640.png?


LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leadai/article/details/88266179

智能推荐

Android音视频系列(六):PCM音频的存储格式_珠穆朗玛小王子的博客-程序员宝宝_pcm 存储格式

前言我们已经了解了如何使用AudioRecord录制pcm音频,所以我们要了解pcm数据的存储格式,才能对其进行转换。正文首先看一下图片:以上图为例,在初始化AudioRecord的时候可以设置录制的格式:public static final int ENCODING_PCM_16BIT = 2;public static final int ENCODING_PCM_8BIT ...

相比19.9,还是免费的靠谱点!!_多元维生素的博客-程序员宝宝

有数据显示国内近70%的电脑还是处在拨号上网状态,尤其是在三四线城市,对于无线网络的需求仍比较旺盛。360随身wifi就是利用一台有线上网的电脑创建出wifi热点供周围的无线设备上网。虽然win7下通过命令设置网络共享的方法早已流传但其可操作性较差不被大众所看好,智能时代的到来需要简化一切可以简化的步骤,大众在追求一种越来越傻瓜式的生活方式。由此看来,360随身wifi就显得易操作,19.

【迁移2016-02-09 23:49】用Gogs替代Gitlab(二)_njit_peiyuan 的博客-程序员宝宝

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

MDK4编译过程中出现的错误以及警告解释_博文天下-lei的博客-程序员宝宝

在做数据处理的时候,出现warning: #223-D: function &quot;abs&quot; declared implicitly添加:float abs(float __x);//防止abs warning, 原因不明确, 可能是math.h与stdlib.h中都有abs()吧,用stdlib.h替换math.h也可解决问题1.warning: #550-D: variable &quot;d&quot; was se...

chmod文件权限设置总结_WangLanguager的博客-程序员宝宝

在平时无论是命令行还是UI下操作都会有遇到权限问题,这两周学习shell脚本中也遇到了权限问题。以前都是每次遇到问题,搜答案解决,并没有深究其中含义原理。现在在这里整理一下权限设置方法,以方便大家以后根据自己需要设置权限。一  chmod 符号模式 下面进入实践阶段:1 首先我们先看看怎么取消所有用户执行 一个目录下所有文件的权限:a 代表对所有用户执行此操

Android Studio引用jar及so文件_doris_d的博客-程序员宝宝

jar的位置与eclipse一致,so文件的放置位置不同

随便推点

Python程序员难招人?月入30K程序员告诉你答案_理想年薪百万的博客-程序员宝宝

现在程序员的现状是什么样的?程序员有很多,好的Python程序员还是供不应求的。Python开发的工资一般多少?一般而言,Python程序员的收入水平不低。在一线城市,程序员的平均收入应该都能达到该市的中上水平。有很多Python大牛们都拿着十几到二十万的薪资。不过事实上有很多企业招不到好的Python程序员。为什么企业很难招聘到好的Python程序员?原因有很多。下面,总结了几个主要原因:...

java tree的使用_转载:JAVA中JTree的使用_weixin_39523625的博客-程序员宝宝

最近在看“企业快信”的源代码,这个项目的好友列表是用JTree实现的。在理解了它的写法之后,就想把JTree控件的使用熟悉一下。于是自己写了个小练习,就是显示数据库中的用户名和图片路径在JTree中,并且还可以添加用户,同时在JTree中显示。JTree中,有TreeCellRenderer接口,可以用类来实现这个接口。在这个接口相应的方法中,可以对树中的节点进行设置。如我就是在这个方法中设置节点...

springboot—spring aop 实现系统操作日志记录存储到数据库_为自己勇敢的博客-程序员宝宝

采用方案: 使用spring 的 aop 技术切到自定义注解上,针对不同注解标志进行参数解析,记录日志缺点:要针对每个不同的注解标志进行分别取注解标志,获取参数进行日志记录输出1. 需要引用的依赖&lt;!--spring切面aop依赖--&gt;&lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/g...

阿里巴巴Java开发手册踩坑:100篇实例详解_慕白Lee的博客-程序员宝宝

阿里巴巴开发手册华山版GitHub下载链接Java方法等命名规范:https://blog.csdn.net/libusi001/article/details/100122137Java方法注释规范:https://blog.csdn.net/libusi001/article/details/100122163Java魔法值:https://blog.csdn.net/lib...

TensorFlow实现经典深度学习网络(7):TensorFlow实现双向长短时记忆循环神经网络_顽强的蝈蝈的博客-程序员宝宝

TensorFlow实现经典深度学习网络(7):TensorFlow实现双向长短时记忆循环神经网络        20世纪末,Schuster和Paliwal首次提出双向循环神经网络(Bi-directional Recurrent Neural Network ,Bi-RNN),长短时记忆模型LSTM也在同年被提出。Bi-RNN的主要目标是增加RNN可利用的信息。上节我门介绍来RNN的相关理论,然而,由于标准的循环神经网络(RNN)在时序上处理序列,可以处理不固定长度的时序数据,但他们往往忽略了未来的上

Maven解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile&不在支持源选项5,请使_HLTl的博客-程序员宝宝

Maven解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile&amp;不在支持源选项5,请使用7或更高版本在maven安装目录conf里的settings.xml加入默认JDK版本即可。在profiles标签中添加一个profile标签修改maven默认的JDK版本,根据自己的JDK版本配置,我的是JDK11,在182行左右。 &lt;!-- 配置Maven全局jdk版本 --&gt

推荐文章

热门文章

相关标签