Matplotlib is hiring a Research Software Engineering Fellow! See discourse for details. Apply by January 3, 2020

Version 3.1.1
matplotlib
Fork me on GitHub

目录

Related Topics

Axisartist工具包概述

AxisArtist工具包教程。

警告

斧头艺术家 使用自定义轴类(从MPL的原始轴类派生)。作为副作用,一些命令(主要与勾号相关)不起作用。

这个 斧头艺术家 包含一个自定义轴类,用于支持曲线网格(例如,天文学中的世界坐标系)。与MPL最初使用axes.xaxis和axes.yaxis绘制刻度线、刻度线等的axis类不同,axisratist使用特殊的艺术家(axisratist)来处理曲线坐标系的刻度线、刻度线等。

Axisartist工具包概述

演示浮动轴

因为它使用特殊的艺术家,所以一些matplotlib命令在axis.xaxis和axes.yaxis上工作可能不起作用。

斧头艺术家

这个 斧头艺术家 模块提供了一个自定义(也是非常实验性的)轴类,其中每个轴(左、右、上和下)都有一个单独的关联艺术家,负责绘制轴线、刻度线、刻度线标签和标签。您还可以创建自己的轴,该轴可以通过轴坐标中的固定位置,或数据坐标中的固定位置(即,当视界更改时,该轴会浮动)。

默认情况下,axis类的xaxis和yaxis是不可见的,另外还有4个艺术家负责绘制“左”、“右”、“下”和“上”中的4个轴脊椎。它们作为ax.轴访问 [“左”] 轴心轴 [“对”] 等等,也就是说,ax.ax is是一个包含艺术家的字典(注意ax.ax is仍然是一个可调用的方法,它在matplotlib中表现为原始的ax is.ax is方法)。

要创建轴,请执行以下操作:

import mpl_toolkits.axisartist as AA
fig = plt.figure(1)
ax = AA.Axes(fig, [0.1, 0.1, 0.8, 0.8])
fig.add_axes(ax)

或者创建子批次:

ax = AA.Subplot(fig, 111)
fig.add_subplot(ax)

例如,可以使用以下命令隐藏右侧和顶部脊椎:

ax.axis["right"].set_visible(False)
ax.axis["top"].set_visible(False)
Axisartist工具包概述

简单轴线3

也可以添加水平轴。例如,您可能有一个Y=0的水平轴(在数据坐标中)。::

ax.axis["y=0"] = ax.new_floating_axis(nth_coord=0, value=0)
Axisartist工具包概述

简单轴对称1

或具有一定偏移量的固定轴:

# make new (right-side) yaxis, but with some offset
ax.axis["right2"] = ax.new_fixed_axis(loc="right",
              offset=(20, 0))

有寄生轴的轴虫

axes-grid1工具包中的大多数命令可以采用axes-class关键字参数,并且这些命令创建给定类的轴。例如,要使用axisratist.axes创建主机子批次,请执行以下操作:

import mpl_toolkits.axisartist as AA
from mpl_toolkits.axes_grid1 import host_subplot

host = host_subplot(111, axes_class=AA.Axes)

下面是一个使用寄生轴的例子。

Axisartist工具包概述

演示寄生虫axes2

曲线网格

AxisArtist模块背后的动机是支持曲线网格和节拍。

Axisartist工具包概述

演示曲线网格

浮动轴

axisratist还支持其外部轴定义为浮动轴的浮动轴。

Axisartist工具包概述

演示浮动轴

axisratist命名空间

这个 斧头艺术家 命名空间包含派生的轴实现。最大的区别是负责绘制轴线、刻度线、刻度线标签和轴标签的艺术家与MPL的轴类分离,这比原始MPL中的艺术家要多得多。这一变化是强烈的动机支持曲线网格。这里有一些东西mpl-tootlkits.axisartist.axis不同于mpl的原始轴。

  • 轴元素(轴线(脊椎)、刻度、刻度标签和轴标签)由一个axisratist实例绘制。与轴不同,左、右、上、下轴由不同的艺术家绘制。每一个都可能有不同的记号位置和不同的记号标签。
  • 网格线由网格线实例绘制。改变的动机是在曲线坐标系中,网格线可能不会穿过轴线(即,没有相关的刻度)。在原始轴类中,网格线与刻度线绑定。
  • 如有必要,可以旋转刻度线(即沿网格线)

