使用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获取apk文件URL地址实例
Nov 01 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 Python
Python编写一个闹钟功能
Jul 11 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
Python 如何实现访问者模式
Jul 28 Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 Python
利用python爬取有道词典的方法
Dec 08 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
python求素数示例分享
2014/02/16 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
Python进行数据提取的方法总结
2016/08/22 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
python中int与str互转方法
2018/07/02 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
python实现的分层随机抽样案例
2020/02/25 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
C# Debug和Testing相关面试题
2015/10/25 面试题
技术负责人岗位职责
2015/02/10 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
毕业设计致谢语
2015/05/14 职场文书