热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Matplotlib在图表中嵌入图片`imshow`的各种用法解析

Matplotlib是一个用于绘制图表的Python标准库,可以用来完成可

Matplotlib 是一个用于绘制图表的 Python 标准库,可以用来完成可视化、数据分析、动画制作、科研制图等任务。本文介绍如何在 Matplotlib 的图表中嵌入图片。Matplotlib 中用来显示图片的基本函数是 plt.imshow,根据不同的用途,该函数有多种用法,本文将一一介绍。本文内容按照知识点的递进关系先后展开叙述,适合顺序阅读。

目录

  • 单纯展示图片
  • 充当背景板
  • 补充知识:用 Matplotlib 生成动画
  • 指定位置嵌入图片
  • 设置渲染层级
  • 总结
  • 附录:本文所用图片

单纯展示图片

如果只是想单纯展示一张图片,只需先用 pillow 库读取图片,再调用 plt.imshow(img_data) 即可。

import matplotlib.pyplot as plt
from PIL import Image
plt.axis('off')
plt.imshow(Image.open('JOJO_stone_free.jpg'))
plt.show()

效果如下
在这里插入图片描述
这里为了美观关闭了坐标轴的显示,如果打开坐标轴,就会发现横坐标的范围从0到图片的宽度,而纵坐标的范围从图片的高度到0。

充当背景板

使用 imshow 方法不仅可以单纯展示图片,还可以将图片当成背景板,在上面进行一些其它的绘制。在刚刚的展示图片基础上,让我们再绘制一些其它的图形,代码如下:

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
jojo = Image.open('JOJO_stone_free.jpg')
print(jojo.width, jojo.height) # 输出为 (854, 480)
# 显示范围为图片的大小
plt.xlim(0, jojo.width)
plt.ylim(jojo.height, 0)
plt.axis('off')
## draw a heart
t = np.linspace(600, 680, 1000)
k = 0.3
g = 10
y = - (g * (t - 640) * (t - 640)) ** (1/3) + (1600 - (t - 640)**2) ** 0.5 * np.sin(k * np.pi * (t - 640)) + 100
plt.plot(t, y, c='r')
# draw background
plt.imshow(jojo)
plt.show()

效果如下:
在这里插入图片描述
注意到我们这里的代码把背景渲染的代码放在了爱心的后面,而最终的显示结果仍然是爱心在背景的上面。这是因为 Matplotlib 的每个对象都有特定的渲染层级,而 Matplotlib 默认把图片的渲染层级放在比较靠下的位置。若要改变渲染层级,可参考文章后面的内容。

补充知识:用 Matplotlib 生成动画

众所周知,Matplotlib 不仅可以绘图, 还可以生成动画。负责生成动画的函数是 FuncAnimation, 使用前需先将其导入:

from matplotlib.animation import FuncAnimation

关于动画生成,CSDN上的教程已经不计其数,这里不再赘述了。

指定位置嵌入图片

控制图片的位置和大小是由 originextent 两个参数来实现的。origin 有 “upper” 和 “lower” 两个取值,决定了图片是正着的还是倒着的。extent=(L, R, B, T) 则决定了图片的边界坐标,L, R, B, T 分别代表了图片的最左端,最右端,最底端,最上端的坐标。

下面一个 demo 演示了如何设置图片的指定位置。超级马里奥位于一个 10x10的格子中,他需要从左下角走到右上角,从而吃到能让自己变大变强的蘑菇。

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
from PIL import Image
# 读取图片
mario_img = Image.open('mario.png')
mushroom_img = Image.open('mushroom.png')
# 设置画布
fig, ax = plt.subplots()
plt.axis('off')
ax.set_xlim(-0.5, 10.5)
ax.set_ylim(-0.5, 10.5)
ax.vlines(np.arange(11), 0, 10)
ax.hlines(np.arange(11), 0, 10)
# 画蘑菇
mushroom = ax.imshow(mushroom_img, extent=(9, 10, 9, 10))
# 画马里奥
mario_x = 1
mario_y = 1
mario = ax.imshow(mario_img, extent=(mario_x - 1, mario_x, mario_y - 1, mario_y))
def move():
global mario_x, mario_y
if mario_x == 10 == mario_y: # 吃到蘑菇了噢
mario_x = mario_y = 1
return True
elif mario_x == 10:
mario_y += 1
elif mario_y == 10:
mario_x += 1
else:
if np.random.random() < 0.5:
mario_x += 1
else:
mario_y += 1
return False # 还没吃到蘑菇呢!
def init():
pass
def update(frame):
mario.set_extent((mario_x - 1, mario_x, mario_y - 1, mario_y))
# 若吃到蘑菇则隐藏蘑菇,避免两张图片重叠,更好看一点
if move():
mushroom.set_alpha(0)
else:
mushroom.set_alpha(1)
ani = FuncAnimation(fig, update, frames=range(180), blit=False, interval=300,
repeat=False, init_func=init)
ani.save('mario_like_mushroom.gif')

效果如下:
在这里插入图片描述

设置渲染层级

在 Matplotlib 中,参数 zorder 被用来控制对象的渲染层级,它的值越大,对象在渲染时就处在越上面。这里运用 Matplotlib 的动画模块,写了一个简单的小 demo,来展示 zorder 的作用。代码如下:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from PIL import Image
# 读取图片
gold_sword = Image.open('golden_sword.png')
diamond_sword = Image.open('diamond_sword.png')
tony_stark = Image.open('tony_stark.png')
cap_am = Image.open('cap_am.png')
# 画布设置
fig, ax = plt.subplots()
plt.axis('off')
ax.set_xlim(0, 1000)
ax.set_ylim(0, 600)
# 显示图片
gs = plt.imshow(gold_sword, extent=(376, 576, 200, 300))
ds = plt.imshow(diamond_sword, extent=(424, 624, 200, 300))
ca = plt.imshow(cap_am, extent=(50, 350, 100, 500))
im = plt.imshow(tony_stark, extent=(650, 950, 100, 500))
# 初始化函数,这里不需要任何操作
def init():
pass
# 更新函数,帧数为奇数时金剑在上面,偶数时钻石剑在上面
def update(frame):
if frame % 2 == 0:
gs.set_zorder(0)
ds.set_zorder(1)
else:
gs.set_zorder(1)
ds.set_zorder(0)
# 设置动画
ani = FuncAnimation(fig, update, frames=range(100), blit=False,
interval=300, repeat=False, init_func=init)
# 保存为 gif 图片
ani.save('fighting.gif')

效果如下:
在这里插入图片描述

总结

好了,以上就是本文的全部内容。在本文中,我们学会了使用 Matplotlib 的 imshow 方法来绘制图片,它既可以用来单纯展示,也可以充当某个图像的背景板。同时,我们还学会了如何设置图片的位置和渲染层级,给图片赋予了更多的灵活度。此外,我们用 FuncAnimation 制作了一些动画,来展示 imshow 的各个特性。还是挺有意思的,呵呵。

附录:本文所用图片

这里提供了本文中的代码所用的图片,方便大家下载学习。如有侵权,请及时联系我删除。
JOJO_stone_free.jpg
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


推荐阅读
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
author-avatar
老美1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有