总之,所有这些变化都是为了支持

  • 曲线网格。
  • 浮动轴
Axisartist工具包概述

演示浮动轴

mpl_toolkits.axisartist.Axes 类定义了 axis 属性,这是一本关于axisratist实例的字典。默认情况下,字典有4个axisratist实例,负责绘制左、右、下和上轴。

xaxis和yaxis属性仍然可用,但它们设置为不可见。由于单独的艺术家用于绘制轴,因此MPL中的一些轴相关方法可能没有效果。除了axisartist实例,mpl_toolkits.axisartist.axis还将具有 网格线 属性(网格线),它明显绘制网格线。

在轴坐标系和网格线中,刻度线和网格位置的计算都委托给GridHelper类的一个实例。mpl_toolkits.axisratist.axis类使用gridHelperRectlinear作为网格助手。GridHelperRectlinear类是 X轴横轴 MPL的原始轴,它的工作方式是MPL的原始轴的工作方式。例如,使用set_ticks方法等进行的标记位置更改应按预期工作。但是,艺术家属性(例如颜色)的更改一般不会起作用,尽管已经做出了一些努力,以便尊重某些经常更改的属性(颜色等)。

AxisArtist

AxisArtist可以被视为具有以下属性的容器艺术家,这些属性将绘制刻度线、标签等。

  • 线
  • 主要滴答声,主要滴答声标签
  • 次要滴答声、次要滴答声标签
  • 偏移文本
  • 标签

线

从Line2d类派生。负责画脊柱(?)线。

主要节拍,次要节拍

从Line2d类派生。请注意,记号是标记。

主要滴答标签,次要滴答标签

从文本派生。请注意,它不是文本艺术家列表,而是单个艺术家(类似于集合)。

轴标

从文本派生。

默认轴坐标系

默认情况下,为轴艺术家定义以下内容。::

ax.axis["left"], ax.axis["bottom"], ax.axis["right"], ax.axis["top"]

顶部和右侧轴的刻度标签和轴标签设置为不可见。

例如,如果要更改底部X轴的主要刻度标签的颜色属性:

ax.axis["bottom"].major_ticklabels.set_color("b")

同样,要使TickLabels不可见,请执行以下操作:

ax.axis["bottom"].major_ticklabels.set_visible(False)

Axisaritst提供了一个辅助方法来控制滴答、滴答标签和标签的可见性。要使TickLabel不可见,请执行以下操作:

ax.axis["bottom"].toggle(ticklabels=False)

要使所有刻度、刻度标签和(轴)标签都不可见,请执行以下操作:

ax.axis["bottom"].toggle(all=False)

要关闭除勾号之外的所有选项,请执行以下操作:

ax.axis["bottom"].toggle(all=False, ticks=True)

要打开除(轴)标签之外的所有标签,请执行以下操作:

ax.axis["bottom"].toggle(all=True, label=False))

ax.axis's __getitem__ 方法可以采用多个轴名称。例如,要打开“顶部”和“右侧”轴的勾选标签,请执行以下操作:

ax.axis["top","right"].toggle(ticklabels=True))

注意“ax.axis. [“顶”、“右”] '返回一个简单的代理对象,将上面的代码转换为下面的代码。::

for n in ["top","right"]:
  ax.axis[n].toggle(ticklabels=True))

因此,for循环中的任何返回值都将被忽略。你不应该只使用一个简单的方法。

与列表索引类似:“”表示所有项目,即:

ax.axis[:].major_ticks.set_color("r")

更改所有轴的刻度颜色。

HowTo

  1. 更改刻度线位置和标签。

与原始MPL的轴相同。::

ax.set_xticks([1,2,3])
  1. 更改轴属性,如颜色等。

更改相应艺术家的属性。例如,要更改滴答标签的颜色:

ax.axis["left"].major_ticklabels.set_color("r")
  1. 要更改多个轴的属性:

    ax.axis["left","bottom"].major_ticklabels.set_color("r")
    

    或者更改所有轴的属性:

    ax.axis[:].major_ticklabels.set_color("r")
    
  2. 要更改刻度大小(长度),需要使用

    axis.major_ticks.set_ticksize方法。要更改刻度线的方向(默认情况下,刻度线与刻度线标签的方向相反),请使用axis.major_ticks.set_tick_out方法。

    要在刻度和刻度标签之间更改填充,请使用axis.major_ticklabels.set_pad方法。

    要更改TickLabels和轴标签之间的填充,请使用axis.label.set_pad方法。

