使用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解决鸡兔同笼问题的方法
Dec 20 Python
python实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
Python使用asyncio包处理并发详解
Sep 09 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python修改txt文件中的某一项方法
Dec 29 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Python底层封装实现方法详解
Jan 22 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
php牛逼的面试题分享
2013/01/18 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
用JS剩余字数计算的代码
2008/07/03 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
Node.js事件驱动
2015/06/18 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
javascript异步编程的六种方式总结
2019/05/17 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
Python 实现取多维数组第n维的前几位
2019/11/26 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
心理健康教育制度
2014/01/27 职场文书
自查自纠整改报告
2014/11/06 职场文书
教师年度考核个人总结
2015/02/12 职场文书
市场部岗位职责
2015/02/12 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
综合素质自我评价评语
2015/03/06 职场文书
中秋节主题班会
2015/08/14 职场文书
初三语文教学反思
2016/03/03 职场文书
经销商会议开幕词
2016/03/04 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书