使用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基础之入门必看操作
Jul 26 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Python中修改字符串的四种方法
Nov 02 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
django如何通过类视图使用装饰器
Jul 24 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
opencv实现图像平移效果
Mar 24 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
php生成excel文件的简单方法
2014/02/08 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
浅谈PHP进程管理
2019/03/08 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
自己使用总结Python程序代码片段
2015/06/02 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
Python运行异常管理解决方案
2020/03/09 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
绿化先进工作者事迹材料
2014/01/30 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
先进集体获奖感言
2014/02/13 职场文书
交通事故私了协议书
2014/04/16 职场文书
受资助学生感谢信
2015/01/21 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
宿舍管理制度范本
2015/08/07 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
MySQL 计算连续登录天数
2022/05/11 MySQL