使用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单元测试框架unittest简明使用实例
Apr 13 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
python psutil库安装教程
Mar 19 Python
python 获取图片分辨率的方法
Jan 08 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
numpy linalg模块的具体使用方法
May 26 Python
我就是这样学习Python中的列表
Jun 02 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
详解python中eval函数的作用
Oct 22 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
利用python做表格数据处理
Apr 13 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
php计算年龄精准到年月日
2015/11/17 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
js定时器实例分享
2016/12/20 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
微信小程序实现简单表格
2019/02/14 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
js中数组常用方法总结(推荐)
2019/04/09 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
python3正则提取字符串里的中文实例
2019/01/31 Python
用Python写一个自动木马程序
2019/09/17 Python
python创建学生管理系统
2019/11/22 Python
django 模型中的计算字段实例
2020/05/19 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
利用python 下载bilibili视频
2020/11/13 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
学校门卫管理制度
2014/01/30 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
何玥事迹观后感
2015/06/16 职场文书