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)
参数是框样式的名称,其属性作为关键字参数。目前,实现了以下方框样式。
等级 名字 阿特斯 圆圈 circlepad=0.3 DArrow darrowpad=0.3 LArrow larrowpad=0.3 RArrow rarrowpad=0.3 回合 roundpad=0.3,rounding_size=None 第四回合 round4pad=0.3,rounding_size=None 圆齿 roundtoothpad=0.3,tooth_size=None 锯齿形 sawtoothpad=0.3,tooth_size=None 正方形 squarepad=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 键和以下样式可用。
名字 阿特斯 angleangleA=90,angleB=0,rad=0.0 angle3角度a=90,角度b=0 arcangleA=0,angleB=0,armA=None,armB=None,rad=0.0 arc3rad=0.0 bararmA=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 fancyhead_length=0.4,head_width=0.4,tail_width=0.4 simplehead_length=0.5,head_width=0.5,tail_width=0.2 wedgetail_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 并检查如何定义每个样式类。