使用Python解决图表与画布的间距问题


Posted in Python onApril 11, 2022

1.问题情境

我们使用python的 matplotlib库绘图时,可能会遇到图片内容显示不全的情况,

以下边代码为例:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = range(9)
y = [5.12, 5.15, 5.13, 5.10, 5.2, 5.25, 5.19, 5.24, 5.31]
c = 0.5 * (min(x) + max(x))
d = min(y) + 0.3 * (max(y)-min(y))
plt.plot(x, y, label='股票A收盘价', c='k', ls='-.', marker='D', lw=2)
plt.xticks(x, [
	'2022-03-27', '2022-03-28', '2022-03-29', '2022-03-30',
	'2022-03-31', '2022-04-01', '2022-04-04', '2022-04-05',
	'2022-04-06'], rotation=45)
plt.title('某股票收盘价时序图')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.legend()

# 标出每天的收盘价
for a, b in zip(x, y):
	plt.text(a, b+0.01, '%.1f'%b, ha='center', va='bottom', fontsize=9)

plt.annotate('最低价', (x[y.index(min(y))], min(y)), (x[y.index(min(y))] + 2, min(y)+0.06), xycoords='data',
			 arrowprops=dict(width=3,headwidth=10,headlength=20, facecolor='g',shrink=0.05), c='r',fontsize=20)
plt.show()

图像效果如图所示,图像底部x轴的表示日期的标签,没有被显示完全:

使用Python解决图表与画布的间距问题

虽然,有的知道的同学可能会告诉我,只要把窗口放大,就可以显示得完整了。确实如此。但是这仅仅只能满足我们的一般需求。如果我们的程序需要自动化生成图表并保存,这个方法就失效了。使用plt.savefig()保存出的图片文件如下图所示,这并不是我们想要的:

使用Python解决图表与画布的间距问题

这样的场景下,subplots_adjust()方法的应用则恰到好处。

2. plt.subplots_adjust()概述

plt.subplots_adjust()方法常用的参数有6个。

其语法如下:

plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

其中,left, bottom, right, top依次表示四个方向上的,图表与画布边缘之间的距离。

这四个参数的每个参数的取值范围通常都在0-1之间。与其说是“间距”,倒不如说是图像边缘的“坐标”更确切。使用这四个参数时,将画布左下角视为坐标原点,画布的宽和高都视为1。如果参数取值大于1,则可能会出现图像的损失,图像会移动到画布之外,而不会报错。

且left不能大于等于right,bottom不能大于等于top,如果违反这一点则会发生报错。

wspace和 hspace则分别表示水平方向上图像间的距离和垂直方向上图像间的距离。其的取值是可以取得大于1,具体的则具体情形自行调试选出合适的。这两个参数用于画布有多个子图时。

3. 案例展示

3.1 单图情形

依然以第一部分中的示例为例,将表示图表与下边缘的距离 的参数 bottom设成0.2。

即在上边代码的基础上加上一句:

plt.subplots_adjust(bottom=0.2)

则图像效果发生以下改变:

使用Python解决图表与画布的间距问题

3.2 多子图情形

在画布上绘制以下四幅图像。并设定上下左右及图像间的间距。

依次在左上绘制一幅折线图,右上绘制一幅散点图,

左下绘制一幅柱状图,右下绘制一幅箱线图。

并设定间距:

plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.3, hspace=0.3)

代码如下:

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 位置221 画一幅简单的折线图
fig = plt.figure(1, facecolor='#33ff99', figsize=(10, 6))
ax1 = plt.subplot(221)
ax1.set_title('ax1')
ax1.set_facecolor("orange")
ax1.plot([1, 1, 0, 0, -1, 0, 1, 1, -1], c='r')
# 位置222 或一个横轴为月份,的散点图
ax2 = plt.subplot(222)
ax2.set_title('ax2')
ax2.set_facecolor("purple")
ax2.plot(['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月'], [1, 0, 2, 5, 3, 5, 8, 7, 9], ls='', marker='*')
# 位置223 绘制一份柱状图
ax3 = plt.subplot(223)
ax3.set_title('ax3')
ax3.set_facecolor("pink")
ax3.bar(['A类', 'B类', 'C类', 'D类', 'E类'], height=[200, 350, 600, 540, 430], color='#9900ff')
# 位置224 绘制一张箱线图
ax4 = plt.subplot(224)
ax4.set_title('ax4')
np.random.seed(100)
data = np.random.randint(0, 100, (4, 4))
ax4.set_facecolor("blue")
ax4.boxplot(data, labels=('Open', 'High', 'Low', 'Close'))
# 添加标题
ax1.set_title('折线图')
ax2.set_title('散点图')
ax3.set_title('柱形图')
ax4.set_title('箱线图')
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.3, hspace=0.3)
plt.show()

生成图像效果如下:

使用Python解决图表与画布的间距问题

Python 相关文章推荐
Python入门_浅谈数据结构的4种基本类型
May 16 Python
Python入门_浅谈for循环、while循环
May 16 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
python opencv之分水岭算法示例
Feb 24 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
Python新手如何理解循环加载模块
May 29 Python
详解python logging日志传输
Jul 01 Python
pycharm全局搜索的具体步骤
Jul 28 Python
Python 中random 库的详细使用
Jun 03 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
thinkPHP框架实现生成条形码的方法示例
2018/06/06 PHP
PHP强制转化的形式整理
2020/05/22 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
vue生命周期实例小结
2018/08/15 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
Python素数检测实例分析
2015/06/15 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
python字符串判断密码强弱
2020/03/18 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
《社戏》教学反思
2016/02/22 职场文书
决心书格式及范文
2019/06/24 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
讨论nginx location 顺序问题
2022/05/30 Servers