前面我们学习了Matplotlib的绘图流程和常用设置以及常见统计图的绘制方法。

同时,我们也发现Matplotlib绘制出的图形中会存在一些问题,例如:如何绘制双Y轴坐标系?如何去掉图形默认的边框?以及如何移动坐标到指定位置?

一、绘制双Y轴坐标系

在进行数据分析时,有时候我们需要在同一个坐标图中比较两种数据在时间序列上的关系。

由于两种数据的单位和数据并不统一,也是不同的类型的数据,因此我们不能用一个Y轴来共同衡量两类不同的数据,这时候我们就需要绘制双Y轴图。

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
datas = pd.read_excel(r'C:\Users\lin-a\Desktop\data\600001SH.xlsx')
# 将日期转换为时间戳,并设置为行索引
datas.index=pd.to_datetime(datas['日期'])
# 获取二月份的数据
feb_datas = datas['2015-02']# 绘制图形
fig = plt.figure(figsize=(20,8),dpi=80)
ax = fig.add_subplot(111)
x = feb_datas.index.tolist()
# 将时间转换为字符串
x2 = [time.strftime('%Y-%m-%d') for time in x]
lin1 = ax.plot(x2,feb_datas['收盘价(元)'].values.tolist(),label='收盘价',color='red')
ax.legend(loc='upper left')
ax.set_ylabel("收盘价(元)")
ax.set_xlabel("日期")
plt.show()

以上的代码中:有add_subplot(),这个与plot()有什么异同呢?

  • plot是绘图,subplot是子图,整体不偏离这个框架。

  • fig.add_subplot(111)
    此处,fig= plt.figure()是一个对象。

    其中参数111,指的是将图像分成1行1列,此子图占据从左到右从上到下的1位置。

  • plt.subplot(234)
    将画布分成2行3列,取从左到右,从上到下第4个位置。

两者本质是一样的,不同在于add_subplot是面向对象,subplot是面向函数

我们的目的是研究二月份某公司的每日收盘价以及对应的成交量,所以为方便分析,需要在一个双Y轴坐标图中同时绘制出收盘价和成交量的时间序列图。

双y轴绘制的关键函数是twinx(),twinx()函数表示共享X轴,共享表示的是X轴使用同一刻度线。

每日收盘价的折线图,我们已经绘制出来了,现在要使用twinx()绘制另外一条成交量折线图:

%matplotlib inline
from matplotlib import pyplot as plt
import pandas as pd# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 导入数据
data = pd.read_excel(r'C:\Users\lin-a\Desktop\data\600001SH.xlsx')
# 查看数据的基本特征
print(data.shape)# 将日期设置为数据的索引,便于使用日期选择数据
data.index = data['日期']
# 获取2月的数据
feb_data = data['2015-02']# 获取x,y轴的数据
y = feb_data['收盘价(元)'].values.tolist()
y2 = feb_data['成交量(股)'].values.tolist()
x = feb_data.index.strftime('%Y-%m-%d').tolist()# 设置画布大小
fig = plt.figure(figsize=(20,8),dpi=80)
# 设置ax对象
ax = fig.add_subplot(111)
ax2 = ax.twinx()
# 设置标题
plt.title('收盘价与成交量双曲线图')# 设置第一条——收盘价曲线
line1 = ax.plot(x,y,label='收盘价',color='red')
ax.set_xlabel('日期')
ax.set_ylabel('收盘价(元)')
#设置图例
ax.legend(loc='upper left')# 设置第二条——成交量曲线
line2 = ax2.plot(x,y2,label='成交量')
ax2.set_ylabel('成交量(股)')
# 设置图例
ax2.legend(loc='upper left')# 绘制网格
ax.grid(linestyle='--',alpha=0.5)
plt.show()
(105, 13)

因为是共享X轴,所以只用ax.set_xlabel()就可以设置X轴的标题。

由于Y轴不共享,所以每一个坐标系的Y轴标题都要使用set_xlabel()方法设置一次。

代码中,我们设置了两次图例的显示,所以出现了两个图例重叠的现象,所以我们需要合并图例。合并图例的方法就是仅使用一个轴的legend()函数。

%matplotlib inline
from matplotlib import pyplot as plt
import pandas as pd# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 导入数据
data = pd.read_excel(r'C:\Users\lin-a\Desktop\data\600001SH.xlsx')
# 查看数据的基本特征
print(data.shape)# 将日期设置为数据的索引,便于使用日期选择数据
data.index = data['日期']
# 获取2月的数据
feb_data = data['2015-02']# 获取x,y轴的数据
y = feb_data['收盘价(元)'].values.tolist()
y2 = feb_data['成交量(股)'].values.tolist()
x = feb_data.index.strftime('%Y-%m-%d').tolist()# 设置画布大小
fig = plt.figure(figsize=(20,8),dpi=80)
# 设置ax对象
ax = fig.add_subplot(111)
ax2 = ax.twinx()
# 设置标题
plt.title('收盘价与成交量双曲线图')# 设置第一条——收盘价曲线
line1 = ax.plot(x,y,label='收盘价',color='red')
ax.set_xlabel('日期')
ax.set_ylabel('收盘价(元)')
#设置图例
# ax.legend()# 设置第二条——成交量曲线
line2 = ax2.plot(x,y2,label='成交量')
ax2.set_ylabel('成交量(股)')
# 设置图例
# ax2.legend()# 合并图例
lns = line1+line2
labs = [l.get_label() for l in lns]
ax.legend(lns,labs,loc='upper left')# 绘制网格
ax.grid(linestyle='--',alpha=0.5)
plt.show()
(105, 13)

