数据可视化之Matplotlib的使用

一、什么是数据可视化

数据可视化在量化分析当中是一个很是关键的辅助工具,每每咱们须要经过可视化技术,对咱们的数据进行更清晰的展现,这样也能帮助咱们理解交易、理解数据。经过数据的可视化也能够更快速的发现量化投资中的一些问题,更有利于分析并解决它们。接下来咱们主要使用的可视化工具包叫作——Matplotlib,它是基于Numpy和tkinter二次开发的,它是一个强大的Python绘图和数据可视化的工具包。html

二、Matplotlib的用法

2.一、Matplotlib绘图基础

安装方式:python

pip install matplotlibgit

引用方法:github

import matplotlib.pyplot as pltcanvas

matplotlib是python中的2D绘图库,也是目前使用最普遍的python绘图库。虽然它很庞大,可是能够经过简单的概念框架和重要的知识来理解掌握。它的图像大概能够分为如下4层结构。windows

1)canvas(画板):位于最底层,导入matplotlib库时就自动存在。api

2)figure(画布):创建在canvas之上,从这一层就能够开始设置参数数组

3)axes(子图):将figure分红不一样的块,实现分面绘图网络

4)图表信息(构图元素):添件或修改axes上的图形信息,优化图表的显示效果app

2.二、绘图基本流程

根据以上matplotlib的四层图像结构,pyplot模块绘制图形基本都遵循一个流程。

pyplot基本绘图流程

导入模块

先导入相应工具包。根据官方认证方式导入:

import numpy as np
import matplotlib.pyplot as plt

建立画布和子图

首先建立一张空白的画布,设置画布大小,根据须要同时展现几个图形,能够将画布划分为多个部分。而后使用对象方法来完成其他的工做。

pic = plt.figure(figsize=(10,10),dpi=80)  # 建立一个10 x 10的画布,像素值为80
ax1 = pic.add_subplot(2,1,1)  # 划分为2 x 1的图形阵,选择第一张图片

添加画布内容

绘图的主体部分。添加标题、坐标轴名称等操做与绘制图形时并列的,没有前后顺序,能够先绘制图形,也能够先添加各种标签,可是添加图例必定要在绘制图形以后。

方法 描述
plt.title() 设置图像标题
plt.xlabel() 设置x轴名称
plt.ylabel() 设置y轴名称
plt.xlim() 设置x轴范围
plt.ylim() 设置y轴范围
plt.xticks() 设置x轴刻度
plt.yticks() 设置y轴刻度
plt.legend() 设置曲线图例

图形保存与展现

plt.savefig('图片名称+后缀名')  # 保存图片,能够自由指定图片格式
plt.show()  # 展现图形

总体流程

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize = (10,10),dpi = 80)  # 建立画布。大小10x10,像素80
x = np.linspace(0,1,1000)  # 经过numpy生成随机数
fig.add_subplot(2,1,1)  # 分为2x1图形阵,选择第一张图片绘图
plt.title('y=x^2 or y=x')  # 添加标题
plt.xlabel('x')  # 添加x轴名称
plt.ylabel('y')  # 添加y轴名称
plt.xlim((0,1))  # 设置x轴范围(0,1)
plt.ylim((0,1))  # 设置y轴范围(0,1)
plt.xticks([0,0.3,0.6,1])  # 设置x轴刻度
plt.yticks([0,0.5,1])  # 设置y轴刻度
plt.plot(x,x**2)
plt.plot(x,x)
plt.legend(['y=x^2','y=x'])  # 添加图例
plt.savefig('总体绘图流程.png')  # 保存图片
plt.show()  # 展现图片

总体绘图流程

2.三、绘图风格

在matplotlib中,pyplot的一个子模块style当中定义了不少预设风格,方便进行风格转换。每一个预设风格都存储在一个.mplstyle为后缀的style文件中。

经过print(plt.style.available)能够查看全部预设风格的名称,经过use函数就能够直接设置预设风格。

查看全部风格名称

print(plt.style.available)

"""
['seaborn-dark', 'seaborn-darkgrid', 'seaborn-ticks', 'fivethirtyeight', 'seaborn-whitegrid', 'classic', '_classic_test', 'fast', 'seaborn-talk', 'seaborn-dark-palette', 'seaborn-bright', 'seaborn-pastel', 'grayscale', 'seaborn-notebook', 'ggplot', 'seaborn-colorblind', 'seaborn-muted', 'seaborn', 'Solarize_Light2', 'seaborn-paper', 'bmh', 'tableau-colorblind10', 'seaborn-white', 'dark_background', 'seaborn-poster', 'seaborn-deep']
"""

