Matplotlib is hiring a Research Software Engineering Fellow! See discourse for details. Apply by January 3, 2020
用matplotlib注释文本。
基本的用途 text()
将文本放置在轴上的任意位置。文本的一个常见用例是注释绘图的某些特性,以及 annotate()
方法提供了帮助器功能,使注释变得容易。在注释中,需要考虑两点:由参数表示的注释位置 xy
以及文本的位置 xytext
. 这两个论点都是 (x,y)
元组。
在这个例子中,两个 xy
(箭头)和 xytext
位置(文本位置)在数据坐标中。可以选择其他各种坐标系--您可以指定 xy
和 xytext
使用以下字符串之一 xycoords
和 textcoords
(默认值为'data')
参数 | 坐标系 |
---|---|
“图形点” | 数字左下角的点 |
“图形像素” | 图片左下角的像素 |
'数字分数' | 0,0在图的左下角,1,1在图的右上角 |
“轴点” | 轴左下角的点 |
“轴像素” | 来自轴左下角的像素 |
“轴分数” | 0,0表示轴的左下角,1,1表示轴的右上角 |
“数据” | 使用轴数据坐标系 |
例如,要将文本坐标放置在分数轴坐标中,可以执行以下操作:
ax.annotate('local max', xy=(3, 1), xycoords='data',
xytext=(0.8, 0.95), textcoords='axes fraction',
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='right', verticalalignment='top',
)
对于物理坐标系(点或像素),原点是图形或轴的左下角。
或者,通过在可选关键字参数中提供箭头属性字典,可以启用从文本到带注释点的箭头绘制。 arrowprops
.
arrowprops 钥匙 |
描述 |
---|---|
宽度 | 箭头的宽度(以点为单位) |
压裂 | 头部所占箭头长度的分数 |
头宽 | 箭头底端的宽度(以点为单位) |
收缩 | 移动提示,使其与带批注的点和文本相距百分之几 |
* * 关键字参数 | 任意键 matplotlib.patches.Polygon ,例如, facecolor |
在下面的示例中, xy
点在本机坐标中 (xycoords
默认为“data”)。对于极轴,这是在(θ,半径)空间。本例中的文本放置在分数图形坐标系中。 matplotlib.text.Text
关键字参数类似 horizontalalignment
, verticalalignment
和 fontsize
被从 annotate
到 Text
实例。
有关可以使用注释(包括花式箭头)进行的所有疯狂和美妙的操作的更多信息,请参见 高级批注 和 注释绘图 .
除非已经阅读,否则不要继续。 基本注释 , text()
和 annotate()
你说什么?
让我们从一个简单的例子开始。
这个 text()
pyplot模块(或axes类的text方法)中的函数接受bbox关键字参数,当给定参数时,将在文本周围绘制一个框。::
bbox_props = dict(boxstyle="rarrow,pad=0.3", fc="cyan", ec="b", lw=2)
t = ax.text(0, 0, "Direction", ha="center", va="center", rotation=45,
size=15,
bbox=bbox_props)
可以通过以下方式访问与文本关联的修补程序对象:
bb = t.get_bbox_patch()
返回值是fancybboxpatch的一个实例,可以像往常一样访问和修改诸如facecolor、edgewidth等修补程序属性。要更改框的形状,请使用 set_boxstyle 方法。::
bb.set_boxstyle("rarrow", pad=0.6)
参数是框样式的名称,其属性作为关键字参数。目前,实现了以下方框样式。
等级 名字 阿特斯 圆圈 circle
pad=0.3 DArrow darrow
pad=0.3 LArrow larrow
pad=0.3 RArrow rarrow
pad=0.3 回合 round
pad=0.3,rounding_size=None 第四回合 round4
pad=0.3,rounding_size=None 圆齿 roundtooth
pad=0.3,tooth_size=None 锯齿形 sawtooth
pad=0.3,tooth_size=None 正方形 square
pad=0.3
请注意,属性参数可以在样式名中用分隔逗号指定(此表单在初始化文本实例时可用作bbox参数的“boxStyle”值)::
bb.set_boxstyle("rarrow,pad=0.6")
这个 annotate()
pyplot模块中的函数(或axles类的annotate方法)用于绘制连接绘图上两点的箭头。::
ax.annotate("Annotation",
xy=(x1, y1), xycoords='data',
xytext=(x2, y2), textcoords='offset points',
)
这将在 xy
在给定的坐标中 (xycoords
)文本位于 xytext
在给定 textcoords
. 通常,注释点在 data 坐标和注释文本 偏移点 . 见 annotate()
对于可用的坐标系。
通过指定 arrowprops
争论。要只绘制箭头,请使用空字符串作为第一个参数。::
ax.annotate("",
xy=(0.2, 0.2), xycoords='data',
xytext=(0.8, 0.8), textcoords='data',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3"),
)
箭头绘制需要几个步骤。
connectionstyle
键值。arrowstyle
键值。两点之间连接路径的创建由 connectionstyle
键和以下样式可用。
名字 阿特斯 angle
angleA=90,angleB=0,rad=0.0 angle3
角度a=90,角度b=0 arc
angleA=0,angleB=0,armA=None,armB=None,rad=0.0 arc3
rad=0.0 bar
armA=0.0,armB=0.0,fraction=0.3,angle=None
注意“3”在 angle3
和 arc3
表示生成的路径是二次样条曲线段(三个控制点)。正如下面将讨论的,一些箭头样式选项只能在连接路径是二次样条曲线时使用。
每个连接样式的行为(有限)在下面的示例中演示。(警告:的行为 bar
样式目前定义不好,将来可能会更改)。
然后,根据给定的 arrowstyle
.
名字 阿特斯 -
没有 ->
head_length=0.4,head_width=0.2 -[
widthB=1.0,lengthB=0.2,angleB=None |-|
widthA=1.0,widthB=1.0 -|>
head_length=0.4,head_width=0.2 <-
head_length=0.4,head_width=0.2 <->
head_length=0.4,head_width=0.2 <|-
head_length=0.4,head_width=0.2 <|-|>
head_length=0.4,head_width=0.2 fancy
head_length=0.4,head_width=0.4,tail_width=0.4 simple
head_length=0.5,head_width=0.5,tail_width=0.2 wedge
tail_width=0.3,shrink_factor=0.5
某些箭头样式仅适用于生成二次样条曲线段的连接样式。他们是 fancy
, simple
和 wedge
. 对于这些箭头样式,必须使用“angle3”或“arc3”连接样式。
如果给定注释字符串,则默认情况下,补丁程序设置为文本的bbox补丁程序。
与在“文本”命令中一样,可以使用 bbox
争论。
默认情况下,起点设置为文本范围的中心。这可以用 relpos
键值。这些值按照文本的范围进行规格化。例如,(0,0)表示左下角,(1,1)表示右上角。
可以将艺术家类放置在轴中的固定位置。一个常见的例子是传说。可以使用OffsetBox类创建此类型的艺术家。一些预定义类在 mpl_toolkits.axes_grid1.anchored_artists
其他人 matplotlib.offsetbox
::
from matplotlib.offsetbox import AnchoredText
at = AnchoredText("Figure 1a",
prop=dict(size=15), frameon=True,
loc='upper left',
)
at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
ax.add_artist(at)
这个 loc 关键字的含义与legend命令中的含义相同。
一个简单的应用程序是当艺术家(或艺术家集合)的大小在创建期间以像素大小已知时。例如,如果要绘制固定大小为20像素x 20像素(半径=10像素)的圆,可以使用 AnchoredDrawingArea
. 创建实例时使用绘图区域的大小(以像素为单位),可以将任意艺术家添加到绘图区域。请注意,添加到绘图区域的艺术家的范围与绘图区域本身的放置无关。只有初始尺寸才重要。::
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea
ada = AnchoredDrawingArea(20, 20, 0, 0,
loc='upper right', pad=0., frameon=False)
p1 = Circle((10, 10), 10)
ada.drawing_area.add_artist(p1)
p2 = Circle((30, 10), 5, fc="r")
ada.drawing_area.add_artist(p2)
添加到绘图区域的艺术家不应具有变换集(将被覆盖),这些艺术家的尺寸将解释为像素坐标,即上面示例中的圆的半径分别为10像素和5像素。
有时,您希望艺术家使用数据坐标(或画布像素以外的坐标)进行缩放。你可以使用 AnchoredAuxTransformBox
班级。这和 AnchoredDrawingArea
但艺术家的范围是在绘制期间根据指定的变换确定的。::
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredAuxTransformBox
box = AnchoredAuxTransformBox(ax.transData, loc='upper left')
el = Ellipse((0,0), width=0.1, height=0.4, angle=30) # in data coordinates!
box.drawing_area.add_artist(el)
上面例子中的椭圆的宽度和高度将与数据协调中的0.1和0.4相对应,并且当轴的视图限制发生变化时,将自动缩放。
如图中所示,可以设置bbox_to_anchor参数。使用hpacker和vpacker,可以进行排列(?)就像传说中的艺术家一样(事实上,这就是传说的创造方式)。
注意,与传说不同的是, bbox_transform
默认设置为IdentityTransform。
Matplotlib中的注释支持多种类型的坐标,如中所述。 基本注释 . 对于需要更多控制的高级用户,它支持一些其他选项。
Transform
实例。例如:ax.annotate("Test", xy=(0.5, 0.5), xycoords=ax.transAxes)与以下内容相同:
ax.annotate("Test", xy=(0.5, 0.5), xycoords="axes fraction")通过此操作,可以在其他轴中注释点。::
ax1, ax2 = subplot(121), subplot(122) ax2.annotate("Test", xy=(0.5, 0.5), xycoords=ax1.transData, xytext=(0.5, 0.5), textcoords=ax2.transData, arrowprops=dict(arrowstyle="->"))
Artist
实例。xy值(或xytext)被解释为bbox的分数坐标(返回值为 get_window_extent )艺术家的作品。::an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data", va="center", ha="center", bbox=dict(boxstyle="round", fc="w")) an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, # (1,0.5) of the an1's bbox xytext=(30,0), textcoords="offset points", va="center", ha="left", bbox=dict(boxstyle="round", fc="w"), arrowprops=dict(arrowstyle="->"))请注意,协调艺术家的范围是您的责任。( an1 在上面的例子中)是在 an2 绘制。在大多数情况下,这意味着 an2 需要晚于 an1 .
一个可调用对象,它返回
BboxBase
或Transform
. 如果返回转换,它与1相同;如果返回bbox,它与2相同。可调用对象应采用渲染器实例的单个参数。例如,以下两个命令给出了相同的结果:an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, xytext=(30,0), textcoords="offset points") an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1.get_window_extent, xytext=(30,0), textcoords="offset points")两个坐标规格的元组。第一项是X坐标,第二项是Y坐标。例如:
annotate("Test", xy=(0.5, 1), xycoords=("data", "axes fraction"))0.5为数据坐标,1为归一化轴坐标。可以像使用元组一样使用艺术家或变换。例如,
有时,您希望注释带有一些“偏移点”,而不是从注释点,而是从其他点。
OffsetFrom
是此类情况的帮助程序类。你可以看看这个例子 注释绘图 .
ConnectionPatch就像一个没有文本的注释。虽然在大多数情况下建议使用annotate函数,但如果要连接不同轴上的点,则connectionPatch非常有用。::
from matplotlib.patches import ConnectionPatch
xy = (0.2, 0.2)
con = ConnectionPatch(xyA=xy, xyB=xy, coordsA="data", coordsB="data",
axesA=ax1, axesB=ax2)
ax2.add_artist(con)
上述代码连接数据坐标中的点xy。 ax1
指向数据坐标中的xy ax2
. 下面是一个简单的例子。
虽然ConnectionPatch实例可以添加到任何轴,但您可能希望将其添加到绘图中最新的轴,以防止与其他轴重叠。
mpl_toolkits.axes_grid1.inset_locator
定义一些对互连两个轴有用的补丁类。理解代码需要一些关于MPL转换如何工作的知识。但是,利用它将是直接的。
可以使用自定义框样式。的值 boxstyle
可以是以下形式的可调用对象。::
def __call__(self, x0, y0, width, height, mutation_size,
aspect_ratio=1.):
'''
Given the location and size of the box, return the path of
the box around it.
- *x0*, *y0*, *width*, *height* : location and size of the box
- *mutation_size* : a reference scale for the mutation.
- *aspect_ratio* : aspect-ratio for the mutation.
'''
path = ...
return path
这是一个完整的例子。
但是,建议您从matplotlib.patches.boxStyle.
同样,可以定义自定义连接样式和自定义箭头样式。参见的源代码 lib/matplotlib/patches.py
并检查如何定义每个样式类。