python画图|放大和缩小图像

在较多的画图场景中,需要对图像进行局部放大,掌握相关方法非常有用,因此我们很有必要一起学习

【1】官网教程

首先是进入官网教程,找到学习资料:

https://matplotlib.org/stable/gallery/subplots_axes_and_figures/axes_margins.html#sphx-glr-gallery-subplots-axes-and-figures-axes-margins-py

在这里可以看到好看的放大和缩小视图。

【2】代码解读

引入计算模块numpy和画图模块matplotlib:

复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

from matplotlib.patches import Polygon

然后自定义函数:

复制代码
def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)  #定义子函数

之后定义自变量:

复制代码
t1 = np.arange(0.0, 3.0, 0.01) #定义变量

再之后定义画图:

复制代码
ax1 = plt.subplot(212) #定义2行1列第2个图形
ax1.margins(0.05)           # Default margin is 0.05, value 0 means fit
ax1.plot(t1, f(t1)) #输出图形

ax2 = plt.subplot(221) #定义2行2列第1个图形
ax2.margins(2, 2)           # Values >0.0 zoom out
ax2.plot(t1, f(t1))
ax2.set_title('Zoomed out')

ax3 = plt.subplot(222) #定义2行2列第2个图形
ax3.margins(x=0, y=-0.25)   # Values in (-0.5, 0.0) zooms in to center
ax3.plot(t1, f(t1))
ax3.set_title('Zoomed in')

最后输出图形:

复制代码
plt.show()

输出图形为:

++图1++

由图1可见,通过调节margins()函数中的值,调节函数曲线和X轴Y轴的距离,进而实现图像的放大和缩小。

【3】margins()和xlim()函数/ylim()函数效果对比

前在述学习过程中,已经多次使用xlim()函数和ylim()函数来设置作标轴范围,进而实现对图像的大小进行缩放,未进行对比,将margins()和xlim()函数/ylim()函数效果进行同时输出,设置画图程序如下:

复制代码
ax1 = plt.subplot(311) #定义3行1列第1个图形
ax1.margins(0.05)           # Default margin is 0.05, value 0 means fit
ax1.plot(t1, f(t1)) #输出图形
ax1.set_title('Zoomed',y=0.68)

ax2 = plt.subplot(312) #定义3行1列第2个图形
ax2.set_ylim(-0.65, 1.1) # Values >0.0 zoom out
ax2.plot(t1, f(t1),color='blue')
ax2.set_title('Set_ylim',y=0.68)
ax2.set_facecolor((0.66,0.36,0.86))

ax3 = plt.subplot(313) #定义3行1列第3个图形
#ax3.margins(x=0, y=-0.25)   # Values in (-0.5, 0.0) zooms in to center
ax3.plot(t1, f(t1),color='green')
ax3.set_title('Origin',y=0.68)
ax3.set_facecolor('#eafff5')

由代码可见,ax1使用了margins()函数,ax2使用了set_ylim()函数,ax3未做限制是默认输出。

运行代码后的结果为:

++图2++

由图2可见,margins()和xlim()函数/ylim()函数效果都可以实现良好的输出效果。

如果不想进行限制,默认输出效果同样不错。

实际画图过程中,可根据需要灵活使用函数或者不使用函数以实现画图目的。

至此的完整代码为:

python 复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

from matplotlib.patches import Polygon


def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)  #定义子函数


t1 = np.arange(0.0, 3.0, 0.01) #定义变量

ax1 = plt.subplot(311) #定义3行1列第1个图形
ax1.margins(0.95)           # Default margin is 0.05, value 0 means fit
ax1.plot(t1, f(t1)) #输出图形
ax1.set_title('Zoomed',y=0.68)

ax2 = plt.subplot(312) #定义3行1列第2个图形
ax2.set_ylim(-0.65, 1.1) # Values >0.0 zoom out
ax2.plot(t1, f(t1),color='blue')
ax2.set_title('Set_ylim',y=0.68)
ax2.set_facecolor((0.66,0.36,0.86))

ax3 = plt.subplot(313) #定义3行1列第3个图形
#ax3.margins(x=0, y=-0.25)   # Values in (-0.5, 0.0) zooms in to center
ax3.plot(t1, f(t1),color='green')
ax3.set_title('Origin',y=0.68)
ax3.set_facecolor('#eafff5')

plt.show()

【4】尝试在图形中增开缩小试图

