Matplotlib绘图的一大特色是面向对象绘图。面向对象绘图是指将图形的元素看作一个对象,众多对象具有隶属关系,不同对象拼凑成一个完整的图形。
1. Figure、Axes对象
1.1 Figure对象
类比一下生活中用纸笔绘图,我们需要先找到一张白纸,在白纸上绘图。使用Matplotlib面向对象绘图,绘图前我们要先创建一个Figure对象,Figure对象是一个空白区域。Figure对象可以通过pyplot包中的figure函数进行创建。
fig = plt.figure()
1.2 Axes对象
- 在Matplotlib绘图中,每个Figure对象可以包含一个或者几个Axes对象,每个Axes对象即一个绘图区域,其拥有自己独立的坐标系统。
- 由此也可以看出Axes对象依附于Figure对象。
# 创建两个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])
- 其中,[0.1, 0.1, 0.3, 0.3]和[0.5, 0.5, 0.4, 0.4]分别制定绘图区域,每个列表的前两个元素指定Axes对象区域的左下角坐标,后两个元素指定Axes对象在Figure图像坐标X方向和Y方向的长度。即将整个figure区域参考为长于宽均为1的区域,ax1的左下角会出现在整个figure界面的(0.1,0.1)坐标处,长宽分别为0.3和0.3;ax2的左下角会出现在(0.5,0.5)坐标处,长宽分别为0.4和0.4。
具体如图所示:
1.3 绘制折线部分
- 下边,在ax1中绘制最近10个交易日的收盘价曲线,在ax2中绘制最近10个交易日的开盘价曲线。
# 假设Open和Close为定义过的开盘价和收盘价的Series对象。
fig = plt.figure()
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:])
ax2.plot(Open[-10:])
如图所示:
1.4 增加其他信息
fig = plt.figure()
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:])
ax2.plot(Open[-10:])
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文设置
ax1.set_title('近十个交易日收盘价') # 设置标题
ax1.set_xlabel('日期') # 设置X坐标轴标签
ax1.set_xticklabels(Close.index[-10:], rotation=25) # 设置刻度字体旋转角度
ax1.set_ylabel('收盘价') # Y坐标轴标签
ax1.set_ylim(27,35) # Y坐标轴取值范围
ax2.set_title('近十个交易日开盘价')
ax2.set_xlabel('日期')
ax2.set_xticklabels(Close.index[-10:], rotation=25)
ax2.set_ylabel('开盘价')
ax2.set_ylim(27,32)
2. 多图绘制
2.1多个子图绘制
- 在实际绘图中,如果一个Figure对象包含多个Axes对象,每个Axes对象的位置除了通过区域坐标和长度来设定以外更常用的方式是通过子图subplot()函数来设定。
ax1=plt.subplot(221)
ax1.set_title('ax1')
ax2=plt.subplot(222)
ax2.set_title('ax2')
ax3=plt.subplot(223)
ax3.set_title('ax3')
ax4=plt.subplot(224)
ax4.set_title('ax4')
参数“221”中的“22”表示子图排列为2×2形式(2行2列),“1”表示第一个子图,默认次序为,先从第一行从左到右,再逐行向循环下计序。具体如图所示:
接下来,绘制北方华创(002371.SZ)股票2020年收盘价曲线图和成交量柱状图。若当日收盘价大于等于开盘价,则成交量柱状图棒的颜色为红色;若当日收盘价低于开盘价,则成交量棒为绿色。
- 首先通过Tushare获取股价数据
# 导入相关的库
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
# 设置token,即接口密匙, 获取方式及相关权限详情见Tushare官网。
token = 'Your token'
pro = ts.pro_api(token)
# 获取日行情的接口。
df = pro.daily(ts_code='002371.SZ')
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index(['trade_date'], inplace=True)
# 倒序,因为Tushare的数据最近日期默认显示在DataFrame上方位置。倒序方便后作图。
df = df.sort_index()
# 取2020年的数据
Close = df.close['2020']
Open = df.open['2020']
Vol = df.vol['2020']
绘图:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文设置
ax1 = plt.subplot(211) #2行1列
ax1.plot(Close,color='k')
ax1.set_ylabel('收盘价')
ax1.set_title('北方华创2020年收盘价曲线图')
ax2 = plt.subplot(212)
left1 = Vol.index[Close>=Open]
hight1 = Vol[left1]
ax2.bar(left1, hight1, color='r')
left2 = Vol.index[Close<Open]
hight2 = Vol[left2]
ax2.bar(left2, hight2, color='g')
ax2.set_ylabel('成交量')
ax2.set_title('北方华创2020年成交量柱状图')
图像效果如图所示:
2.2 一个图中多条曲线绘制
- 将北方华创(002371.SZ)2020年的开盘价,最高价,最低价和收盘价曲线绘制在一张图中为例。代码如下:
# 提取出最高价和最低价
High = df.high['2020']
Low = df.low['2020']
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文设置
# 创建Axes对象
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
# 绘制四条曲线
ax.plot(Open, '--*', label='开盘价')
ax.plot(High, '-+', label='最高价')
ax.plot(Low, '-.>', label='最低价')
ax.plot(Close,label='收盘价')
# 在axes对象中增加文本对象
ax.set_title('北方华创2020年价格图')
ax.set_ylabel('价格')
ax.legend(loc='best')
效果展示如图:
前文回顾:
Python–Matplotlib库与数据可视化①–修改图像属性