修改风格

x = np.linspace(0,1,1000)
plt.title('title')
plt.style.use('classic')  # 使用classic风格
plt.plot(x,x ** 2)
plt.plot(x,x)
plt.legend(['y=x^2','y=x'])

修改风格

2.四、动态rc参数

pyplot模块使用rc配置文件来自定义图形的各类默认属性,称为rc配置或rc参数。经过修改rc参数能够修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。

matplotlib将默认参数配置保存在matplotlibrc文件中,经过修改配置文件,可修改图标的的缺省样式。查看默认配置的方式以下:

1)直接打开matplotlibrc文件

2)print(matplotlib.rc_params())

3)print(matplotlib.rcParamsDefault)

4)print(matplotlib.rcParams)

一、线条经常使用的rc参数

管理线条属性的rc参数lines几乎能够控制线条的每个细节。

线条的经常使用rc参数名称、解释与取值

rc参数名称 解释 取值
lines.linewidth 线条宽度 取0~10之间的数值,默认为1.5
lines.linestyle 线条样式 可取“-”,“—”,“-.”,“:”4中,默认为“--”
lines.marker 线条上点的形状 可取“o”,"D","h",".",",","S"等20种,默认为None
lines.markersize 点的大小 取0~10数值,默认为1
import matplotlib as mpl

fig = plt.figure(figsize = (10,10),dpi = 80)  # 建立画布。大小10x10,像素80
x = np.linspace(0,1,1000)  # 经过numpy生成随机数

# 绘制第一张子图
fig.add_subplot(2,2,1)  # 分为2x2图形阵,选择第一张图片绘图
plt.rcParams['lines.linestyle'] = '-.'  # 修改线条类型
plt.rcParams['lines.linewidth'] = 1  # 修改线条宽度
plt.plot(x,x**2)
plt.title('y=x^2')  # 添加标题

# 绘制第二张子图

fig.add_subplot(2,2,2)  # 分为2x2图形阵,选择第二张图片绘图
mpl.rc('lines',linestyle = '--', linewidth = 10)
plt.plot(x,x**2)
plt.title('y=x^2')  # 添加标题


# 绘制第三张子图
fig.add_subplot(2,2,3)  # 分为2x2图形阵,选择第三张图片绘图
plt.rcParams['lines.marker'] = None
plt.rcParams['lines.linewidth'] = 3
plt.plot(x,x**2)
plt.title('y=x^2')  # 添加标题


# 绘制第四张子图
fig.add_subplot(2,2,4)  # 分为2x2图形阵,选择第四张图片绘图
plt.rcParams['lines.linestyle'] = ':'
plt.rcParams['lines.linewidth'] = 6
plt.plot(x,x**2)
plt.title('y=x^2')  # 添加标题

plt.savefig('修改线条的rc参数.png')
plt.show()

修改线条的rc参数

二、坐标轴经常使用的rc参数

一样,管理坐标轴属性的rc参数axes也能控制坐标轴的任意细节。

rc参数名称 解释 取值
axas.facecolor 背景颜色 接收颜色简写字符。默认为“W”
axas.edgecolor 边线颜色 接收颜色简写字符。默认为“k”
axas.linewidth 轴线宽度 接收0~1的float。默认为0.8
axas.grid 添加网格 接收bool。默认为False
axas.titlesize 标题大小 接收‘small’,‘medium’,'large'。默认为‘large’
axas.labelsize 轴标大小 接收‘small’,‘medium’,'large'。默认为‘medium’
axas.lablelcolor 轴标颜色 接收颜色简写字符。默认为“k”
axas.spines.{left,botton,top,tight} 添加坐标轴 接收bool。默认为True
axas.{x,y}margin 轴余留 接收float。默认为0.05

原轴:

x = np.linspace(0,10,1000)
plt.plot(x, np.sin(x))
plt.show()

原轴

修改rc参数以后的轴:

x = np.linspace(0,10,1000)
plt.rcParams['axes.edgecolor'] = 'b'  # 轴颜色设置为蓝色
plt.rcParams['axes.grid'] = True  # 添加网格
plt.rcParams['axes.spines.top'] = False  # 去除顶部轴
plt.rcParams['axes.spines.right'] = False  # 去除右侧轴
plt.rcParams['axes.xmargin'] = 0.1  # x轴余留为区间长度的0.1倍
plt.plot(x, np.sin(x))
plt.show()

修改rc

三、字体经常使用的rc参数

其实用到如今,可能有些同窗已经发现,默认的pyplot字体,并不支持中文字符,所以须要经过修改font.sans-serif参数来修改绘图时的字体,使得图形能够正常显示中文。同时因为修改字体后会致使坐标轴中负号没法正常显示,所以须要同时修改axes.uncode_minus参数。

rc参数名称 解释 取值
font.family 字体族,每一族对应多种字体 接收serif、sans-serif、cursive、fantasy、monospace五种。默认为sans-serif
font.style 字体风格 接收normal(roman)、italic、oblique三种,默认为normal
font.variant 字体变化 接收normal或small-caps。默认为normal
font.widget 字体重量 接收normal、bold、bolder、lighter四种及100、200、…、900.默认为nomal
font.stretch 字体延伸
font.size 字体大小 接收float。默认为10

windows设置中文字体:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False

mac设置中文字体:

plt.rcParams["font.family"] = 'Arial Unicode MS'

2.四、折线图

折线图是将"散点"按照横坐标顺序用线段依次链接起来的图形。以折线的上升或降低表示某一特征随另一特征变化的增减以及整体变化趋势。通常用于展示某一特征随时间的变化趋势。

plot函数经常使用参数及其说明

参数 说明
x,y 分别表示x轴和y轴的数据。无默认值
color 接收特定str,指定线条的颜色。默认为None
linestyle 接收特定str,指定线条类型。默认为 “-”
marker 接收特定str,表示绘制的点的形状。默认为None
alpha 接收0~1的小说,表示点的透明度。默认为None

其中color参数的8种经常使用颜色的缩写。

颜色缩写 表明的颜色
b 蓝色
g 绿色
r 红色
c 青色
m 品红
y 黄色
k 黑色
w 白色
plt.plot([0,3,9,15,30],linestyle = '-.',color = 'r',marker = 'o')

matplot2

axis函数

plt.plot(y.cumsum())

plt.grid(True)
plt.axis('image')

运行结果:

img

接下来主要介绍axis函数的一些参数:

参数 描述
Empty 返回当前坐标轴限值
off 关闭坐标轴线和标签
equal 使用等刻度
scaled 经过尺寸变化平衡刻度
tight 使全部数据可见(缩小限值)
image 使全部数据可见(使用数据限值)
[xmin,xmax,ymin,ymax] 将设置限制为给定的(一组)值

2.二、二维数据集

一维数据绘图只能说是一种特例,通常来讲,数据集包含多个单独的子集。这些数据的处理也是一样遵循matplotlib处理一维数据时的原则。可是,这种状况会出现一些其余的问题,例如,两个数据集它们可能会有不一样的刻度,没法用相同的y或者x轴刻度进行绘制,还有可能但愿以不一样的方式可视化两组不一样的数据,例如,一组数据使用线图,另外一组使用柱状图。

接下来,首先生成一个二维样本数据。

np.random.seed(2000)
y = np.random.standard_normal((20,2)).cumsum(axis=0)

以上代码生成的是一个包含标准正态分布随机数的20*2的ndarray数组,以下:

array([[ 1.73673761,  1.89791391],
       [-0.37003581,  1.74900181],
       [ 0.21302575, -0.51023122],
       [ 0.35026529, -1.21144444],
       [-0.27051479, -1.6910642 ],
       [ 0.93922398, -2.76624806],
       [ 1.74614319, -3.05703153],
       [ 1.52519555, -3.22618757],
       [ 2.62602999, -3.14367705],
       [ 2.6216544 , -4.8662353 ],
       [ 3.67921082, -7.38414811],
       [ 1.7685707 , -6.07769276],
       [ 2.19296834, -6.54686084],
       [ 1.18689581, -7.46878388],
       [ 1.81330034, -7.11160718],
       [ 1.79458178, -6.89043591],
       [ 2.49318589, -6.05592589],
       [ 0.82754806, -8.95736573],
       [ 0.77890953, -9.00274406],
       [ 2.25424343, -9.51643749]])

将这样的二维数组传递给plot函数,他将自动把包含的数据解释为单独的数据集。