滴答标签的旋转和对齐

这与最初的MPL也有很大的不同,可能会造成混淆。当您想要旋转滴答标签时,首先考虑使用“设置轴方向”方法。::

ax1.axis["left"].major_ticklabels.set_axis_direction("top")
ax1.axis["right"].label.set_axis_direction("left")
Axisartist工具包概述

简单轴方向01

设置轴方向的参数是 [“左”、“右”、“下”、“上”] .

你必须理解一些基本的方向概念。

  1. 有一个参考方向,定义为坐标增加时轴线的方向。例如,左X轴的参考方向是从下到上的。

    Axisartist工具包概述

    轴方向演示-步骤01

记号、记号标签和轴标签的方向、文本角度和对齐方式是根据参考方向确定的。
  1. ticklabel_direction 是参考方向的右侧(+)或左侧(-)。

    Axisartist工具包概述

    轴方向演示-步骤02

  2. 同样的 label_direction

    Axisartist工具包概述

    轴方向演示-步骤03

  3. 默认情况下,记号是朝记号标签的相反方向绘制的。

  4. 滴答标签和标签的文本旋转参照 ticklabel_directionlabel_direction ,分别。滴答标签和标签的旋转被锚定。

    Axisartist工具包概述

    轴方向演示-步骤04

另一方面,有一个“轴线方向”的概念。这是上述每个“底部”、“左侧”、“顶部”和“右侧”轴属性的默认设置。

是吗? 是吗? 左边 底部 正确的 顶部
轴标 方向 “-” “+” “+” “-”
轴标 旋转 180 0 0 180
轴标 佤族 中心 顶部 中心 底部
轴标 正确的 中心 正确的 中心
标签标签 方向 “-” “+” “+” “-”
标签标签 旋转 90 0 -90 180
标签标签 正确的 中心 正确的 中心
标签标签 佤族 中心 基线 中心 基线

“设置轴方向”(“顶部”)是指调整文本旋转等,以适合“顶部”轴的设置。轴方向的概念可以用曲线轴更清楚。

Axisartist工具包概述

演示轴方向

轴_方向可以在AxisArtist级别或其子ARIST级别(即勾号、勾号标签和轴标签)中进行调整。::

ax1.axis["left"].set_axis_direction("top")

用“左”轴更改所有关联艺术家的轴方向,同时:

ax1.axis["left"].major_ticklabels.set_axis_direction("top")

仅更改主要刻度标签的轴方向。请注意,在轴标记级别中设置_轴_方向会更改滴答标签_方向和标签_方向,而更改滴答、滴答标签和轴标签的轴_方向不会影响它们。

如果要向外标记,并在轴内标记记号,请使用“反转标记方向”方法。::

ax.axis[:].invert_ticklabel_direction()

一个相关的方法是“设置勾号”。它使滴答向外(实际上,它使滴答朝向默认方向的相反方向)。::

ax.axis[:].major_ticks.set_tick_out(True)
Axisartist工具包概述

简单轴方向03

所以,总之,

  • 轴对称法
    • 设置轴方向:“左”、“右”、“下”或“上”
    • 设置“滴答标签”方向:“+”或“-”
    • 设置“axislabel”方向:“+”或“-”
    • invert_ticklabel_direction
  • 节拍方法(主要节拍和次要节拍)
    • 设置勾号:对或错
    • 设置“滴答大小:以点为单位的大小”
  • 滴答标签的方法(主要滴答标签和次要滴答标签)
    • 设置轴方向:“左”、“右”、“下”或“上”
    • 设置旋转:相对于参考方向的角度
    • 设置_ha和设置_va:见下文
  • Axislabels方法(标签)
    • 设置轴方向:“左”、“右”、“下”或“上”
    • 设置旋转:相对于参考方向的角度
    • 设置“ha”和“set”va

调整刻度线标签对齐方式

特别处理滴答标签的对齐。见下文

Axisartist工具包概述

