如何缩放图像的一部分并插入matplotlib中的相同图中

Ele*_*t28 43 python image matplotlib

我想缩放一部分数据/图像并将其绘制在同一图中.它看起来像这个数字.

缩放的情节

是否可以在同一绘图中插入一部分缩放图像.我认为可以用子图绘制另一个图,但它绘制了两个不同的数字.我还读过添加补丁来插入矩形/圆形,但不确定将图像的一部分插入图中是否有用.我基本上从文本文件加载数据并使用下面显示的简单绘图命令绘制它.

我在这里找到了matplotlib图片库中的一个相关示例,但不确定它是如何工作的.非常感谢您的帮助.

from numpy import *
import os
import matplotlib.pyplot as plt
data = loadtxt(os.getcwd()+txtfl[0], skiprows=1)
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.semilogx(data[:,1],data[:,2])
plt.show()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 30

使用可运行代码是学习Python的最快方法之一.

所以让我们从matplotlib示例库中代码开始.

鉴于代码中的注释,似乎代码被分解为4个主要节.第一节生成一些数据,第二节生成主图,第三节和第四节创建插入轴.

我们知道如何生成数据并绘制主要情节,所以让我们关注第三节:

a = axes([.65, .6, .2, .2], axisbg='y')
n, bins, patches = hist(s, 400, normed=1)
title('Probability')
setp(a, xticks=[], yticks=[])
Run Code Online (Sandbox Code Playgroud)

将示例代码复制到一个名为的新文件中test.py.

如果我们改变会发生什么.65.3

a = axes([.35, .6, .2, .2], axisbg='y')
Run Code Online (Sandbox Code Playgroud)

运行脚本:

python test.py
Run Code Online (Sandbox Code Playgroud)

你会发现"概率"插图向左移动.因此该axes函数控制插入的位置.如果你用数字玩更多,你会发现(.35,.6)是插图左下角的位置,而(.2,.2)是插图的宽度和高度.数字从0到1,(0,0)位于图的左下角.

好的,现在我们正在做饭.到下一行,我们有:

n, bins, patches = hist(s, 400, normed=1)
Run Code Online (Sandbox Code Playgroud)

您可能会将此识别为用于绘制直方图matplotlib命令,但如果不是,将数字400更改为,例如10,将生成具有更粗的直方图的图像,因此再次通过使用您很快就会发现的数字这条线与插图内的图像有关.

你想打电话semilogx(data[3:8,1],data[3:8,2])到这里.

该行title('Probability') 显然会在插图上方生成文本.

最后我们来了setp(a, xticks=[], yticks=[]).没有数字可以使用,所以如果我们只是通过在行#的开头放置一条注释掉整行来会发生什么:

# setp(a, xticks=[], yticks=[])
Run Code Online (Sandbox Code Playgroud)

重新运行脚本.哦! 现在插入轴上有很多刻度线和刻度标签.精细.所以现在我们知道setp(a, xticks=[], yticks=[])从轴上删除刻度线和标签a.

现在,从理论上讲,您有足够的信息将此代码应用于您的问题.但还有一个潜在的障碍:matplotlib示例使用 from pylab import * 而您使用import matplotlib.pyplot as plt.

matplotlib常见问题解答import matplotlib.pyplot as plt 是在编写脚本时使用matplotlib的推荐方法,而 from pylab import *用于交互式会话.所以你正在以正确的方式做到这一点,(虽然我建议使用import numpy as np而不是from numpy import *).

那么我们如何将matplotlib示例转换为运行import matplotlib.pyplot as plt

进行转换需要matplotlib的一些经验.一般来说,你只需添加plt.axes和的名字一样setp,但有时函数来自numpy,有时调用应来自轴对象,而不是来自模块plt.需要经验才能知道所有这些功能的来源.使用"matplotlib"搜索函数名称可以提供帮助.阅读示例代码可以构建体验,但没有简单的快捷方式.

因此,转换后的代码变为

ax2 = plt.axes([.65, .6, .2, .2], axisbg='y')
ax2.semilogx(t[3:8],s[3:8])
plt.setp(ax2, xticks=[], yticks=[])
Run Code Online (Sandbox Code Playgroud)

你可以在你的代码中使用它,如下所示:

from numpy import *
import os
import matplotlib.pyplot as plt
data = loadtxt(os.getcwd()+txtfl[0], skiprows=1)
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.semilogx(data[:,1],data[:,2])

ax2 = plt.axes([.65, .6, .2, .2], axisbg='y')
ax2.semilogx(data[3:8,1],data[3:8,2])
plt.setp(ax2, xticks=[], yticks=[])

plt.show()
Run Code Online (Sandbox Code Playgroud)


kev*_*vin 27

最简单的方法是组合"zoomed_inset_axes"和"mark_inset",其描述和相关示例可在此处找到: AxesGrid工具包概述

在此输入图像描述

  • 只是想更新 matplotlib 3.xx 的链接(此答案中的链接适用于 1.xx) https://matplotlib.org/stable/gallery/axes_grid1/inset_locator_demo2.html#sphx-glr-gallery-axes-grid1 -插入定位器-demo2-py (4认同)

Dav*_*son 22

我知道要做的最好的方法是使用mpl_toolkits.axes_grid1.inset_locator(matplotlib的一部分).

这里有一个很好的源代码示例: 在此输入图像描述https://github.com/NelleV/jhepc/tree/master/2013/entry10

  • 很不错的图! (2认同)

Amj*_*jad 7

使用matplotlib缩放图形的一部分的基本步骤

import numpy as np
from matplotlib import pyplot as plt

# Generate the main data
X = np.linspace(-6, 6, 1024)
Y = np.sinc(X)

# Generate data for the zoomed portion
X_detail = np.linspace(-3, 3, 1024)
Y_detail = np.sinc(X_detail)

# plot the main figure
plt.plot(X, Y, c = 'k')  

 # location for the zoomed portion 
sub_axes = plt.axes([.6, .6, .25, .25]) 

# plot the zoomed portion
sub_axes.plot(X_detail, Y_detail, c = 'k') 

# insert the zoomed figure
# plt.setp(sub_axes)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述