使用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使用turtule画五角星的方法
Jul 09 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
基于python实现名片管理系统
Nov 30 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
Python生成rsa密钥对操作示例
Apr 26 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
django基于restframework的CBV封装详解
Aug 08 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
php中使用url传递数组的方法
2015/02/11 PHP
PHP整合PayPal支付
2015/06/11 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
js实现无缝滚动图
2017/02/22 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
python的类变量和成员变量用法实例教程
2014/08/25 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
python 图像增强算法实现详解
2021/01/24 Python
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
后勤园长自我鉴定
2013/10/17 职场文书
考博专家推荐信模板
2013/12/02 职场文书
法学专业求职信
2014/07/15 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
公司更名通知函
2015/04/24 职场文书