了解了 Matplotlib 的基本知识之后,我们就可以开始上手试试画图了。
先从最常见的图形开始:折线图、条形图、柱状图、散点图、圆形图。
我不得不说本 Part 实际上都是没有什么逻辑的语法规定,会比较无聊。不过这一 Part 又最有用,因为看完之后用 Matplotlib 绘图就没什么问题了(如果你对图形细节没什么要求的话~)
用于绘图的数据
因为最近搞了个预测招商银行股价的比赛,部分绘图就直接用这个数据了。
import tushare as ts
pro = ts.pro_api('***********************')# *** 为注册 tushare 后分配的 token
cmb = pro.daily(ts_code='600036.SH', start_date='20190301', end_date='20190510')
复制代码
动手之前,还得再多说一点
在利用 Matplotlib 绘制数据图形(一)中我写过:如果你想用 Matplotlib 绘图,需要创建至少一个 fig 且其中包含一个 axes。
fig,ax_1 = plt.subplots()
复制代码
但是我们又常见下面的写法:
没有手动创建 fig 和 axes 怎么也出图了呢? 答案是:如果调用了 plt 的绘图方法,但是 plt 却没有追踪到 fig 和/或 axes ,plt 会默认创建新的 fig 和/或 axes(Matplotlib 的两套 API)。
plt 追踪 fig 和 axes 的过程对用户是隐形的,我们只需要知道每次调用 plt 绘图方法,该绘图效果都会呈现在当前 axes 中就可以了(后面会讲如何手动变更 plt 当前 fig 和 axes)
OK, Matplotlib
折线图、条形图、柱状图、散点图、圆形图分别对应着 Matplotlib 中的五个绘图函数:plot()、bar()、hist()、scatter()、pie()。
plt.plot([x],y) #注意这里的 x 其实是可选的,但实际使用中仅传入 y 比较少见
plt.scatter(x,y)
plt.bar(x,height) #保持和官方文档一致,使用 height 代替 y
plt.hist(x)
plt.pie(x)
复制代码
其中 .plot()
x 可选的意思是:如果仅传入一个位置参数的话,函数默认用户传入的是 y,x 则默认为序列 [0,1,2,3,4,....]与 y 的数据一一对应。所以之前我绘制的图形仅传入了 'open' 一个变量是没问题的。
不过上面的折线图没有什么意义,折线图实际中用的比较多的是时间序列,因为折线图反应了的是前后有内在联系的变化。
所以很多时候折线图 x 轴是时间,y 轴为数据:
plt.plot('trade_date','open',data = cmb)
复制代码
不过默认的时间轴大部分情况下是 —— 没法用的(?)。
Matplotlib 提供了一个专门的模块 mdates 来处理与时间有关的问题。
其中的各种 Locator 专门用来生成时间刻度。 所以时间序列刻度自动不好用的话就手动吧23333。
代码比较简单,直接扔出来,看注释:
import matplotlib.dates as mdates
months = mdates.MonthLocator() # 月 ticker
days = mdates.DayLocator() # 日 ticker
dateFmt = mdates.DateFormatter('%m-%d')
ax = plt.gca()# 获取当前 axes
datemin = np.datetime64('2019-03-10')# 时间轴最小值
datemax = np.datetime64('2019-05-10') + np.timedelta64(1) # 时间轴最大值
ax.set_xlim(datemin, datemax)# 设置时间轴的区间
ax.xaxis.set_major_locator(months) # 将月 ticker 设置为主刻度
ax.xaxis.set_major_formatter(dateFmt)
ax.xaxis.set_minor_locator(days) # 将日 ticker 设置为小刻度
plt.plot('trade_date','open',data = cmb)
plt.gcf().autofmt_xdate() #获取当前fig 并自动调整tick label
plt.show()
复制代码
折线图还有一个常用的场景是在同一幅图绘制多个不同变量的变化曲线。这怎么做呢?
plt.plot('trade_date','close',data = cmb)
复制代码
不切换当前 fig 和 axes ,直接继续绘制就在同一张图里了。
但这种方法也不好,数据多了一行一行加麻烦。比如我想直接在一张图里绘制 'open',‘high','low','close' 四个变量,得加四行。
更好的办法是把这四个变量提取出来:
ohlc = cmb.loc[:,['open','high','low','close']].values
plt.plot(cmb['trade_date'].values,ohlc)
复制代码
Matplotlib 会自动将 y 中的每一列数据绘制称同一条曲线。
然后大家要求又来了,四个图颜色倒是区分了,我怎么知道哪个颜色代表谁呢?所以要把图例添加上:
plt.gca().legend(['open','high','low','close'])#按照plot y 的数据顺序传入 legend 字符串就行。
复制代码
至此,一个有实际意义且信息准确的折线图就完工了。
自己用的话到这里就差不多了,如果想制作为报告中可使用的图,还有很多美化的工作需要进行。
Ad Time
本系列完成后我会在微信公众号数据科学与技术(read_csv) 发布精心制作的渐进式 notebook,希望大家能关注一下。