4

matplotlib-pyplot (Python ライブラリ) で生成されたプロットを 45 度回転する方法を探しています (たとえば、正方形の代わりにダイヤモンドの形になるように)、これができるかどうかは誰でも知っていますか?

私が考えることができる 1 つの方法は、すべてのデータに回転フィルターを使用して、回転して見えるようにすることですが、プロット自体は元の向きのままになります。

matplotlib のインタラクティブ機能を使用できるようにしたいので、画像として保存してから回転させることはできません。

また、pyplot 関数を使用してプロットを描画したいので、プロットに別のライブラリを使用することは理想的な解決策ではありません。

4

5 に答える 5

6

わかりましたので、現在私が見つけた唯一の部分的な解決策は、プロットに回転を適用することです。これにより、matplotlib/pyplot が提供するインタラクティブなインターフェイスを使用できます。

plot() や scatter() のようなドット プロットの場合、これは些細なことですが、imshow() のローテーションに特に興味がありました。このリンクでは、このタスクに使用される可能性がある変換キーワードについて説明していますが、明らかに機能していません。

幸いなことに、pcolormesh() を使用して回避策を見つけました。pcolormesh() は、四角形メッシュをプロットし、コーナー座標を指定できるようにします。したがって、答えは、関連する変換をコーナー座標に適用することです。ただし、pcolormesh() は imshow とは少し異なる動作をすることに注意してください。反転したマトリックスをプロットします。

私はこのソリューションを Web のどこにも見たことがないので、45 度回転した pcolormesh()/imshow() のコードを次に示します。

import matplotlib.pyplot as plt
import numpy as np

def pcolormesh_45deg(C):

    n = C.shape[0]
    # create rotation/scaling matrix
    t = np.array([[1,0.5],[-1,0.5]])
    # create coordinate matrix and transform it
    A = np.dot(np.array([(i[1],i[0]) for i in itertools.product(range(n,-1,-1),range(0,n+1,1))]),t)
    # plot
    plt.pcolormesh(A[:,1].reshape(n+1,n+1),A[:,0].reshape(n+1,n+1),np.flipud(C))
于 2012-11-20T16:38:18.530 に答える
2

Bitwise anwer に基づいて、次の関数を使用できます。

def pcolormesh_45deg(C, ax=None, xticks=None, xticklabels=None, yticks=None,
                     yticklabels=None, aspect='equal', rotation=45,
                     *args, **kwargs):
    import itertools

    if ax is None:
        ax = plt.gca()
    n = C.shape[0]
    # create rotation/scaling matrix
    t = np.array([[1, .5], [-1, .5]])
    # create coordinate matrix and transform it
    product = itertools.product(range(n, -1, -1), range(0, n + 1, 1))
    A = np.dot(np.array([(ii[1], ii[0]) for ii in product]), t)
    # plot
    ax.pcolormesh((2 * A[:, 1].reshape(n + 1, n + 1) - n),
                  A[:, 0].reshape(n + 1, n + 1),
                  np.flipud(C), *args, **kwargs)

    xticks = np.linspace(0, n - 1, n, dtype=int) if xticks is None else xticks
    yticks = np.linspace(0, n - 1, n, dtype=int) if yticks is None else yticks

    if xticks is not None:
        xticklabels = xticks if xticklabels is None else xticklabels
        for tick, label, in zip(xticks, xticklabels):
            ax.scatter(-n + tick + .5, tick + .5, marker='x', color='k')
            ax.text(-n + tick + .5, tick + .5, label,
                    horizontalalignment='right', rotation=-rotation)
    if yticks is not None:
        yticklabels = yticks if yticklabels is None else yticklabels
        for tick, label, in zip(yticks, yticklabels):
            ax.scatter(tick + .5, n - tick - .5, marker='x', color='k')
            ax.text(tick + .5, n - tick - .5, label,
                    horizontalalignment='left', rotation=rotation)

    if aspect:
        ax.set_aspect(aspect)
    ax.set_xlim(-n, n)
    ax.set_ylim(-n, n)
    ax.plot([-n, 0, n, 0., -n], [0, n, 0, -n, 0], color='k')
    ax.axis('off')
    return ax
于 2015-08-13T01:46:49.460 に答える
1

おそらく、3Dプロットでそれを行うとしたら?

http://matplotlib.1069221.n5.nabble.com/How-to-rotate-a-3D-plot-td19185.html

axes3d.view_init(elev, azim)

于 2012-10-11T21:25:26.927 に答える
0

この投稿は、「手動」でのみ実行できることを示唆しています。

描画することは可能ですが、軸を Line2D インスタンスとして描画し、ラベルを Text インスタンスとして描画するなど、すべての変換/回転を手動で行う必要があります (たとえば、アーカイブの「Scatter3D」の例を参照してください)。現在、組み込みの簡単な方法はありません。予定されている軸処理のリファクタリングでは、

于 2012-10-11T21:16:59.097 に答える
0

PILを見たことがありますか?

このコードは画像を回転させます。したがって、最初にプロットを画像としてファイルに出力すると、次のことができます

import Image
img = Image.open("plot.jpg")
img2 = img.rotate(45)
img2.show()
img2.save("rotate.jpg")
于 2012-10-11T21:26:39.143 に答える