Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 自定义Matplotlib投影:施密特投影_Python 3.x_Matplotlib_Projection - Fatal编程技术网

Python 3.x 自定义Matplotlib投影:施密特投影

Python 3.x 自定义Matplotlib投影:施密特投影,python-3.x,matplotlib,projection,Python 3.x,Matplotlib,Projection,我正在尝试修改此自定义投影示例: 显示施密特图。投影背后的数学解释如下: 我对示例做了一些修改,使我更接近解决方案,但我仍然做了一些错误的事情。在函数transform\u non\u affine中更改的任何内容都会使绘图看起来更糟。如果有人能向我解释如何修改这个函数,那就太好了 我还看了下面的例子 但无法真正理解如何将其转化为示例 def变换非仿射(self,ll): """ 重写transform_non_affine方法以实现自定义 使改变 输入和输出为Nx2 nump

我正在尝试修改此自定义投影示例:

显示施密特图。投影背后的数学解释如下:

我对示例做了一些修改,使我更接近解决方案,但我仍然做了一些错误的事情。在函数transform\u non\u affine中更改的任何内容都会使绘图看起来更糟。如果有人能向我解释如何修改这个函数,那就太好了

我还看了下面的例子

但无法真正理解如何将其转化为示例

def变换非仿射(self,ll):
"""
重写transform_non_affine方法以实现自定义
使改变
输入和输出为Nx2 numpy阵列。
"""
经度=ll[:,0:1]
纬度=ll[:,1:2]
#预先计算一些值
半长=经度/2.0
cos_纬度=np.cos(纬度)
sqrt2=np.sqrt(2.0)
alpha=1.0+cos_纬度*np.cos(半长)
x=(2.0*sqrt2)*(正中纬度*np.sin(半长))/alpha
y=(sqrt2*np.sin(纬度))/alpha
返回np.concatenate((x,y),1)
整个代码可以运行并显示结果:

导入matplotlib
从matplotlib.axes导入轴
从matplotlib.patches导入圆
从matplotlib.path导入路径
从matplotlib.ticker导入NullLocator、格式化程序、FixedLocator
从matplotlib.transforms导入仿射2D、BboxTransformTo、Transform
从matplotlib.projections导入寄存器_projection,LambertAxes
将matplotlib.spines作为mspines导入
将matplotlib.axis导入为maxis
将matplotlib.pyplot作为plt导入
将numpy作为np导入
类施密特投影(轴):
“类定义了新的投影”
名称='施密特投影'
定义初始化(self,*args,**kwargs):
''调用self,设置纵横比并调用默认值''
轴。u u初始化(self,*args,**kwargs)
self.set_aspect(1.0,可调class='box',锚点class='C')
self.cla()
定义初始轴(自):
“初始化轴”
self.xaxis=maxis.xaxis(self)
self.yaxis=maxis.yaxis(self)
#不要将xaxis或yaxis注册为脊椎,如中所述
#Axes._init_axis()--直到HammerAxes.xaxis.cla()工作。
#self.spines['hammer'].寄存器_轴(self.yaxis)
self.\u update\u transScale()
def cla(自我):
''调用Axes.cla并重写某些函数以设置新的默认值''
轴类(自身)
自设置经度网格(10)
自设置纬度网格(10)
自设置经度网格端点(80)
self.xaxis.set_minor_定位器(NullLocator())
self.yaxis.set\u minor\u定位器(NullLocator())
self.xaxis.set_ticks_position('none'))
self.yaxis.set\u ticks\u position('none')
#这个投影的限制是固定的——它们不是固定的
#可由用户更改。这使得数学变得复杂
#转换本身更容易,因为这是一个玩具
#举个例子,越简单越好。
轴设置_xlim(自,-np.pi,np.pi)
轴设置(自,-np.pi,np.pi)
定义集和变换(自):
''当创建绘图以设置所有
数据、文本和网格的转换。“”
#这里有三个重要的坐标空间:
#    1. 数据空间:数据本身的空间
#    2. 轴空间:单位矩形(0,0)到(1,1)
#覆盖整个地块。
#    3. 显示空间:生成图像的坐标,
#通常以像素或dpi/英寸为单位。
#此函数大量使用中的转换类
#``lib/matplotlib/transforms.py.``有关详细信息,请参阅
#这里有内联文档。
#前两个转换的目标是从
#数据空间(在本例中为经度和纬度)到轴
#空间。它分为非仿射部分和仿射部分,因此
#非仿射部分在以下情况下不必重新计算:
#对图形进行了简单的仿射更改(例如
#调整窗口大小或更改dpi)。
#1)从数据空间到
#SchmidtTransform类中定义的直线空间。
self.transProjection=self.SchmidtTransform()
#绘图应延伸180°=π/2 NS和EW
xscale=np.pi/2
yscale=np.pi/2
#圆的半径(0.5)除以刻度。
self.transafine=Affine2D()\
.刻度(0.5/x刻度,0.5/y刻度)\
.翻译(0.5,0.5)
#3)这是从轴空间到显示的转换
#空间。
self.transAxes=BboxTransformTo(self.bbox)
#现在,将这3种转换放在一起--从数据一直到
#显示坐标。使用“+”运算符,这些
#变换将“按顺序”应用。这些变换是
#如有可能,由基础
#转换框架。
self.transData=\
自转投影+\
自身转烷烃+\
自交换
#设置了主数据转换。现在处理
#网格线和记号标签。
#经度网格线和标签。这些数据的输入
#变换在x的显示空间和y的轴空间中。
#因此,输入值将在范围(-xmin,0)内,
#(xmax,1)。这些转换的目标就是从这个角度出发
#空间到显示空间。勾号标签将偏移4
#来自赤道的像素。
自我._xaxis_预转换=\
仿射e2d()\
.刻度(1.0,np.pi)\
class SchmidtTransform(Transform):
input_dims = 2
output_dims = 2
is_separable = False

def __init__(self):
    Transform.__init__(self)
    self._resolution = 100
    self._center_longitude = 0
    self._center_latitude = 0

def transform_non_affine(self, ll):
    longitude = ll[:, 0:1]
    latitude  = ll[:, 1:2]

    clong = self._center_longitude
    clat = self._center_latitude

    cos_lat = np.cos(latitude)
    sin_lat = np.sin(latitude)

    diff_long = longitude - clong
    cos_diff_long = np.cos(diff_long)
    inner_k = (1.0 + np.sin(clat)*sin_lat + np.cos(clat)*cos_lat*cos_diff_long)

    # Prevent divide-by-zero problems
    inner_k = np.where(inner_k == 0.0, 1e-15, inner_k)

    k = np.sqrt(2.0 / inner_k)

    x = k*cos_lat*np.sin(diff_long)
    y = k*(np.cos(clat)*sin_lat - np.sin(clat)*cos_lat*cos_diff_long)

    return np.concatenate((x, y), 1)
y = R * k' * sin(phi)
x = R * k' * cos(phi) sin(lambda - lambda0)
k = sqrt( 2 / (1 + cos(phi) cos(lambda - lambda0))
    def transform_non_affine(self, ll):
        xi = ll[:, 0:1]
        yi  = ll[:, 1:2]

        k = 1 + np.absolute(cos(yi) * cos(xi))
        k = 2 / k

        if np.isposinf(k[0]) == True:
            k[0] = 1e+15

        if np.isneginf(k[0]) == True:
            k[0] = -1e+15

        if k[0] == 0:
            k[0] = 1e-15

        k = sqrt(k)

        x = k * cos(yi) * sin(xi)
        y = k * sin(yi)

        return np.concatenate((x, y), 1)