![](/img/trans.png)
[英]How to embed a zoomed portion of a FITS image in the same plot with APLpy
[英]How to zoomed a portion of image and insert in the same plot in 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()
使用可運行代碼是學習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
的新文件中。
如果我們將.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命令 ,但如果不是,將數字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
。
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=[])
你可以在你的代碼中使用它,如下所示:
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()
最簡單的方法是組合“zoomed_inset_axes”和“mark_inset”,其描述和相關示例可在此處找到: AxesGrid工具包概述
我知道要做的最好的方法是使用mpl_toolkits.axes_grid1.inset_locator(matplotlib的一部分)。
這里有一個很好的源代碼示例: https://github.com/NelleV/jhepc/tree/master/2013/entry10
使用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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.