数据分析:数据可视化4


之前,我们学习了Matplotlib的绘图流程和常用设置以及常见统计图的绘制方法。同时,Matplotlib绘制出的图形中会存在一些问题,例如:如何绘制双Y轴坐标系?如何去掉图形默认的边框?以及如何移动坐标到指定位置?
本节我们就来解决这个问题。

绘制双Y轴坐标系

在进行数据分析时,有时候我们需要在同一个坐标图中比较两种数据在时间序列上的关系,而这两种数据往往有单位不统一等问题。下面我们还使用某上市公司数据集中股票日线部分数据做演示。
我们取出2015年2月的数据,分别以时间线索绘制每日的开盘价、收盘价以及成交量。
之前讲过如何把开盘价和收盘价直接合并在一幅图中,因为这两个数据单位相同,数值也没有差距过于悬殊,但是成交量则不同于前两者,它不但单位不同,数量差距也很大。因此想把这三张曲线绘制成一幅图,就必须使用双y轴坐标系。构建双y轴坐标系的步骤首先需要合并两个画布,可以形象的理解成一个画布上绘制开盘价、收盘价变化曲线,另一个画布绘制成交量。然后,我们设置两个y轴的标签和x轴的标签,最后,我们再将图例合并。
先来看代码:

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
# 获取数据
datas = pd.read_excel('600001SH.xlsx')
# 将日期列重置为datas表的行索引
datas.index = pd.to_datetime(datas['日期'])
# 将datas中2015年2月的数据取出,并设置为feb_datas
feb_datas = datas.loc['2015-02']

# 由于三条曲线的数据单位和值并不相同,而绘图时y轴的刻度
# 是根据数值自动匹配的,因此不能在一张画布上绘制三张曲线,

# 绘制图形
# 调整显示图片大小
fig = plt.figure(figsize=(20,8),dpi=80)
# 原fig画布有一个图层,为图层在同一位置再添加一个画布
ax = fig.add_subplot(111)

# 在第一层画布上绘制开盘价和收盘价曲线
lin1_1 = ax.plot(feb_datas.index.tolist(),feb_datas['开盘价(元)'].values.tolist(),label='开盘价',color='r')
lin1_2 = ax.plot(feb_datas.index.tolist(),feb_datas['收盘价(元)'].values.tolist(),label='收盘价',color='y')

# 设置第二张图层与第一张共享x轴
ax2 = ax.twinx()
# 在第二张图层上绘制成交量曲线
lin2 = ax2.plot(feb_datas.index.tolist(),feb_datas['成交量(股)'].values.tolist(),label='成交量(股)')

# 设置第二张图层的y轴显示
ax2.set_ylabel("成交量(股)",fontproperties=my_font)
# 设置第一张图层的y轴显示,以及设置共用的x轴显示
ax.set_ylabel("开盘价(元)",fontproperties=my_font)
ax.set_xlabel("日期",fontproperties=my_font)

# 合并图例
# lin1_1,lin1_2,lin2均为列表类型
lns = lin1_1+lin1_2+lin2
labs = [l.get_label() for l in lns]
ax.legend(lns, labs, prop=my_font)
plt.show()

在这里插入图片描述
也许理解起来很难,但是这也是固定写法,大家只要记住固定写法就好。当然,我们也可以加入plt.xticks()方法调整x轴的显示,或者使用plt.subplot()方法设置一图层多画布。

改变坐标画布的默认显示方式

修改边框

通过前面的学习可以发现,Matplotlib在绘制图形的时候会默认显示上面和右侧的边框,以及坐标轴的颜色默认是黑色。改变坐标轴的默认显示方式就从改变这些开始。如果想要去掉默认边框,可以通过plt.gca()获得当前Axes对象:

ax = plt.gca()

而后使用spines属性取到并调整对应的边框:

ax.spines['right']

这里的right代表右边框,同样,left代表左边框、top代表上边框、bottom代表下边框。
再然后,通过set_color(‘none’)方法可以设置边框的颜色:

ax.spines['right'].set_color('none')

这条语句就可以将又边框设置为无色(none),也可以传递red、blue等样式的英语单词作为参数,或者也可以传递十六进制的颜色值,如#0000FF:

import matplotlib.pyplot as plt
y = range(0,14,2) 
x = [-3,-2,-1,0,1,2,3]

# 获得当前图表的图像
import matplotlib.pyplot as plt
y = range(0,14,2)
x = [-3,-2,-1,0,1,2,3]
plt.subplot(2,1,1)
plt.plot(x,y) # 默认样式绘图

plt.subplot(2,1,2) # 确定当前画布位置
ax = plt.gca()# 获得当前画布,需要在确定画布之后使用
# 设置图型的包围线
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('red')
ax.spines['left'].set_color('#0000FF')
plt.plot(x,y)
plt.show()

在这里插入图片描述
通过以上的对比,大家学会改变默认显示方式了吗?

改变x,y轴默认对其位置

通过上面的结果,我们可以看出如果以(0,0)点作为绝对坐标系的原点位置,那么上图中相对坐标系的x’,y’轴对其位置是(-3,0),是系统自动分配的。如果想要X轴的0点,和Y轴的0点交叉,需要使用set_position方法移动坐标轴的位置:

# 将底边(x轴)对其位置置为0
ax.spines['bottom'].set_position(('data', 0))
# 将左边(y轴)对其位置置为0
ax.spines['left'].set_position(('data', 0))

接下来我们看看效果:

import matplotlib.pyplot as plt
y = range(0,14,2)
x = [-3,-2,-1,0,1,2,3]
plt.subplot(2,1,1)
plt.plot(x,y) # 默认样式绘图

plt.subplot(2,1,2) # 确定当前画布位置
ax = plt.gca()# 获得当前画布,需要在确定画布之后使用
# 设置图型的包围线
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('red')
ax.spines['left'].set_color('#0000FF')

# 设置坐标轴对其位置
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))

plt.plot(x,y)
plt.show()

在这里插入图片描述
改变坐标轴的默认显示方式也并不难,也是记住固定的写法就好。
今天的介绍就到这里了,本节我们主要展示了绘制双y轴坐标系的方法,以及改变画布的显示方式,这些也都可以配合plt.figure()、plt.xticks()、plt.subplot()等方法使用,可以让最终显示的图像更符合我们的实际需求。下节课我们继续一起学习Seaborn,让我们下期再见。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值