转载出处

一、前言
  matplotlib【1】是著名的python绘图库,它提供了一整套绘图API,十分适合交互式绘图。本人在工作过程中涉及到股票数据的处理如绘制K线等,因此将matplotlib的使用心得进行整理,与大家共同分享。
  另外,在数据处理过程中会用到numpy【2】,matplotlib网站的示例也有不少用到了numpy,读者可以参考这篇文章【3】有基本的了解。
  本系列文章主要分为两部分:(1)matplotlib基本使用;(2)结合股票走势、技术指标等信息通过matplotlib进行绘制,学习其用法,个人觉得matplotlib博大精深,二八定理,20%的功能完成80%的图表需求。
  最后,matplotlib作者英年早逝,感谢他所做出的贡献。John Hunter will be missed!

二、matplotlib基本使用
matplotlib中通过pyplot模块进行图表的绘制。所绘制的图表称为一个绘图对象,在绘图对象之上绘制各种图形。由于K线图主要是基于日期和股票价格的X-Y坐标轴结构,因此本系列文章也主要针对axes坐标轴绘制进行分析。
通过如下语句导入需要绘图的库:

import matplotlib.pyplot as plt

1. figure对象
figure对象可以看成整个图表。在figure图表之上增加多个子图,然后在子图之上绘制点和线。

    fig = plt.figure()
ax = fig.add_subplot(1,1,1)

  得到fig对象之后,通过add_subplot增加子图(返回了一个axes坐标轴),该方法需要三个参数,分别为:numrows, numcols, fignum。其中,一共有numrows*numcols个子图,即:将图表分为N行*M列,fignum标识了该子图的顺序,其范围从1到numrows*numcols。在上例中1,1,1表示了该绘图对象仅有1个子图,也就是1*1类型。
2. plot方法绘图
创建子图之后,通过plot方法在子图上绘制。plot方法可以传入两个list,分别表示X和Y坐标,因此x和y的长度要一致。需要注意的是,plot也可以接受一个list参数作为Y坐标的值,默认X坐标的值从0开始到Y的长度。

  plt.plot([1,2,3,4])

  其中X坐标为0到3,个数与Y坐标值的数目相同。

   plt.plot([1,2,3,4], [1,2,3,4])

  设置了X坐标的值。然后通过plot.show()显示该图,示例代码如下:

def PlotDemo1():
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot([1,2,3,4],[2,3,4,5])
plt.show()

  图表如下所示:

上述图表作为基础,以后我们都是围绕这个基础图表不断添加元素,直到达到我们想要的效果。

2.1 增加标题和坐标轴说明
如果需要给绘图对象增加标题,可以通过suptitle方法设置,其中可以设置参数:标题、标题字体大小、字体类型等。代码示例如下:

fig.suptitle('figure title demo', fontsize = 14, fontweight='bold')

  如果需要对给定子图的坐标轴设置标题,可以通过刚才返回的axes对象的set_title进行设置,代码示例如下:

  ax.set_title("axes title")

  如果需要对于X和Y坐标设置标签,可以通过set_xlabel和set_ylabel方法设置。代码示例如下:

    ax.set_xlabel("x label")      ax.set_ylabel("y label")

  图表如下所示:

通过上述的示例,我们绘制了一个基本的X和Y坐标轴,并增加了针对坐标轴的说明。
三、股价基本走势图
股票的K线图(以日K为例)由日期和价格组成,形成X-Y坐标轴,按照前面的绘图方案,需要传入日期数组和价格数组即可。
1.numpy数组
numpy是常用的数据处理库,我将000001.SZ的股价数据(时间范围从20150101到20150930)导入到csv中,然后通过numpy读取得到日期和价格数组。csv文件中包含了两列,日期和价格,分割符号为",",读取过程代码如下:

dates, close = np.loadtxt(filename,delimiter=",", unpack= True, converters={0:mdates.strpdate2num('%Y-%m-%d')})

  numpy的loadtxt方法:设定了文件中的分隔符号为“,”,unpack是否将数组拆分,True为拆分,即:得到两个数组分别表示日期和收盘价格,converters是将日期类型的字符串转为数组,因为numpy规定其数组中的类型需要一致。
2.绘制基础走势图
通过numpy得到日期和收盘价格之后,参照先前的示例,通过plot方法进行绘制:

ax1.plot(dates,close)

  图表如下所示:

在上图中,x轴通过数值标识,而不是日期类型。因为我们通过numpy构造数组时,日期按照数值类型存储,可以通过如下方法转换为日期类型:

    ax1.xaxis.set_major_locator(mdates.DayLocator(bymonthday=range(1,32), interval=15))
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
for label in ax1.xaxis.get_ticklabels():
label.set_rotation(45)

  X-轴设置主要刻度locator为每日刻度,格式为:DateFormatter("%Y-%m-%d"),每日刻度从第1日到第31日,间隔为15日。图表如下所示:

其中,对于X-轴上面的每个ticker标签都向右倾斜45度,这样标签不会重叠在一起便于查看。
也可以按照每月进行显示,X-轴设置主要刻度为每月刻度,格式为:DateFormatter("%Y-%m"),转换代码如下:

    ax1.xaxis.set_major_locator(mdates.MonthLocator())
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m"))

  图表如下所示:

3.图形边框调整
细心的读者可能会发现,在上图中底部(bottom)处的日期标签,显示不完整。此时可以点击【configure subplots】按钮,调整左右和上下边框,然后保存即可。图表如下所示:

