首页 文章

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

提问于
浏览
40

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

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

4 回答

  • 24

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

    你会发现"Probability"插图向左移动 . 所以 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 FAQ表示 import 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,有时调用应来自轴对象,而不是来自模块 plt . 需要经验才能知道所有这些功能的来源 . 使用"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()
    
  • 27

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

    enter image description here

  • 4

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

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

  • 20

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

    enter image description here

相关问题