使用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列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
对python for 文件指定行读写操作详解
Dec 29 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python decimal模块使用方法详解
Jun 08 Python
Python中的面向接口编程示例详解
Jan 17 Python
python3 字符串str和bytes相互转换
Mar 23 Python
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
Python进程池与进程锁之语法学习
Python进程间的通信之语法学习
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
浅析Python OpenCV三种滤镜效果
实战Python爬虫爬取酷我音乐
You might like
CodeIgniter基本配置详细介绍
2013/11/12 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
python tornado微信开发入门代码
2018/08/24 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
python实现感知机模型的示例
2020/09/30 Python
python3中编码获取网页的实例方法
2020/11/16 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
会计电算化应届生自荐信
2014/02/25 职场文书
诚信考试倡议书
2014/04/15 职场文书
招标授权委托书样本
2014/09/23 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书