以上新增的代码为:

# 合并图例
lns = line1+line2
labs = [l.get_label() for l in lns]
ax.legend(lns,labs,loc='upper left')
  • line1和line2分别是两个绘图方法plot()的返回值,即折线对象。需要注意的是,lin1和lin2的类型是list。

  • legend()方法可以指定图例中有哪些值,第一个参数lns表示将图中的多个线以列表的形势传进去,第二个参数labs表示将图例的名字以列表的形势传进去。

二、改变坐标轴默认显示

上图中,一个是Matplotlib默认绘制出的图像,另一个是修改了Matplotlib的一些默认显示方式。

经过前面的学习我们发现,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。


%matplotlib inline
import matplotlib.pyplot as plty = range(0,14,2)
x = [-3,-2,-1,0,1,2,3]# 获取当前图表的图像
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轴的0点,和Y轴的0点交叉,需要使用set_position方法移动坐标轴的位置。

ax.spines['bottom'].set_position(('data',0))

  • 设置底边的移动范围,移动到Y轴的0位置。
  • data:移动轴的位置到交叉轴的指定坐标。
%matplotlib inline
import matplotlib.pyplot as plty = range(0,14,2)
x = [-3,-2,-1,0,1,2,3]# 获取当前图表的图像
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轴

去除边框

移动坐标轴位置

四、练习

  1. 绘制出一个段完整的正弦函数,如下图所示,不要显示坐标轴以及刻度值。下面是需要用到的函数:

    • numpy.linspace(start, stop, num=50)在指定的间隔内返回均匀间隔的数字,返回num均匀分布的样本,在[start, stop]。
    • numpy.sin(x)是numpy的提供的计算正弦值的函数。
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np# 在指定间隔内返回均匀间隔的数字
x = np.linspace(-np.pi,np.pi,num=256)
# 正弦函数
y = np.sin(x)# 画图,使用不同颜色和线条
plt.plot(x,y,color='red',linewidth=1)
# 获取当前图表的图像
ax = plt.gca()# 设置图形的包围线
ax.spines['right'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')# 设置不显示坐标轴刻度
plt.xticks([])
plt.yticks([])plt.show()

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np# 在指定间隔内返回均匀间隔的数字
x = np.linspace(-np.pi,np.pi,num=256)
# 正弦函数
y = np.sin(x)# 设置画布大小
fig = plt.figure(figsize=(20,15),dpi=80)
# 画图,使用不同颜色和线条
plt.plot(x,y,color='red',linewidth=1)
# 获取当前图表的图像
ax = plt.gca()# 设置图形的包围线
ax.spines['right'].set_color('none')
ax.spines['left'].set_color('black')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('black')# 移动坐标轴
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))# 添加网格线
ax.grid(linestyle='--',alpha=0.5)plt.show()

  1. 使用某电商超市从2016年到2019年的部分销售数据,用一张图绘制出2018年各地区销售总额及增长率。
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt# 设置全局字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 导入数据
data = pd.read_excel(r'C:\Users\lin-a\Desktop\data\Commerce.xls')
# 查看数据基本特征
print(data.shape)
data# 将日期设置为索引,便于选择2018年的数据
data.index = data['订单日期']
# 选取2018年的数据
data_18 = data['2018']
# 选择2017年的数据
data_17 = data['2017']# 各地区2017年、2018年销售额
area_sales18 = data_18.groupby('地区')['销售额'].sum()
area_sales17 = data_17.groupby('地区')['销售额'].sum()# 增长率
growth_rate = (area_sales18-area_sales17)/area_sales17# 设置画布大小
fig = plt.figure(figsize=(20,8),dpi=80)
# 获取图表的图像
ax = fig.add_subplot(111)
# 设置图像标题
plt.title('各地区销售额与增长率对比图')# 绘制地区销售额柱状图
line1 = ax.bar(area_sales18.index,area_sales18.values,width=0.5)
# 设置x,y轴标签
ax.set_xlabel('地区')
ax.set_ylabel('销售额(元)')
# 添加柱形的标注
for rect in line1:height = rect.get_height()ax.text(rect.get_x()+rect.get_width()/2,height+10000,'{:.2f}'.format(height),ha='center')# 绘制增长率曲线
ax2 = ax.twinx()
line2 = ax2.plot(area_sales18.index,growth_rate,color='red',marker='o',label='增长率')
ax2.legend(loc='upper right')
ax2.set_ylabel('增长率')# 绘制网格
ax.grid(linestyle='--',alpha=0.5)plt.show()
(9268, 19)

