使用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基于pygame实现的font游戏字体(附源码)
Nov 11 Python
利用Python如何生成hash值示例详解
Dec 20 Python
Python实现KNN邻近算法
Jan 28 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Django 跨域请求处理的示例代码
May 02 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
python学生信息管理系统实现代码
Dec 17 Python
Python Numpy库常见用法入门教程
Jan 16 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
php+mysql事务rollback&commit示例
2010/02/08 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
参观监狱心得体会
2014/01/02 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
文明之星事迹材料
2014/05/09 职场文书
体育课外活动总结
2014/07/08 职场文书
学习教师法的心得体会
2014/09/03 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
车辆挂靠协议书
2016/03/23 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