使用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实现在Linux系统下更改当前进程运行用户
Feb 04 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python 忽略文件名编码的方法
Aug 01 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
处理Python中的URLError异常的方法
2015/04/30 Python
python编码最佳实践之总结
2016/02/14 Python
python设计模式大全
2016/06/27 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
自荐书模板
2013/12/19 职场文书
收银员岗位职责
2014/02/07 职场文书
考试作弊检讨
2015/01/27 职场文书
python小程序之飘落的银杏
2021/04/17 Python
解决golang 关于全局变量的坑
2021/05/06 Golang
MySQL窗口函数的具体使用
2021/11/17 MySQL
使用Ajax实现进度条的绘制
2022/04/07 Javascript