Python数据分析第十课:绘制双Y轴和改变坐标轴默认显示方式相关推荐

  1. 可视化篇(四)——— python绘制双y轴、箱线图、概率分布三种图形及案例

    可视化篇(四)--- python绘制双y轴.箱线图.概率分布三种图形及案例 摘要 绘制双y轴图形 绘制箱线图 绘制概率分布图 摘要 本文演示了如何通过python绘制双y轴.箱线图.概率分布三种图形 ...

  2. python绘制多条不同x轴曲线_Python matplotlib 绘制双Y轴曲线图的示例代码

    Matplotlib简介 Matplotlib是非常强大的python画图工具 Matplotlib可以画图线图.散点图.等高线图.条形图.柱形图.3D图形.图形动画等. Matplotlib安装 p ...

  3. python双坐标轴箱线图,python绘制双y轴、箱线图、概率分布三种图形及案例

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 本文演示了如何通过python绘制双y轴.箱线图.概率分布三种图形,并给出了具体案例源代码供 ...

  4. echarts折线图y轴根据数值自动_Python matplotlib 绘制双Y轴曲线图的示例代码

    双X轴的 可以理解为共享y轴 ax1=ax.twiny() ax1=plt.twiny() 双Y轴的 可以理解为共享x轴 ax1=ax.twinx() ax1=plt.twinx() 自动生成一个例子 ...

  5. Python实现可视化(一)--双Y轴画图及图例控制

    Python实现可视化(一)-双Y轴画图及图例控制 python实现可视化 基于python绘制双Y轴图像 1.图例与Y轴一致 // 加载相关库 import matplotlib.pyplot as ...

  6. origin如何绘制双y轴曲线_Origin用矩阵绘制多层曲面映射图

    点击上方关注点击下方点赞 [导读]怎样绘制多曲面映射图?1.矩阵数据的准备 1.1 XYYYY型数据 我们在实验中得到一张Excel表格 一列X表示电场强度,负载量不同的多列Y又分为Pm.Pr两组.那 ...

  7. origin如何绘制双y轴曲线_Origin对曲线进行多峰拟合

    点击上方关注点击下方点赞 ORIGIN教程 Origin对任意曲线进行多峰拟合 01 数据表 我们以11B NMR 核磁共振谱数据为例. 02 多峰拟合 为了增加教程的可参考性,本文以目前常用的最低版 ...

  8. origin如何绘制双y轴曲线_使用Origin软件绘制双y轴曲线图的过程

    在平时数据处理过程中,常常需要做双Y轴的曲线图.Origin作为一款功能强大的绘图软件,可以轻松地作出漂亮的双y轴曲线图.那么具体的操作是怎样的呢?下面就和大家详细地分享一下利用Origin软件绘制双 ...

  9. origin如何绘制双y轴曲线_origin怎么画双y轴 看完恍然大悟

    在平时数据处理过程中,常常需要做双Y轴的曲线图.Origin作为一款功能强大的绘图软件,可以轻松地作出漂亮的双y轴曲线图.那么具体的操作是怎样的呢?下面就和大家详细地分享一下利用Origin软件绘制双 ...

最新文章

  1. echarts相关的可视化数据
  2. ELK日志分析平台(elasticsearch)
  3. html 字符串最后加空格,html space空格符
  4. Google Guava库必需品
  5. 以太坊java接口_java以太坊库web3j文档
  6. 2021年中国在线旅游直播专题分析
  7. 如何有效地报告Bug
  8. 美团一面:两个有序的数组,如何高效合并成一个有序数组?
  9. [2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)
  10. ctf xss利用_Csrf+Xss组合拳
  11. 狂神说Java--Java学习笔记(合集)
  12. 高一下册计算机教案,高一信息技术教案
  13. LaTeX的长度单位
  14. 论文笔记【WiNCE: Unobtrusive Sensing of Upper Facial Action Units with EOG-based Eyewear】
  15. cpu性能天梯图2022
  16. mathpix无法免费?识别公式终极版,看着这篇就够了
  17. 【Android应用开发技术:用户界面】界面导航设计
  18. STP怎么选根桥和根端口
  19. Mac Terminal (终端) 使用ssh快速登录远程服务器
  20. Vivado关联Modelsim行为级仿真出错 [USF-ModelSim-70] 'compile' step failed with error(s) while executing

热门文章

  1. 五邑大学计算机学院白明,五邑大学计算机学院2015年学生工作简报(第五期)
  2. 【web前端】CSS笔记小结 圆角矩形+盒子阴影+文字阴影(Day 4)
  3. An unexpected error has occurred. Conda has prepared the above report.
  4. windows密码_一文教你3分钟搞定忘记的windows密码
  5. 鸿蒙系统开发app入门系列-- 第一个demo
  6. 区域填充之扫描线算法
  7. [Apple]关于通过苹果手机打开App之后耳机音乐自动停止的问题描述
  8. 黑白图像自动上色(颜色迁移版)
  9. 服务器(Linux)查看Tomcat运行日志
  10. 查看https证书到期时间