前面已经掌握了对图形进行缩小和方法的方法,有时候需要在一个稍大的图形中,再增加一个缩略图形,为此有必要继续探索。

下述链接给出了简单的教程,点击可一步直达:

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.inset_axes.html#matplotlib.axes.Axes.inset_axes

基于此我们尝试给margins()函数输出图形增加一个缩略图,增加下述代码:

复制代码
axins=ax1.inset_axes((0.85,0.5,0.15,0.5))
axins.plot(t1,f(t1))

输出图形为:

图3

图3即为增加缩略图后的图形。

此时的完整代码为:

python 复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

from matplotlib.patches import Polygon


def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)  #定义子函数


t1 = np.arange(0.0, 3.0, 0.01) #定义变量

ax1 = plt.subplot(311) #定义3行1列第1个图形
ax1.margins(0.95)           # Default margin is 0.05, value 0 means fit
ax1.plot(t1, f(t1)) #输出图形
ax1.set_title('Zoomed',y=0.68)
axins=ax1.inset_axes((0.85,0.5,0.15,0.5))
axins.plot(t1,f(t1))

ax2 = plt.subplot(312) #定义3行1列第2个图形
ax2.set_ylim(-0.65, 1.1) # Values >0.0 zoom out
ax2.plot(t1, f(t1),color='blue')
ax2.set_title('Set_ylim',y=0.68)
ax2.set_facecolor((0.66,0.36,0.86))

ax3 = plt.subplot(313) #定义3行1列第3个图形
#ax3.margins(x=0, y=-0.25)   # Values in (-0.5, 0.0) zooms in to center
ax3.plot(t1, f(t1),color='green')
ax3.set_title('Origin',y=0.68)
ax3.set_facecolor('#eafff5')

plt.show()

【5】局部放大和整体缩小

如果主要想展示局部放大图,同时展示整体缩略图,可以如下设置:

python 复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

from matplotlib.patches import Polygon


def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)  #定义子函数


t1 = np.arange(0.0, 3.0, 0.01) #定义变量

fig , ax1 = plt.subplots( ) #定义3行1列第1个图形
ax1.margins(0.05)           # Default margin is 0.05, value 0 means fit
ax1.plot(t1, f(t1)) #输出图形
ax1.set_title('Zoomed',y=0.68)
axins=ax1.inset_axes((0.85,0.5,0.15,0.5))
axins.plot(t1,f(t1))


plt.show()

输出图像为:

++图4++

图4为常规的图像,大图和小图都是整体图。

继续调节,将margins()进行修改:

复制代码
ax1.margins(x=-0.25,y=-0.25)           # Default margin is 0.05, value 0 means fit
ax1.set_ylim(-0.25,0.5)

在修改margins()时,负数可以实现图像放大,设置set_ylim()可以更好地表达图像。

输出图像为:

++图5++

python 复制代码
import matplotlib.pyplot as plt #引入matplotlib模块画图
import numpy as np #引入numpy模块做数学计算

from matplotlib.patches import Polygon


def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)  #定义子函数


t1 = np.arange(0.0, 3.0, 0.01) #定义变量

fig , ax1 = plt.subplots( ) #定义3行1列第1个图形
ax1.margins(x=-0.25,y=-0.25)           # Default margin is 0.05, value 0 means fit
ax1.set_ylim(-0.25,0.5)
ax1.plot(t1, f(t1)) #输出图形
ax1.set_title('Zoomed',y=0.68)
axins=ax1.inset_axes((0.85,0.5,0.15,0.5))
axins.plot(t1,f(t1))


plt.show()

继续对代码稍作修改:

复制代码
fig , ax1 = plt.subplots( ) #定义3行1列第1个图形
ax1.margins(x=-0.25,y=-0.25)           # Default margin is 0.05, value 0 means fit
ax1.set_ylim(-0.25,0.5)
ax1.plot(t1, f(t1)) #输出图形
ax1.set_title('Zoomed')
axins=ax1.inset_axes((0.8,0.7,0.2,0.3))
axins.plot(t1,f(t1))

输出图像优化为:

++图6++

可见图6更好地进行了表达。

【6】总结

学习了图像大放大和缩小技巧,探索了将放大和缩小图放在同一个坐标轴内的技巧。

相关推荐
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击2 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue4 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
m0_555762904 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊5 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
烛阴6 小时前
简单入门Python装饰器
前端·python
lzb_kkk6 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼6 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开6 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
简佐义的博客7 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang