57

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

放大图

是否可以在同一个图中插入一部分缩放图像。我认为可以用 subplot 绘制另一个图形,但它会绘制两个不同的图形。我还阅读了添加补丁以插入矩形/圆形,但不确定将一部分图像插入图中是否有用。我基本上从文本文件中加载数据并使用如下所示的简单绘图命令对其进行绘图。

我在这里从 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()
4

4 回答 4

39

使用可运行代码是学习 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=[])

将示例代码复制到一个名为test.py.

如果我们改变.65to会发生什么.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 命令,但如果不是,将数字 400 更改为例如 10,将生成具有更粗的直方图的图像,因此再次使用数字您很快就会弄清楚这条线与插图内的图像有关。

你会想在semilogx(data[3:8,1],data[3:8,2])这里打电话。

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

最后我们来了setp(a, xticks=[], yticks=[])。没有数字可玩,所以如果我们通过在行首放置 a 来注释整行会发生什么#

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

重新运行脚本。哦!现在插入轴上有很多刻度线和刻度线标签。美好的。所以现在我们知道这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 的经验。通常,您只需在诸如andplt.之类的裸名称前添加,但有时函数来自 numpy,有时调用应该来自轴对象,而不是来自模块。需要经验才能知道所有这些功能的来源。谷歌搜索函数的名称和“matplotlib”会有所帮助。阅读示例代码可以积累经验,但没有捷径可走。axessetpplt

因此,转换后的代码变为

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()
于 2012-11-27T14:11:26.960 回答
36

最简单的方法是结合“zoomed_inset_axes”和“mark_inset”,其描述和相关示例可以在这里找到: AxesGrid 工具包概述

在此处输入图像描述

于 2014-05-20T14:16:51.380 回答
25

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

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

于 2014-04-10T13:09:12.867 回答
13

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

在此处输入图像描述

于 2017-07-03T12:36:50.460 回答