只是为了记录,如果你还不熟悉Python,那么你肯定会直接跳入深水区。(并且赞扬你的勇气!)你所做的需要相当详细的matplotlib内部工作知识,这是一个相当复杂的库。
话虽如此,这是快速学习的好方法!
对于这样的事情,你需要理解事物结构的内部架构而不仅仅是“公共”API。
对于大多数情况,你必须深入挖掘并使用源代码。对于任何项目,内部工作文档就是代码本身。
话虽如此,对于简单情况来说,它是非常直截了当的。
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](https://istack.dev59.com/WdSN6.webp)
让我们深入了解一下_get_axes_spines
方法:
def _gen_axes_spines(self):
"""Return the spines for the axes."""
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}
现在存在一些问题:
- 轴内的物体未正确居中
- 轴路径应该缩放得更大,以便在轴内占用足够的空间。
- 我们正在为整个地球绘制网格线,然后对其进行剪切。 更有效的方法是仅在我们的“下”楔形图内部绘制它们。
但是,当我们查看
HammerAxes
的结构时,您会注意到很多这些事情(特别是轴补丁的居中)实际上已经硬编码到转换中了。(正如他们在注释中提到的那样,它是一个“玩具”示例,假定您总是处理完整的地球,可以使转换中的数学计算更简单。)
如果您想解决这些问题,您需要调整
HammerAxes._set_lim_and_transforms
中的各种变换。
但是,它的工作效果还算不错,所以我将把它留给读者去练习。 :)(请注意,这部分有点难度,因为它需要详细了解matplotlib的转换。)