plt.figure(figsize=(7,4))
plt.plot(y,lw=1.5)
plt.plot(y,"rd")
plt.axis('tight')

img

像这种数据确定就是看的一头乱麻,因此说咱们须要将它进一步作一下注释,为了让咱们能更好的理解图表。

plt.figure(figsize=(7,4))

# 分别为两条数据添加图例
plt.plot(y[:,0],lw=1.5,label='1st')  
plt.plot(y[:,1],lw=1.5,label='2nd')
plt.plot(y,"rd")
plt.grid(True)  # 网格设置
plt.legend(loc=0)  # 图例标签位置设置
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.title('test1')

img

经过刚才的操做咱们也可以发现,虽然咱们传进的是一个ndarray数组,可是它是一个二维数组,因此咱们要想将数据所有展现出来就可使用上面那种方式,可是上面的数据刻度都是相差无几的,若是说某一维的数据很是大,而另一维的则都是一些小数据,那要怎么办呢。

首先先来看看会形成什么样的结果:

y[:,0] = y[:,0] * 100
plt.figure(figsize=(7,4))
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,1],lw=1.5,label='2nd')
plt.plot(y,"rd")
plt.grid(True)  # 网格设置
plt.legend(loc=0)  # 图例标签位置设置
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('value')
plt.title("test2")

运行结果:

img

第一个数据因为数据量大,因此在这么大的刻度上依然能够将数据显示比较好辨认,而第二个数据就会由于这个缘由看起来像一条直线,咱们已经不能经过图像观察它的数据效果。

处理方式:

  • 使用两个y轴(一左一右)
  • 使用两个子图

首先先来看第一种方法:

fig,ax1 = plt.subplots()
# 第一组数据
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],"rd")
plt.grid(True)  # 网格设置
plt.legend(loc=8)  # 图例标签位置设置
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('value 1st')

# 第二组数据
ax2 = ax1.twinx()
plt.plot(y[:,1],'g',lw=1.5,label='2nd')
plt.plot(y[:,1],'bd')
plt.legend(loc=0)
plt.ylabel("value 2nd")

plt.title("test3")

运行结果:

img

这是经过在一张图上经过不一样的刻度来展现不一样的数据。

第二种方式:

plt.figure(figsize=(7,5))
plt.subplot(211)  # 指定子图位置,三个参数:行数、列数、子图编号
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],"rd")
plt.grid(True)  # 网格设置
plt.legend(loc=0)  # 图例标签位置设置
plt.axis("tight")
plt.ylabel('value')

plt.title("test4")

plt.subplot(212)
plt.plot(y[:,1],'g',lw=1.5,label='2nd')
plt.plot(y[:,1],'rd')
plt.grid(True)  # 网格设置
plt.legend(loc=0)  # 图例标签位置设置
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('value')

运行结果:

img

以上操做都是经过折线图来实现的,可是在matplotlib当中还支持不少种类型的图像。

2.三、plt对象支持的图类型

函数 说明
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.specgram(x,NFFT=256,pad_to,F) 谱图
plt.cohere(x,y,NFFT=256,Fs) X-Y相关性函数
plt.scatter(x,y) 散点图
plt.step(x,y,where) 步阶图
plt.hist(x,bins,normed) 直方图

2.3.一、柱状图

# 柱状图
data = [12,34,23,54]
labels = ['Jan','Fed','Mar','Apr']
plt.xticks([0,1,2,3],labels)  # 设置x轴刻度
plt.bar([0,1,2,3],data)

柱状图

# 横向柱状图
data = [12,34,23,54]
labels = ['Jan','Fed','Mar','Apr']
plt.yticks([0,1,2,3],labels)
plt.barh([0,1,2,3],data)

横向柱状图

# DataFrame数组图
df = pd.DataFrame({
    'Jan':pd.Series([1,2,3],index=['a','b','c']),
    'Fed':pd.Series([4,5,6],index=['b','a','c']),
    'Mar':pd.Series([7,8,9],index=['b','a','c']),
    'Apr':pd.Series([2,4,6],index=['b','a','c'])
})

df.plot.bar()  # 水平柱状图,将每一行中的值分组到并排的柱子中的一组
df.plot.barh(stacked=True,alpha=0.5)  # 横向柱状图,将每一行的值堆积到一块儿

数组图

2.3.二、饼图