演示TickLabel对齐

调整垫

要在刻度线和刻度线标签之间更改填充:

ax.axis["left"].major_ticklabels.set_pad(10)

或滴答标签和轴标签:

ax.axis["left"].label.set_pad(10)
Axisartist工具包概述

简单轴垫

GridHelper

要实际定义曲线坐标,必须使用自己的网格助手。提供了网格助手类的通用版本,在大多数情况下,该类应该足够。用户可以提供两个函数,定义从曲线坐标到(直线)图像坐标的转换(及其反对)。请注意,虽然为曲线坐标绘制了记号和网格,但轴本身(ax.transdata)的数据转换仍然是直线(image)坐标。::

from mpl_toolkits.axisartist.grid_helper_curvelinear \
     import GridHelperCurveLinear
from mpl_toolkits.axisartist import Subplot

# from curved coordinate to rectlinear coordinate.
def tr(x, y):
    x, y = np.asarray(x), np.asarray(y)
    return x, y-x

# from rectlinear coordinate to curved coordinate.
def inv_tr(x,y):
    x, y = np.asarray(x), np.asarray(y)
    return x, y+x

grid_helper = GridHelperCurveLinear((tr, inv_tr))

ax1 = Subplot(fig, 1, 1, 1, grid_helper=grid_helper)

fig.add_subplot(ax1)

您可以使用matplotlib的转换实例(但必须定义反向转换)。通常,曲线坐标系中的坐标范围可能有有限的范围,也可能有周期。在这些情况下,需要更自定义的网格助手版本。::

import mpl_toolkits.axisartist.angle_helper as angle_helper

# PolarAxes.PolarTransform takes radian. However, we want our coordinate
# system in degree
tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform()

# extreme finder :  find a range of coordinate.
# 20, 20 : number of sampling points along x, y direction
# The first coordinate (longitude, but theta in polar)
#   has a cycle of 360 degree.
# The second coordinate (latitude, but radius in polar)  has a minimum of 0
extreme_finder = angle_helper.ExtremeFinderCycle(20, 20,
                                                 lon_cycle = 360,
                                                 lat_cycle = None,
                                                 lon_minmax = None,
                                                 lat_minmax = (0, np.inf),
                                                 )

# Find a grid values appropriate for the coordinate (degree,
# minute, second). The argument is a approximate number of grids.
grid_locator1 = angle_helper.LocatorDMS(12)

# And also uses an appropriate formatter.  Note that,the
# acceptable Locator and Formatter class is a bit different than
# that of mpl's, and you cannot directly use mpl's Locator and
# Formatter here (but may be possible in the future).
tick_formatter1 = angle_helper.FormatterDMS()

grid_helper = GridHelperCurveLinear(tr,
                                    extreme_finder=extreme_finder,
                                    grid_locator1=grid_locator1,
                                    tick_formatter1=tick_formatter1
                                    )

再一次, 转载数据 轴的坐标仍然是直线坐标(图像坐标)。您可以手动在两个坐标之间进行转换,或者为了方便起见,可以使用寄生轴。::

ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper)

# A parasite axes with given transform
ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal")
# note that ax2.transData == tr + ax1.transData
# Anthing you draw in ax2 will match the ticks and grids of ax1.
ax1.parasites.append(ax2)
Axisartist工具包概述

演示曲线网格

FloatingAxis

浮动轴是数据坐标固定的轴,即其位置不固定在轴坐标中,而是随着轴数据限制的变化而变化。可以使用创建浮动轴 new_floating_axis 方法。但是,您的责任是将产生的轴心国正确添加到轴心国。建议将其添加为轴的轴属性项。::

# floating axis whose first (index starts from 0) coordinate
# (theta) is fixed at 60

ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60)
axis.label.set_text(r"$\theta = 60^{\circ}$")
axis.label.set_visible(True)

请参阅本页的第一个示例。

当前限制和TODO

代码需要更精细化。这是一个不完整的问题和托多的列表

  • 不容易支持用户自定义的勾号位置(用于曲线网格)。需要创建新的定位器类。
  • floating axis可以有坐标限制,例如x=0的浮动轴,但y的跨度仅为0到1。
  • 浮动轴的轴架位置需要有选择地作为坐标值给出。例如,浮动轴x=0,标签y=1