57

データ/画像の一部をズームして、同じ図の中にプロットしたいと思います。この図のように見えます。

拡大プロット

同じプロット内に拡大画像の一部を挿入することは可能ですか? サブプロットで別の図を描くことは可能だと思いますが、2 つの異なる図が描かれます。長方形/円を挿入するためのパッチを追加することも読みましたが、画像の一部を図に挿入するのに役立つかどうかはわかりません。基本的に、テキスト ファイルからデータを読み込み、以下に示す単純なプロット コマンドを使用してプロットします。

ここでmatplotlibイメージギャラリーから関連する例を1つ見つけましたが、それがどのように機能するかわかりません。あなたの助けに感謝します。

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を学ぶための最速の方法の1つです。

それでは、matplotlibサンプルギャラリーのコードから始めましょう。

コード内のコメントを考えると、コードは4つの主要なスタンザに分割されているように見えます。最初のスタンザはいくつかのデータを生成し、2番目のスタンザはメインプロットを生成し、3番目と4番目のスタンザははめ込み軸を作成します。

データを生成してメインプロットをプロットする方法を知っているので、3番目のスタンザに焦点を当てましょう。

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=[])ます。#遊ぶ数字はないので、行の先頭にaを付けて、行全体をコメントアウトするとどうなりますか。

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

スクリプトを再実行します。おー!現在、はめ込み軸にはたくさんの目盛りと目盛りラベルがあります。罰金。setp(a, xticks=[], yticks=[])これで、軸から目盛りとラベルが削除されることがわかりましたa

これで、理論的には、このコードを問題に適用するのに十分な情報が得られます。しかし、もう1つの潜在的な障害があります。matplotlibの例では 、を使用しているのfrom pylab import * に対し、を使用していますimport matplotlib.pyplot as plt

matplotlib FAQimport matplotlib.pyplot as plt 、スクリプトを作成するときにmatplotlibを使用するための推奨される方法であり from pylab import *、インタラクティブセッションで使用するためのものであると述べています。だからあなたはそれを正しい方法でやっています(私もimport numpy as np代わりに使うことをお勧めしますfrom numpy import *が)。

では、matplotlibの例をどのように変換して実行するのimport matplotlib.pyplot as pltでしょうか?

変換を行うには、matplotlibの経験が必要です。通常、andplt.のような裸の名前の前に追加するだけですが、関数がnumpyから来る場合もあれば、呼び出しがモジュールからではなく、axesオブジェクトから来る場合もあります。これらすべての機能がどこから来ているのかを知るには経験が必要です。「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 に答える