Matplotlib is hiring a Research Software Engineering Fellow! See discourse for details. Apply by January 3, 2020
AxisArtist工具包教程。
警告
斧头艺术家 使用自定义轴类(从MPL的原始轴类派生)。作为副作用,一些命令(主要与勾号相关)不起作用。
这个 斧头艺术家 包含一个自定义轴类,用于支持曲线网格(例如,天文学中的世界坐标系)。与MPL最初使用axes.xaxis和axes.yaxis绘制刻度线、刻度线等的axis类不同,axisratist使用特殊的艺术家(axisratist)来处理曲线坐标系的刻度线、刻度线等。
因为它使用特殊的艺术家,所以一些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)
也可以添加水平轴。例如,您可能有一个Y=0的水平轴(在数据坐标中)。::
ax.axis["y=0"] = ax.new_floating_axis(nth_coord=0, value=0)
或具有一定偏移量的固定轴:
# 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)
下面是一个使用寄生轴的例子。
这个 斧头艺术家 命名空间包含派生的轴实现。最大的区别是负责绘制轴线、刻度线、刻度线标签和轴标签的艺术家与MPL的轴类分离,这比原始MPL中的艺术家要多得多。这一变化是强烈的动机支持曲线网格。这里有一些东西mpl-tootlkits.axisartist.axis不同于mpl的原始轴。
总之,所有这些变化都是为了支持
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可以被视为具有以下属性的容器艺术家,这些属性将绘制刻度线、标签等。
- 线
- 主要滴答声,主要滴答声标签
- 次要滴答声、次要滴答声标签
- 偏移文本
- 标签
从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")
更改所有轴的刻度颜色。
与原始MPL的轴相同。::
ax.set_xticks([1,2,3])
更改相应艺术家的属性。例如,要更改滴答标签的颜色:
ax.axis["left"].major_ticklabels.set_color("r")
要更改多个轴的属性:
ax.axis["left","bottom"].major_ticklabels.set_color("r")
或者更改所有轴的属性:
ax.axis[:].major_ticklabels.set_color("r")
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")
设置轴方向的参数是 [“左”、“右”、“下”、“上”] .
你必须理解一些基本的方向概念。
另一方面,有一个“轴线方向”的概念。这是上述每个“底部”、“左侧”、“顶部”和“右侧”轴属性的默认设置。
是吗? 是吗? 左边 底部 正确的 顶部 轴标 方向 “-” “+” “+” “-” 轴标 旋转 180 0 0 180 轴标 佤族 中心 顶部 中心 底部 轴标 哈 正确的 中心 正确的 中心 标签标签 方向 “-” “+” “+” “-” 标签标签 旋转 90 0 -90 180 标签标签 哈 正确的 中心 正确的 中心 标签标签 佤族 中心 基线 中心 基线
“设置轴方向”(“顶部”)是指调整文本旋转等,以适合“顶部”轴的设置。轴方向的概念可以用曲线轴更清楚。
轴_方向可以在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)
所以,总之,
- 轴对称法
- 设置轴方向:“左”、“右”、“下”或“上”
- 设置“滴答标签”方向:“+”或“-”
- 设置“axislabel”方向:“+”或“-”
- invert_ticklabel_direction
- 节拍方法(主要节拍和次要节拍)
- 设置勾号:对或错
- 设置“滴答大小:以点为单位的大小”
- 滴答标签的方法(主要滴答标签和次要滴答标签)
- 设置轴方向:“左”、“右”、“下”或“上”
- 设置旋转:相对于参考方向的角度
- 设置_ha和设置_va:见下文
- Axislabels方法(标签)
- 设置轴方向:“左”、“右”、“下”或“上”
- 设置旋转:相对于参考方向的角度
- 设置“ha”和“set”va
要在刻度线和刻度线标签之间更改填充:
ax.axis["left"].major_ticklabels.set_pad(10)
或滴答标签和轴标签:
ax.axis["left"].label.set_pad(10)
要实际定义曲线坐标,必须使用自己的网格助手。提供了网格助手类的通用版本,在大多数情况下,该类应该足够。用户可以提供两个函数,定义从曲线坐标到(直线)图像坐标的转换(及其反对)。请注意,虽然为曲线坐标绘制了记号和网格,但轴本身(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)
浮动轴是数据坐标固定的轴,即其位置不固定在轴坐标中,而是随着轴数据限制的变化而变化。可以使用创建浮动轴 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)
请参阅本页的第一个示例。
代码需要更精细化。这是一个不完整的问题和托多的列表