如何在matplotlib中缩放一部分图像并插入同一绘图

2024-10-05 14:24:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

zoomed plot

是否可以在同一绘图中插入缩放图像的一部分。我认为用子块画另一个图形是可能的,但它画了两个不同的图形。我还阅读了添加面片以插入矩形/圆形,但不确定将图像的一部分插入到图形中是否有用。我基本上是从文本文件中加载数据,然后使用下面显示的简单绘图命令进行绘图。

我在matplotlib图像库here中找到了一个相关的示例,但不确定它是如何工作的。非常感谢你的帮助。

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()

Tags: 数据图像import图形绘图datamatplotlibos
3条回答

最简单的方法是将“缩放插入轴”和“标记插入”相结合,其描述和 相关例子如下: Overview of AxesGrid toolkit

enter image description here

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

这里有一个很好的源代码示例:enter image description herehttps://github.com/NelleV/jhepc/tree/master/2013/entry10

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

所以让我们从code from the matplotlib example gallery开始。

考虑到代码中的注释,代码似乎分成了4个主要小节。 第一节生成一些数据,第二节生成主情节, 第三和第四节创造了插入轴。

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

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

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

如果我们将.65更改为.3,会发生什么?

a = axes([.35, .6, .2, .2], axisbg='y')

运行脚本:

python test.py

你会发现“概率”插图移到左边。 因此axes函数控制插入的位置。 如果你再玩一些数字,你会发现(.35,.6)是 插图左下角的位置,.2,.2是 插图的高度。数字从0到1,(0,0)位于 图的左下角。

好吧,现在我们在做饭。下一行我们有:

n, bins, patches = hist(s, 400, normed=1)

你可能认为这是matplotlib command for drawing a histogram,但是 如果不是,将数字400改为,比如说10,将会产生一个 更粗的柱状图,所以通过玩数字你很快就会知道 这一行与插图中的图像有关。

您需要在这里呼叫semilogx(data[3:8,1],data[3:8,2])

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

最后我们来到setp(a, xticks=[], yticks=[])。没有数字可玩, 所以,如果我们在整行的开头加上一个#注释,会发生什么情况:

# setp(a, xticks=[], yticks=[])

重新运行脚本。哦!现在在插入轴上有很多记号和记号标签。 好的。现在我们知道setp(a, xticks=[], yticks=[])从轴a中移除记号和标签。

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

The matplotlib FAQimport matplotlib.pyplot as plt 建议在编写脚本时使用matplotlib,而 from pylab import *用于交互式会话。所以你的方法是正确的(尽管我建议你使用import numpy as np,而不是from numpy import *)。

那么,如何将matplotlib示例转换为使用import matplotlib.pyplot as plt运行?

进行转换需要一些matplotlib的经验。一般来说,你只是 在诸如axessetp之类的裸名称前面添加plt.,但有时 函数来自numpy,有时调用应该来自axes 对象,而不是来自模块plt。要知道这些都在哪里需要经验 功能来自。在google上搜索函数名和“matplotlib”可以有所帮助。 阅读示例代码可以积累经验,但没有简单的捷径。

因此,转换后的代码

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

你可以这样在代码中使用它:

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()

相关问题 更多 >