饼图用于表示不一样类别的占比状况,经过弧度大小来对比各类类别。饼图将一个圆饼按照类别的占比划分红多个区块,整个圆饼表明数据的总量,每一个区块表示该分类占整体的比例大小。饼图能够比较清楚地反映出部分与部分、部分与总体之间的比例关系,易于比例每一个类别相对于总数的大小。但在对于面积大小的不敏感的状况下效果不是很好。

# 饼图
plt.pie([10,20,30,40],labels=list('abcd'),autopct="%.2f%%",explode=[0.1,0,0,0])  # 饼图
plt.axis("equal")
plt.show()

饼图

2.3.三、散点图

对于二维绘图,线图和点图多是金融学中的最重要的,刚才在上面线图已经有过简单接触,接下来主要介绍的就是点图了,这种图表类型可用于绘制一个金融时间序列的收益和另外一个时间序列收益的对比。

散点图又称为散点分布图,是利用坐标点(散点)的分布形态反映特征间的相关关系的一种图形。实际中通常使用二维散点图,经过散点的疏密程度和变化趋势表示两个特征之间的关系。

主要有如下三个特色:

1)表现特征之间是否存在数值或者数量的关联趋势,关联趋势是线性的仍是非线性的。

2)凸显出离群点(异常点)及其对总体的影响

3)数据量越大能发挥的做用越好。

基本语法格式:

matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,
    vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,*,data=None,**kwargs,
)

函数参数相关说明:

参数名称 描述
x,y 接收array,表示x轴和y轴对应的·数据。无默认值
s 接收数值或者一维array,指定点的大小,一维array表示每一个点的大小。默认为None
c 接收颜色或者一堆array,指定点的颜色,一维array表示每一个点的颜色。默认为None
marker 接收特定str,表示绘制的点的形状。默认为None
alpha 接收0~1的小数,表示点的透明度。默认为None
y = np.random.standard_normal((1000,2))  # 生成正态分布的二维随机数组
c = np.random.randint(0,10,len(y))

plt.figure(figsize=(7,5))
plt.scatter(y[:,0],y[:,1],c=c,marker='o')  # 经过scatter函数加入第三维数据
plt.colorbar()  # 经过彩条对不用演示数据进行描述
plt.grid(True)
plt.xlabel('1st')
plt.ylabel('2nd')
plt.title("test5")

运行结果:

img

2.3.四、直方图

plt.figure(figsize=(7,4))
plt.hist(y,label=['1st','2nd'],bins=25)
plt.grid(True)  # 网格设置
plt.legend(loc=0)  # 图例标签位置设置
plt.axis("tight")
plt.xlabel('index')
plt.ylabel('frequency')
plt.title("test6")

运行结果:

img

直方图是金融应用当中比较经常使用的图表类型,接下来主要介绍一下plt.hist的使用方法以及它的参数说明

plt.hist(
    ['x', 'bins=None', 'range=None', 'density=None', 'weights=None', 'cumulative=False', 'bottom=None', "histtype='bar'", "align='mid'", "orientation='vertical'", 'rwidth=None', 'log=False', 'color=None', 'label=None', 'stacked=False', 'normed=None', '*', 'data=None', '**kwargs'],
)
参数 描述
x 列表对象,ndarray对象
bins 数据组(bin)数
range 数据组的上界和下界
normed 规范化为整数1
weights x轴上每一个值的权重
cumulative 每一个数据组包含较低组别的计数
histtype 选项:bar,barstacked,step,stepfilled
align 选项:left,mid,right
orientation 选项:horizontal,vertical
rwidth 条块的相对宽度
log 对数刻度
color 每一个数据集的颜色
label 标签所用的字符串或者字符串序列
stacked 堆叠多个数据集

2.3.五、箱型图

箱型图能够简洁地概述数据集的特性,能够很容易的比较多个数据集。

fig,ax = plt.subplots(figsize=(7,4))
plt.boxplot(y)
plt.grid(True)
plt.setp(ax,xticklabels=['1st','2nd'])
plt.xlabel('data set')
plt.ylabel("value")
plt.title("test7")

运行结果:

img

2.3.六、补充:绘制数学函数

以图形的方式说明某个下限和上限之间函数图像下方区域的面积,简而言之就是,从下限到上限之间函数积分值

# 第一步:定义求取积分的函数
def func(x):
    return 0.5 * np.exp(x) + 1   # 指数函数

# 第二步:定义积分区间,生成必须得数值
a, b = 0.5 , 1.5
x = np.linspace(0,2)
y = func(x)

# 第三步:绘制函数图像
fig, ax = plt.subplots(figsize=(7,5))
plt.plot(x,y,'b',linewidth=2)
plt.ylim(ymin=0)

# 第四步:使用Polygon函数生成阴影部分,表示积分面积
Ix = np.linspace(a, b)
Iy = func(Ix)
verts = [(a,0)] + list(zip(Ix, Iy)) + [(b, 0)]
poly = plt.Polygon(verts,facecolor='0.7',edgecolor='0.5')
ax.add_patch(poly)

# 第五步:使用plt.text和plt.figtext在图表上添加数学公式和一些坐标轴标签
plt.text(0.5 * (a + b),1,r"$\int_a^b f(x)\mathrm{d}x$",horizontalalignment='center',fontsize=20)
plt.figtext(0.9, 0.075, "$x$")
plt.figtext(0.075,0.9,"$f(x)$")

# 第六步:设置刻度标签以及添加网格
ax.set_xticks((a, b))
ax.set_xticklabels(('$a$', '$b$'))
ax.set_yticks([func(a), func(b)])
ax.set_yticklabels(('$f(a)$', '$f(b)$'))
plt.grid(True)

运行结果:

img [ \int_a^bf(x)dx ]

三、金融学图表

以上绘制出来的数据都是一些经常使用的数据图像,可是在金融行业会有一些独有的图像,以前在matplotlib当中还提供了少许的特殊金融图表,这些图表,就例如烛柱图,主要是用于可视化历史股价数据或者相似的金融时间序列。

如今这个方法已经独立出来自成一个模块了*mpl_finance*

anaconda中mpl_finance安装方式:

https://github.com/matplotlib/mpl_finance/archive/master.zip下载到本地

在anaconda环境中运行命令:pip install 本地路径/mpl_finance-master.zip

调用方式:

import mpl_finance as mpf

import matplotlib.pyplot as plt
import mpl_finance as mpf
import tushare as ts
import pandas as pd
from matplotlib.pylab import date2num
from dateutil.parser import parse
import numpy as np
import matplotlib.dates as mdate

data = ts.get_k_data('000001')  # 获取平安的k线数据
data_of = data[:60]  # 只取前60份数据

fig, ax = plt.subplots(figsize=(15, 7))
__colorup__ = "r"
__colordown__ = "g"

# 图表显示中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

qutotes = []
for index, (d, o, c, h, l) in enumerate(
        zip(data_of.date, data_of.open, data_of.close,
            data_of.high, data_of.low)):
    
    # 时间须要经过date2num转换为浮点型
    d = date2num(parse(d))
    # 日期,开盘,收盘,最高,最低组成tuple对象val
    val = (d, o, c, h, l)
    # 加val加入qutotes
    qutotes.append(val)

# 使用mpf.candlestick_ochl进行蜡烛绘制,ochl表明:open,close,high,low
mpf.candlestick_ochl(ax, qutotes, width=0.8, colorup=__colorup__,colordown=__colordown__)

#设置x轴为时间格式,不然x轴显示的将是相似于‘736268’这样的转码后的数字格式
ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))

plt.xticks(pd.date_range('2016-08-01','2016-11-30',freq='W'),rotation=60)
plt.grid(True)  # 网格设置
plt.title("k线图")
ax.autoscale_view()
ax.xaxis_date()

img

四、保存图表到文件

plt.savafig('文件名.拓展名')

文件类型是经过文件扩展名推断出来的。所以,若是你使用的是.pdf,就会获得一个PDF文件。

plt.savefig('123.pdf')

savefig并不是必定要写入磁盘,也能够写入任何文件型的对象,好比BytesIO:

from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
参数 说明
fname 含有文件路径的字符串或者Python的文件型对象。
dpi 图像分辨率,默认为100
format 显示设置文件格式("png","jpg","pdf","svg","ps",...)
facecolor、edgecolor 背景色,默认为"W"(白色)
bbox_inches 图表须要保存的部分。设置为”tight“,则尝试剪除图表周围空白部分
  • Bokeh - Python的交互式网络绘图.
  • Seaborn - 使用Matplotlib的统计数据可视化.

原文出处:https://www.cnblogs.com/guapitomjoy/p/12212562.html

相关文章
相关标签/搜索