也可以通过subplots_adjust方法对于边框进行调整:

    plt.subplots_adjust(bottom=0.13,top=0.95)

4.绘制价格平均线
在前面的示例中绘制了基本的股票走势图,本节我们利用ta-lib【4】证券技术指标库,绘制5日和10日价格平均线。
ta-lib中提供了方法talib.SMA得到价格简单平均线,timeperiod为时间参数,timeperiod=5为五日均线,基于上图增加五日和十日均线,代码如下:

    sma5 = talib.SMA(close, timeperiod = 5)
ax1.plot(dates,sma5)
sma10 = talib.SMA(close, timeperiod = 10)
ax1.plot(dates,sma10)

  其中,sma5和sma10均为numpy数组。
图表如下所示:

在坐标轴中有三条曲线,matplotlib会自动改变线条颜色,此时如果没有说明并不方便使用,可以在右上角增加图例,表明各线条所代表的含义,并增加图表的网格效果,代码如下:

plt.legend(('daily', 'SMA5', 'SMA10'))
plt.grid(True)

  图表如下所示:

四、总结
本章对于matplotlib的基本使用方法进行了介绍,并绘制了基本的股票价格和均线走势图。在后面的章节中对于上述图表增加成交量、MACD值等数据。
最后还是那句俗得不能再俗的话,“本人水平有限,错误在所难免,欢迎批评指正。”

【转】使用Python matplotlib绘制股票走势图的更多相关文章

  1. matplotlib绘图股票走势图实践

    导入模块 import pandas as pdimport numpy as npfrom pandas import Series,DataFrameimport matplotlib.pyplo ...

  2. 用Python的Pandas和Matplotlib绘制股票KDJ指标线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...

  3. WebService学习--股票走势图+天气预报实现

        互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取股票数据和天气预报为例进行学习 ...

  4. python+matplotlib 绘制等高线

    python+matplotlib 绘制等高线 步骤有七: 有一个m*n维的矩阵(data),其元素的值代表高度 构造两个向量:x(1*n)和y(1*m).这两个向量用来构造网格坐标矩阵(网格坐标矩阵 ...

  5. 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线

    我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...

  6. Python学习(一) —— matplotlib绘制三维轨迹图

    在研究SLAM时常常需要对其输出的位姿进行复现以检测算法效果,在ubuntu系统中使用Python可以很好的完成相关的工作. 一. Ubuntu下Python的使用 在Ubuntu下使用Python有 ...

  7. Html5 canvas 绘制彩票走势图

    因须要 要实现一个类似彩票走势图的功能,初次学Html5 ,非常多地方不明白,前段时间也发帖请教过这个问题.也是没给个明白说话,在网上搜了非常多,也没有实现的样例,今天细致研究了下.发现事实上也不是非 ...

  8. Python matplotlib绘制圆环图

    一.语法和参数简介 plt.pie(x2,labels=labels, autopct = '%0.2f%%', shadow= False, startangle =0,labeldistance= ...

  9. python+matplotlib+绘制不同图标类型

    #==================================================================#首先需要导入两个文件import matplotlib.pypl ...

随机推荐

  1. CSS Hack技术介绍及常用的Hack技巧集锦

    一.什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致相同的CSS输出的页面效果不同,这就需要CSS Hack来解决浏览器局部的兼容性问题.而这个针对不同的浏览器写不同的CS ...

  2. HTML中为何p标签内不可包含div标签?那哪些块元素里面不能放哪些块元素呢?

    先看下面的例子你就能明白两者的差别: <p>测试一下块元素与<span>内联元素</span>的差别</p> <p>测试一下<div& ...

  3. 学习ASP.NET 5和MVC6

    今天很荣幸的参加了微软开源跨平台讲座,充分认识了下一个版本的ASP.NET所带来的激动人心的特性.虽然过去已经断断续续的了解了一些ASP.NET5和MVC6与EF7的动态,但是都没有这一次来的系统化( ...

  4. echarts-在现实标题中显示百分比

    如图:需要在标题显示所占百分比 使用方式:途中标记部分 series : [{ name: '类型', type: 'pie', radius : '55%', center: ['50%', '60 ...

  5. css 固定HTML表格的宽度

    在网页中插件表格时,就算你有时定义了宽度,默认的也会根据里面内容的来自动拉伸.有时候自动拉伸是好,但是如果你表格里面的内容太长,表格就会拉伸的特别难看. 像下面的表格,正常的显示应该如下: 但是如果里 ...

  6. 【转】JAVA自学之路

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  7. BZOJ 4390: [Usaco2015 dec]Max Flow

    4390: [Usaco2015 dec]Max Flow Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 113[Submi ...

  8. [日常训练]string

    Description 给定一个长度为$n$的字符串,串中的字符保证是前$k$个小写字母.你可以在字符串后再添加$m$个字符,使得新字符串所包含的不同的子序列数量尽量多.当然,前提是只能添加前$k$个 ...

  9. sql查询,不在某一范围问题的新思路

    新思路: A为学生表 B为中间表(学生和课程的) C为课程表 新的思路是用left join,(right join应该也可以) 查询没有选课的学生 ... C left join B on A.si ...

  10. CSS实现文字省略

    1.首先给用于放文本的标签元素设置一个宽度值,并设置溢出属性overflow为溢出隐藏. width: 245px;/*一定要设置固定宽度*/ overflow: hidden;/*不显示超过对象尺寸 ...