5

rotate_around()関数とrotate_deg_around()関数を使用して、特定のポイントを中心にmatplotlib長方形パッチオブジェクトを回転させようとしています。ただし、パッチは常に原点を中心に回転しています。パッチオブジェクトが特定のポイントを中心に回転することを確認する方法がわかりません。

ここでのコードは次のとおりです。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib as mpl
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-0.05,1);ax.set_ylim(-0.05,1);
grid('on');

#Rotate rectangle patch object
ts = ax.transData
tr = mpl.transforms.Affine2D().rotate_deg_around(0.2,0.5,10)
t= ts + tr

rec0 = patches.Rectangle((0.2,0.5),0.25,0.2,alpha=0.5)
ax.add_patch(rec0)

#Rotated rectangle patch
rect1 = patches.Rectangle((0.2,0.5),0.25,0.2,color='blue',alpha=0.5,transform=t)
ax.add_patch(rect1);

#The (desired) point of rotation
ax.scatter([0.0,0.2],[0.0,0.5],c=['g','r'],zorder=10)
txt = ax.annotate('Desired point of rotation',xy=(0.2,0.5),fontsize=16,\
xytext=(0.25,0.35),arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=-.2"))
txt2 = ax.annotate('Actual point of rotation',xy=(0.0,0.0),fontsize=16,\
xytext=(0.15,0.15),arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))

plt.show()

上記のコードの出力は次のとおりです。

ここに画像の説明を入力してください

また、translate、rotate_about_origin、およびtranslate_backを実行しようとしました。ただし、変換変換も機能していませんでした。簡単な翻訳のヘルプ/例も非常に役立ちます。

ありがとうございました。

4

3 に答える 3

5

回転する座標はデータ座標ではありません。最初にそれらを変換する必要があります。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib as mpl
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-0.05,1);ax.set_ylim(-0.05,1);
plt.grid('on');

#Rotate rectangle patch object
ts = ax.transData
coords = ts.transform([0.2, 0.5])
tr = mpl.transforms.Affine2D().rotate_deg_around(coords[0], coords[1], 10)
t= ts + tr

rec0 = patches.Rectangle((0.2,0.5),0.25,0.2,alpha=0.5)
ax.add_patch(rec0)

#Rotated rectangle patch
rect1 = patches.Rectangle((0.2,0.5),0.25,0.2,color='blue',alpha=0.5,transform=t)
ax.add_patch(rect1);

#The (desired) point of rotation
ax.scatter([0.0,0.2],[0.0,0.5],c=['g','r'],zorder=10)
txt = ax.annotate('Desired point of rotation',xy=(0.2,0.5),fontsize=16,\
xytext=(0.25,0.35),arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=-.2"))
txt2 = ax.annotate('Actual point of rotation',xy=(0.0,0.0),fontsize=16,\
xytext=(0.15,0.15),arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))

plt.show()

編集:

どうやら、コードはインタラクティブ表示でのみ機能しますが、ウィンドウのサイズが変更されたり、図が保存されたりした場合は機能しません。次の2つの画像を比較してください。

インタラクティブディスプレイ 保存された図

于 2013-03-22T08:40:58.813 に答える
0

@David Zwicker、正しい方向を示してくれてありがとう。次のコードは、インタラクティブモードで適切に機能し(つまり、Figureウィンドウのサイズを変更できます)、独立して、またはIpythonQtConsole環境内で実行されます。以下の埋め込み図を参照してください。ただし、IpythonWebノートブック環境ではまだ機能しません。それに関するどんな助け/アイデアも素晴らしいでしょう。ありがとうございました。

#Imports
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['figure.dpi'] = 80   # default = 80
mpl.rcParams['savefig.dpi'] = 80  # default = 100
import matplotlib.patches as patches
import numpy as np

#Need to ensure that the figure.dpi (for displaying figure window) and 
#savefig.dpi are consistent.

def redraw(event):
    """Redraw the plot on a resize event"""
    if  np.size(plt.get_figlabels()):
        #Need to check if figure is closed or not and only then do the following
        #operations. Else, the following operations will create a new figure
        ax.clear()
        drawRectangles(ax)
        fig.canvas.draw()
    else:
        pass


def drawRectangles(ax):
    """Function to draw the normal and rotated patch in the transformed domain"""
    #Transform for data coordinates to display coordinates
    td2dis = ax.transData
    coords = td2dis.transform([0.2, 0.5])
    #rotate transform
    tr = mpl.transforms.Affine2D().rotate_deg_around(coords[0], coords[1], 10)
    t = td2dis + tr
    rec0 = patches.Rectangle((0.2,0.5),0.25,0.2,color='blue',alpha=0.5)
    ax.add_patch(rec0)
    #Rotated rectangle patch
    rect1 = patches.Rectangle((0.2,0.5),0.25,0.2,color='blue',alpha=0.5,transform=t)
    ax.add_patch(rect1);
    plt.grid()


figSize = (8,6)
fig = plt.figure("Patch rotate",figsize=figSize)

ax = fig.add_subplot(111)
ax.set_xlim(0,1);ax.set_ylim(0,1);
fig.canvas.mpl_connect('resize_event', redraw)
drawRectangles(ax)

plt.savefig("myfigure.png")
plt.show()

上記のコードのサンプルを次に示します。

コード内でsavefig()関数を使用して保存された画像: ここに画像の説明を入力してください

ナビゲーションパネルの保存ボタンを使用して保存された画像: ここに画像の説明を入力してください

サイズ変更後にナビゲーションパネルの保存ボタンを使用して保存された画像: ここに画像の説明を入力してください ここに画像の説明を入力してください

于 2013-03-30T21:23:22.527 に答える
0

保存すると、Ipythonがレイヤーを変更するようです。長方形を回転させるための変換は、表示座標に依存します。表示座標は、インタラクティブウィンドウでのズームなど、レイヤーをズームアウトまたは変更するときに変更できます。

データ座標で長方形を回転させることができます。図形の回転(パッチ)とPythonでの色の適用を参照してください

回転した長方形が変形しないようにするには、「ax.set_aspect('equal')」が必要です。

于 2016-06-29T11:40:14.330 に答える