2012-03-13 5 views
3

matplotlibギャラリーのcustom projectionの例を見ています。南半球のみをプロットするように修正しようとしています。私は必要な[-pi/2、pi/2]の制限を[-pi/2,0]に調整しました。今、私は見ています:matplotlib:半球/くさびのカスタムプロジェクション

def _gen_axes_patch(self): 
    """ 
    Override this method to define the shape that is used for the 
    background of the plot. It should be a subclass of Patch. 

    In this case, it is a Circle (that may be warped by the axes 
    transform into an ellipse). Any data and gridlines will be 
    clipped to this shape. 
    """ 
    #return Circle((0.5, 0.5), 0.5) 
    return Wedge((0.5,0.5), 0.5, 180, 360) 

def _gen_axes_spines(self): 
    return {'custom_hammer':mspines.Spine.circular_spine(self, 
                (0.5, 0.5), 0.25)} 

私は、サークルパッチをウェッジに置き換えました。 projection plot

脊柱はまだ円/楕円に沿っています。脊柱がくさびの境界を辿るように指定するにはどうすればよいですか?

私は脊柱をどのように修正するのがよいか分かりませんので、どんな助けでも大歓迎です!あなたはまだのpythonに新しいしている場合は念のため

おかげで、

アレックス

+0

有用!ありがとう! – aim

答えて

5

は、あなたは間違いなくストレートプールの奥に飛び込みました。

あなたがやっていることは、かなり複雑なライブラリであるmatplotlibの内部の仕組みについての十分な知識が必要です。

これまで言われたことは、すぐに学ぶのに良い方法です!

このような場合は、内部アーキテクチャを理解して、「公開」APIの代わりに物事がどのように構成されているかを理解する必要があります。

これのほとんどは、あなたが掘り下げて「ソースを使用する」必要があります。どのプロジェクトでも、内部動作のドキュメントはコードそのものです。

単純なケースで言えば、それはかなり簡単です。

def _gen_axes_spines(self): 
    """Return the spines for the axes.""" 
    # Make the path for the spines 
    # We need the path, rather than the patch, thus the "get_path()" 
    # The path is expected to be centered at 0,0, with radius of 1 
    # It will be transformed by `Spine` when we initialize it 
    path = Wedge((0, 0), 1.0, 180, 360).get_path() 

    # We can fake a "wedge" spine without subclassing `Spine` by initializing 
    # it as a circular spine with the wedge path. 
    spine = mspines.Spine(self, 'circle', path) 

    # This sets some attributes of the patch object. In this particular 
    # case, what it sets happens to be approriate for our "wedge spine" 
    spine.set_patch_circle((0.5, 0.5), 0.5) 

    # Spines in matplotlib are handled in a dict (normally, you'd have top, 
    # left, right, and bottom, instead of just wedge). The name is arbitrary 
    return {'wedge':spine} 

は今、これにはいくつかの問題がある:

import numpy as np 
from matplotlib.projections.geo import HammerAxes 
import matplotlib.projections as mprojections 
from matplotlib.axes import Axes 
from matplotlib.patches import Wedge 
import matplotlib.spines as mspines 

class LowerHammerAxes(HammerAxes): 
    name = 'lower_hammer' 
    def cla(self): 
     HammerAxes.cla(self) 
     Axes.set_xlim(self, -np.pi, np.pi) 
     Axes.set_ylim(self, -np.pi/2.0, 0) 

    def _gen_axes_patch(self): 
     return Wedge((0.5, 0.5), 0.5, 180, 360) 

    def _gen_axes_spines(self): 
     path = Wedge((0, 0), 1.0, 180, 360).get_path() 
     spine = mspines.Spine(self, 'circle', path) 
     spine.set_patch_circle((0.5, 0.5), 0.5) 
     return {'wedge':spine} 

mprojections.register_projection(LowerHammerAxes) 

if __name__ == '__main__': 
    import matplotlib.pyplot as plt 
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='lower_hammer') 
    ax.grid(True) 
    plt.show() 

enter image description here

のは_get_axes_spinesメソッドにビットを掘るましょう

  • 物事は内の中心に位置していない
      軸は正しく
    1. Axes内の部屋を適切に占有するために、軸パッチを少し大きくスケーリングすることができます。
    2. 地球全体のグリッド線を描いて、クリッピングしています。それを私たちの "低い"くさびの内側に描くだけで効率的です。我々はHammerAxesが構成されている方法を見てみたときに

  • はしかし、あなたは多くのこれらのもの(軸パッチの特にセンタリング)が効果的に変換にハードコードされていることがわかります。 (コメントの中で言及しているように、それは「おもちゃ」の例であり、あなたが常に地球全体を扱っていると仮定すると、変換の数学はずっと簡単になります。)

    これらを修正したい場合は、さまざまな変換のいくつかをHammerAxes._set_lim_and_transformsに調整する必要があります。

    しかし、それは合理的にそのまま動作するので、私はそれを読者の練習として残しておきます。私はまだPythonの初心者ですから、どのメソッドの説明も本当にそうです。(注意してください、matplotlibの変換の詳細な知識が必要なので、その部分は少し難しいです。)

    +0

    ありがとうジョー - これは本当に便利な答えです! (私はもっとカスタマイズされた何かが必​​要になるまで、私は多かれ少なかれパブリックAPIに固執していることを認めます)! get_axes_spinesの解説をありがとう。だから、 "パス"を使うことで、私は理論的に任意の形状に従う背骨を定義することができましたか? (変換はより複雑になりますが)。私はmatplotlibのドキュメントの必要なページの詳細な読書を持っていますが、私は同意して、コードを演奏することは有益です!再度、感謝します! – aim

    +0

    スパインに対して多かれ少なかれ任意のパスを定義できます。真に任意のパスについては、 'Spine'をサブクラス化する必要がありますが、この場合、サークルに近いので(センタリングまで)、円弧として扱うことができます。 'Axine'のサブクラス化のように、' Spine'のサブクラス化のための詳細なガイドラインはありませんので、あなたは掘り下げて突っ込む必要があります。いずれにせよ、幸い! –

    関連する問題