创建缩放和转换的开发人员指南

Matplotlib支持添加自定义过程,以便在显示数据之前对其进行转换。

两种转换之间有一个重要的区别。在单一维度上工作的可分离转换称为“尺度”,而一次处理两个或多个维度数据的不可分离转换称为“投影”。

从用户的角度来看,可以使用 Axes.set_xscaleAxes.set_yscale . 可以使用 投影 创建轴的函数的关键字参数,例如 pyplot.subplotpyplot.axes ,例如:

plt.subplot(projection="custom")

本文档面向需要为Matplotlib创建新比例和投影的开发人员和高级用户。缩放和投影所需的代码可以包含在任何地方:直接在绘图脚本中、在第三方代码中或在Matplotlib源代码树中。

创建新比例

添加新的比例包括定义 matplotlib.scale.ScaleBase ,包括以下元素:

  • 从数据坐标到显示坐标的转换。
  • 这个变换的倒数。例如,它用于将鼠标位置从屏幕空间转换回数据空间。
  • 将轴的范围限制为可接受值的函数。 (limit_range_for_scale() )例如,对数刻度将阻止范围包括小于或等于零的值。
  • 定位器(主要和次要),用于确定在绘图中放置刻度的位置,以及(可选)如何将绘图的限制调整为某些“良好”值。不像 limit_range_for_scale() ,这始终是强制的,这里的范围设置仅在自动设置绘图范围时使用。
  • 指定刻度线标签绘制方式的格式设置工具(主要和次要)。

一旦定义了类,它就必须注册到Matplotlib,以便用户选择它。

一个完整的、有大量注释的例子出现在 自定义比例尺 . 还有一些课程在 matplotlib.scale 可以作为起点。

创建新投影

添加一个新的投影包括定义一个投影轴,该投影轴子类 matplotlib.axes.Axes 包括以下要素:

  • 从数据坐标到显示坐标的转换。
  • 这个变换的倒数。例如,它用于将鼠标位置从屏幕空间转换回数据空间。
  • 网格线、记号和记号标签的转换。自定义投影通常需要将这些元素放置在特殊位置,Matplotlib有一个工具可以帮助您这样做。
  • 设置默认值(覆盖 cla() ,因为直线轴的默认值可能不合适。
  • 定义轴的形状,例如椭圆轴,用于绘制绘图背景和剪切任何数据元素。
  • 为投影定义自定义定位器和格式化程序。例如,在地理投影中,以度数显示网格可能更方便,即使数据以弧度显示。
  • 设置交互式平移和缩放。这是留给读者的一个“高级”功能,但在 matplotlib.projections.polar .
  • 为了附加的便利或功能而使用的任何附加方法。

定义投影轴后,可以通过以下两种方式之一使用投影轴:

  • 通过定义类属性 name ,投影轴可以注册 matplotlib.projections.register_projection() 然后简单地用名称调用:

    plt.axes(projection='my_proj_name')
    
  • 对于更复杂、可参数化的投影,可以定义一个通用的“投影”对象,其中包括该方法 _as_mpl_axes . _as_mpl_axes 不应接受任何参数,并返回投影的axes子类和要传递给子类的其他参数的字典 __init__ 方法。随后,参数化投影可初始化为:

    plt.axes(projection=MyProjection(param1=param1_value))
    

    其中myProjection是实现 _as_mpl_axes 方法。

一个完整的、有大量注释的例子出现在 自定义投影 . 中的极坐标图功能 matplotlib.projections.polar 可能也很有趣。