は、あなたは間違いなくストレートプールの奥に飛び込みました。
あなたがやっていることは、かなり複雑なライブラリである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()
のは_get_axes_spines
メソッドにビットを掘るましょう
物事は内の中心に位置していない
軸は正しく
- Axes内の部屋を適切に占有するために、軸パッチを少し大きくスケーリングすることができます。
- 地球全体のグリッド線を描いて、クリッピングしています。それを私たちの "低い"くさびの内側に描くだけで効率的です。我々は
HammerAxes
が構成されている方法を見てみたときに
はしかし、あなたは多くのこれらのもの(軸パッチの特にセンタリング)が効果的に変換にハードコードされていることがわかります。 (コメントの中で言及しているように、それは「おもちゃ」の例であり、あなたが常に地球全体を扱っていると仮定すると、変換の数学はずっと簡単になります。)
これらを修正したい場合は、さまざまな変換のいくつかをHammerAxes._set_lim_and_transforms
に調整する必要があります。
しかし、それは合理的にそのまま動作するので、私はそれを読者の練習として残しておきます。私はまだPythonの初心者ですから、どのメソッドの説明も本当にそうです。(注意してください、matplotlibの変換の詳細な知識が必要なので、その部分は少し難しいです。)
有用!ありがとう! – aim