annotate标注解释

标注

 

基本标注

使用text()会将文本放置在轴域的任意位置。 文本的一个常见用例是标注绘图的某些特征,而annotate()方法提供辅助函数,使标注变得容易。 在标注中,有两个要考虑的点:由参数xy表示的标注位置和xytext的文本位置。 这两个参数都是(x, y)元组。

 

# coding=utf-8


import numpy as np
import matplotlib.pyplot as plt



fig = plt.figure()

ax = fig.add_subplot(111)

x = np.arange(0.0, 5.0, 0.01)
y = np.cos(2*np.pi*x)
ax.plot(x, y, lw = 2)

'''
    xy=(横坐标,纵坐标)  箭头尖端
    xytext=(横坐标,纵坐标) 文字的坐标,指的是最左边的坐标
    arrowprops= {
        facecolor= '颜色',
        shrink = '数字' <1  收缩箭头
    }

'''

ax.annotate('local max', xy=(2,1), xytext=(3,1.5),
            arrowprops=dict(facecolor='black', shrink=0.05)) #

ax.set_ylim(-2, 2) #设置y轴刻度的范围

plt.show()

 

# coding=utf-8


import numpy as np
import matplotlib.pyplot as plt



fig = plt.figure()

ax = fig.add_subplot(111)

x = np.arange(0.0, 5.0, 0.01)
y = np.cos(2*np.pi*x)
ax.plot(x, y, lw = 2)

'''
    xy=(横坐标,纵坐标)  箭头尖端
    xytext=(横坐标,纵坐标) 文字的坐标,指的是最左边的坐标
    arrowprops= {
        facecolor= '颜色',
        shrink = '数字' <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',fontsize=10
            #horizontalalignment,verticalalignment和fontsize,从annotate传给Text(local max)
            )
ax.set_ylim(-2, 2) #设置y轴刻度的范围

plt.show()

 

 

在该示例中,xy(箭头尖端)和xytext位置(文本位置)都以数据坐标为单位。 有多种可以选择的其他坐标系 - 你可以使用xycoordstextcoords以及下列字符串之一(默认为data)指定xyxytext的坐标系。

| 参数 | 坐标系 | 
'figure points' | 距离图形左下角的点数量 | 
'figure pixels' | 距离图形左下角的像素数量 | 
'figure fraction' | 0,0 是图形左下角,1,1 是右上角 | 
'axes points' | 距离轴域左下角的点数量 | 
'axes pixels' | 距离轴域左下角的像素数量 | 
'axes fraction' | 0,0 是轴域左下角,1,1 是右上角 | 
'data' | 使用轴域数据坐标系 |

 

你可以通过在可选关键字参数arrowprops中提供箭头属性字典来绘制从文本到注释点的箭头。

arrowprops描述
width箭头宽度,以点为单位
frac箭头头部所占据的比例
headwidth箭头的底部的宽度,以点为单位
shrink移动提示,并使其离注释点和文本一些距离
**kwargsmatplotlib.patches.Polygon的任何键,例如facecolor

在下面的示例中,xy点是原始坐标(xycoords默认为'data')。 对于极坐标轴,它在(theta, radius)空间中。 此示例中的文本放置在图形小数坐标系中。 matplotlib.text.Text关键字args,例如horizontalalignmentverticalalignmentfontsize,从annotate传给Text实例。

# coding=utf-8


import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
r = np.arange(0,1,0.001)
theta = 2*2*np.pi*r
line, = ax.plot(theta, r, color='#ee8d18', lw=3)

ind = 800
thisr, thistheta = r[ind], theta[ind]
ax.plot([thistheta], [thisr], 'o')
ax.annotate('a polar annotation',
            xy=(thistheta, thisr),  # theta, radius
            xytext=(0.05, 0.05),    # fraction, fraction
            textcoords='figure fraction',
            #| 'figure fraction' | 0,0 是图形左下角,1,1 是右上角 |
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='left',
            verticalalignment='bottom',
            )
plt.show()

 

 

 

高级标注

使用框和文本来标注

让我们以一个简单的例子来开始。

 

# coding=utf-8

import numpy.random
import matplotlib.pyplot as plt

fig = plt.figure(1, figsize=(5,5))
fig.clf()

ax = fig.add_subplot(111)
ax.set_aspect(1)

x1 = -1 + numpy.random.randn(100)
y1 = -1 + numpy.random.randn(100)
x2 = 1. + numpy.random.randn(100)
y2 = 1. + numpy.random.randn(100)

ax.scatter(x1, y1, color="r")
ax.scatter(x2, y2, color="g")

bbox_props = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)


'''
    以文本坐标(-2,-2)
    ha="center"  在水平方向上,方框的中心在为(-2,0)
    va="center"  在垂直方向上,方框的中心在为(0,-2)
    size = '20' 代表方框的大小
    bbox={}  代表对方框的设置
        { 
            boxstyle= '' 代表边框的类型
                    round 圆形方框
                    rarrow箭头
            fc  背景颜色   英文首字母 w -whiite r-red
            ec 边框线的透明度  数字或颜色的首字母
            alpha 字体的透明度
            lw 线的粗细
            rotation  角度
        }
'''

ax.text(-2, -2, "Sample A", ha="center", va="center", size=20,
        bbox=bbox_props)

ax.text(2, 2, "Sample B", ha="center", va="center", size=20,
        bbox=bbox_props)


bbox_props = dict(boxstyle="rarrow", fc=(0.8,0.9,0.9), 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()
bb.set_boxstyle("rarrow", pad=0.6)

ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)

plt.draw()
plt.show()

 

 

pyplot模块(或Axes类的text方法)中的text()函数接受bbox关键字参数,并且在提供时,在文本周围绘制一个框。

与文本相关联的补丁对象可以通过以下方式访问:

bb = t.get_bbox_patch()
  • 1

返回值是FancyBboxPatch的一个实例,并且补丁属性(如facecoloredgewidth等)可以像平常一样访问和修改。 为了更改框的形状,请使用set_boxstyle方法。

bb.set_boxstyle("rarrow", pad=0.6)
  • 1

该参数是框样式的名称与其作为关键字参数的属性。 目前,实现了以下框样式。

名称属性
Circlecirclepad=0.3
DArrowdarrowpad=0.3
LArrowlarrowpad=0.3
RArrowrarrowpad=0.3
Roundroundpad=0.3,rounding_size=None
Round4round4pad=0.3,rounding_size=None
Roundtoothroundtoothpad=0.3,tooth_size=None
Sawtoothsawtoothpad=0.3,tooth_size=None
Squaresquarepad=0.3
# coding=utf-8
import matplotlib.patches as mpatch
import matplotlib.pyplot as plt

styles = mpatch.BoxStyle.get_styles()#返回边框的集合
spacing = 1.2

figheight = (spacing * len(styles) + .5)
fig1 = plt.figure(1, (4/1.5, figheight/1.5))
fontsize = 0.3 * 72

for i, stylename in enumerate(sorted(styles.keys())):
    print(i, stylename)
    fig1.text(0.5, (spacing * (float(len(styles)) - i) - 0.5)/figheight, stylename,
              ha="center",
              size=fontsize,
              transform=fig1.transFigure,
              bbox=dict(boxstyle=stylename, fc="w", ec="k"))
plt.draw()
plt.show()

 

注意,属性参数可以在样式名称中用逗号分隔(在初始化文本实例时,此形式可以用作bbox参数的boxstyle的值)。

bb.set_boxstyle("rarrow,pad=0.6")

使用箭头来标注

pyplot模块(或Axes类的annotate方法)中的annotate()函数用于绘制连接图上两点的箭头。

 

 

 
  1. ax.annotate("Annotation",

  2. xy=(x1, y1), xycoords='data',

  3. xytext=(x2, y2), textcoords='offset points',

  4. )

  • 1
  • 2
  • 3
  • 4

这会使用textcoords中提供的,xytext处的文本标注提供坐标(xycoords)中的xy处的点。 通常,数据坐标中规定了标注点,偏移点中规定了标注文本。 请参阅annotate()了解可用的坐标系。

连接两个点(xyxytext)的箭头可以通过指定arrowprops参数可选地绘制。 为了仅绘制箭头,请使用空字符串作为第一个参数。

 
  1. ax.annotate("",

  2. xy=(0.2, 0.2), xycoords='data',

  3. xytext=(0.8, 0.8), textcoords='data',

  4. arrowprops=dict(arrowstyle="->",

  5. connectionstyle="arc3"),

  6. )

import matplotlib.pyplot as plt

plt.figure(1, figsize=(3,3))
ax = plt.subplot(111)
'''
    
arrowprops = {
    arrowstyle 箭头类型
    connectionstyle:xy与xytext连接之间类型
}
'''
ax.annotate("s",
            xy=(0.2, 0.2), xycoords='data',
            xytext=(0.8, 0.8), textcoords='data',
            arrowprops=dict(arrowstyle="->",
                            connectionstyle="arc3"),
            )

plt.show()

 

箭头的绘制需要几个步骤。

  • 创建两个点之间的连接路径。 这由connectionstyle键值控制。
  • 如果提供了补丁对象(patchApatchB),则会剪切路径以避开该补丁。
  • 路径进一步由提供的像素总量来缩小(shirnkA&shrinkB
  • 路径转换为箭头补丁,由arrowstyle键值控制。

 

 

# coding=utf-8


import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

x1, y1 = 0.3, 0.3
x2, y2 = 0.7, 0.7

fig = plt.figure(1, figsize=(8,3))
fig.clf()
from mpl_toolkits.axes_grid.axes_grid import AxesGrid
from mpl_toolkits.axes_grid.anchored_artists import AnchoredText

#from matplotlib.font_manager import FontProperties

def add_at(ax, t, loc=2):
    fp = dict(size=10)
    _at = AnchoredText(t, loc=loc, prop=fp)
    ax.add_artist(_at)
    return _at


grid = AxesGrid(fig, 111, (1, 4), label_mode="1", share_all=True)

grid[0].set_autoscale_on(False)

ax = grid[0]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="-", #linestyle="dashed",
                            color="0.5",
                            patchB=None,
                            shrinkB=0,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )

add_at(ax, "connect", loc=2)

ax = grid[1]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="-", #linestyle="dashed",
                            color="0.5",
                            patchB=el,
                            shrinkB=0,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )

add_at(ax, "clip", loc=2)


ax = grid[2]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="-", #linestyle="dashed",
                            color="0.5",
                            patchB=el,
                            shrinkB=5,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )

add_at(ax, "shrink", loc=2)


ax = grid[3]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="fancy", #linestyle="dashed",
                            color="0.5",
                            patchB=el,
                            shrinkB=5,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )

add_at(ax, "mutate", loc=2)

grid[0].set_xlim(0, 1)
grid[0].set_ylim(0, 1)
grid[0].axis["bottom"].toggle(ticklabels=False)
grid[0].axis["left"].toggle(ticklabels=False)
fig.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95)

plt.draw()
plt.show()

 

两个点之间的连接路径的创建由connectionstyle键控制,并且可用以下样式。

名称属性
angleangleA=90,angleB=0,rad=0.0
angle3angleA=90,angleB=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

注意,angle3arc3中的3意味着所得到的路径是二次样条段(三个控制点)。 如下面将讨论的,当连接路径是二次样条时,可以使用一些箭头样式选项。

每个连接样式的行为在下面的示例中(有限地)演示。 (警告:条形样式的行为当前未定义好,将来可能会更改)。

源代码

然后根据给定的箭头样式将连接路径(在剪切和收缩之后)变换为箭头补丁。

名称属性
-None
->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
<-|>
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

源代码

一些箭头仅适用于生成二次样条线段的连接样式。 他们是fancysimplewedge。 对于这些箭头样式,必须使用angle3arc3连接样式。

如果提供了标注字符串,则patchA默认设置为文本的bbox补丁。

源代码

text命令一样,可以使用bbox参数来绘制文本周围的框。

源代码

默认情况下,起点设置为文本范围的中心。 可以使用relpos键值进行调整。 这些值根据文本的范围进行归一化。 例如,(0,0)表示左下角,(1,1)表示右上角。

源代码

将艺术家放置在轴域的锚定位置

有一类艺术家可以放置在轴域的锚定位置。 一个常见的例子是图例。 这种类型的艺术家可以使用OffsetBox类创建。 mpl_toolkits.axes_grid.anchored_artists中有几个预定义类。

 
  1. from mpl_toolkits.axes_grid.anchored_artists import AnchoredText

  2. at = AnchoredText("Figure 1a",

  3. prop=dict(size=8), frameon=True,

  4. loc=2,

  5. )

  6. at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")

  7. ax.add_artist(at)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

源代码

loc关键字与legend命令中含义相同。

一个简单的应用是当艺术家(或艺术家的集合)的像素大小在创建时已知。 例如,如果要绘制一个固定大小为 20 像素 ×20 像素(半径为 10 像素)的圆,则可以使用AnchoredDrawingArea。 实例使用绘图区域的大小创建(以像素为单位)。 用户可以在绘图区任意添加艺术家。 注意,添加到绘图区域的艺术家的范围与绘制区域本身的位置无关,只和初始大小有关。

 
  1. from mpl_toolkits.axes_grid.anchored_artists import AnchoredDrawingArea

  2.  
  3. ada = AnchoredDrawingArea(20, 20, 0, 0,

  4. loc=1, pad=0., frameon=False)

  5. p1 = Circle((10, 10), 10)

  6. ada.drawing_area.add_artist(p1)

  7. p2 = Circle((30, 10), 5, fc="r")

  8. ada.drawing_area.add_artist(p2)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

添加到绘图区域的艺术家不应该具有变换集(它们将被重写),并且那些艺术家的尺寸被解释为像素坐标,即,上述示例中的圆的半径分别是 10 像素和 5 像素。

源代码

有时,你想让你的艺术家按数据坐标(或其他坐标,而不是画布像素)缩放。 你可以使用AnchoredAuxTransformBox类。 这类似于AnchoredDrawingArea,除了艺术家的范围在绘制时由指定的变换确定。

 
  1. from mpl_toolkits.axes_grid.anchored_artists import AnchoredAuxTransformBox

  2.  
  3. box = AnchoredAuxTransformBox(ax.transData, loc=2)

  4. el = Ellipse((0,0), width=0.1, height=0.4, angle=30) # in data coordinates!

  5. box.drawing_area.add_artist(el)

  • 1
  • 2
  • 3
  • 4
  • 5

上述示例中的椭圆具有在数据坐标中对应于 0.1 和 0.4 的宽度和高度,并且当轴域的视图限制改变时将自动缩放。

源代码

如图例所示,可以设置bbox_to_anchor参数。 使用HPackerVPacker,你可以像图例中一样排列艺术家(事实上,这是图例的创建方式)。

源代码

请注意,与图例不同,默认情况下,bbox_transform设置为IdentityTransform

使用复杂坐标来标注

matplotlib 中的标注支持标注文本中描述的几种类型的坐标。 对于想要更多控制的高级用户,它支持几个其他选项。

  1. Transform实例,例如:

    ax.annotate("Test", xy=(0.5, 0.5), xycoords=ax.transAxes)
    • 1

    相当于:

    ax.annotate("Test", xy=(0.5, 0.5), xycoords="axes fraction")
    • 1

    使用它,你可以在其他轴域内标注一个点:

     
    1. ax1, ax2 = subplot(121), subplot(122)

    2. ax2.annotate("Test", xy=(0.5, 0.5), xycoords=ax1.transData,

    3. xytext=(0.5, 0.5), textcoords=ax2.transData,

    4. arrowprops=dict(arrowstyle="->"))

    • 1
    • 2
    • 3
    • 4
  2. Artist实例。xy值(或xytext)被解释为艺术家的bboxget_window_extent的返回值)的小数坐标。

     
    1. an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data",

    2. va="center", ha="center",

    3. bbox=dict(boxstyle="round", fc="w"))

    4. an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, # (1,0.5) of the an1's bbox

    5. xytext=(30,0), textcoords="offset points",

    6. va="center", ha="left",

    7. bbox=dict(boxstyle="round", fc="w"),

    8. arrowprops=dict(arrowstyle="->"))

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    源代码

    请注意,你的责任是在绘制an2之前确定坐标艺术家(上例中的an1)的范围。 在大多数情况下,这意味着an2需要晚于an1

  3. 一个返回BboxBaseTransform的实例的可调用对象。 如果返回一个变换,它与 1 相同,如果返回bbox,它与 2 相同。可调用对象应该接受renderer实例的单个参数。 例如,以下两个命令产生相同的结果:

     
    1. an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1,

    2. xytext=(30,0), textcoords="offset points")

    3. an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1.get_window_extent,

    4. xytext=(30,0), textcoords="offset points")

    • 1
    • 2
    • 3
    • 4
  4. 指定二元坐标的元组。 第一项用于x坐标,第二项用于y坐标。 例如,

    annotate("Test", xy=(0.5, 1), xycoords=("data", "axes fraction"))
    • 1

    0.5 的单位是数据坐标,1 的单位是归一化轴域坐标。 你可以像使用元组一样使用艺术家或变换。 例如,

     
    1. import matplotlib.pyplot as plt

    2.  
    3. plt.figure(figsize=(3,2))

    4. ax=plt.axes([0.1, 0.1, 0.8, 0.7])

    5. an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data",

    6. va="center", ha="center",

    7. bbox=dict(boxstyle="round", fc="w"))

    8.  
    9. an2 = ax.annotate("Test 2", xy=(0.5, 1.), xycoords=an1,

    10. xytext=(0.5,1.1), textcoords=(an1, "axes fraction"),

    11. va="bottom", ha="center",

    12. bbox=dict(boxstyle="round", fc="w"),

    13. arrowprops=dict(arrowstyle="->"))

    14. plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    源代码

  5. 有时,您希望您的注释带有一些“偏移点”,不是距离注释点,而是距离某些其他点。 OffsetFrom是这种情况下的辅助类。

     
    1. import matplotlib.pyplot as plt

    2.  
    3. plt.figure(figsize=(3,2))

    4. ax=plt.axes([0.1, 0.1, 0.8, 0.7])

    5. an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data",

    6. va="center", ha="center",

    7. bbox=dict(boxstyle="round", fc="w"))

    8.  
    9. from matplotlib.text import OffsetFrom

    10. offset_from = OffsetFrom(an1, (0.5, 0))

    11. an2 = ax.annotate("Test 2", xy=(0.1, 0.1), xycoords="data",

    12. xytext=(0, -10), textcoords=offset_from,

    13. # xytext is offset points from "xy=(0.5, 0), xycoords=an1"

    14. va="top", ha="center",

    15. bbox=dict(boxstyle="round", fc="w"),

    16. arrowprops=dict(arrowstyle="->"))

    17. plt.show()

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    你可以参考这个链接:pylab_examples example code: annotation_demo3.py.

使用ConnectorPatch

ConnectorPatch类似于没有文本的标注。 虽然在大多数情况下建议使用标注函数,但是当您想在不同的轴上连接点时,ConnectorPatch很有用。

 
  1. from matplotlib.patches import ConnectionPatch

  2. xy = (0.2, 0.2)

  3. con = ConnectionPatch(xyA=xy, xyB=xy, coordsA="data", coordsB="data",

  4. axesA=ax1, axesB=ax2)

  5. ax2.add_artist(con)

  • 1
  • 2
  • 3
  • 4
  • 5

上述代码连接了ax1中数据坐标的xy点,与ax2中数据坐标的xy点。这是个简单的例子。

源代码

虽然ConnectorPatch实例可以添加到任何轴,但您可能需要将其添加到绘图顺序中最新的轴,以防止与其他轴重叠。

高级话题

轴域之间的缩放效果

mpl_toolkits.axes_grid.inset_locator定义了一些补丁类,用于互连两个轴域。 理解代码需要一些 mpl 转换如何工作的知识。 但是,利用它的方式很直接。

源代码

定义自定义盒样式

你可以使用自定义盒样式,boxstyle的值可以为如下形式的可调用对象:

 
  1. def __call__(self, x0, y0, width, height, mutation_size,

  2. aspect_ratio=1.):

  3. """

  4. Given the location and size of the box, return the path of

  5. the box around it.

  6.  
  7. - *x0*, *y0*, *width*, *height* : location and size of the box

  8. - *mutation_size* : a reference scale for the mutation.

  9. - *aspect_ratio* : aspect-ratio for the mutation.

  10. """

  11. path = ...

  12. return path

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里是个复杂的例子:

源代码

但是,推荐你从matplotlib.patches.BoxStyle._Base派生,像这样:

 
  1. from matplotlib.path import Path

  2. from matplotlib.patches import BoxStyle

  3. import matplotlib.pyplot as plt

  4.  
  5. # we may derive from matplotlib.patches.BoxStyle._Base class.

  6. # You need to override transmute method in this case.

  7.  
  8. class MyStyle(BoxStyle._Base):

  9. """

  10. A simple box.

  11. """

  12.  
  13. def __init__(self, pad=0.3):

  14. """

  15. The arguments need to be floating numbers and need to have

  16. default values.

  17.  
  18. *pad*

  19. amount of padding

  20. """

  21.  
  22. self.pad = pad

  23. super(MyStyle, self).__init__()

  24.  
  25. def transmute(self, x0, y0, width, height, mutation_size):

  26. """

  27. Given the location and size of the box, return the path of

  28. the box around it.

  29.  
  30. - *x0*, *y0*, *width*, *height* : location and size of the box

  31. - *mutation_size* : a reference scale for the mutation.

  32.  
  33. Often, the *mutation_size* is the font size of the text.

  34. You don't need to worry about the rotation as it is

  35. automatically taken care of.

  36. """

  37.  
  38. # padding

  39. pad = mutation_size * self.pad

  40.  
  41. # width and height with padding added.

  42. width, height = width + 2.*pad, \

  43. height + 2.*pad,

  44.  
  45. # boundary of the padded box

  46. x0, y0 = x0-pad, y0-pad,

  47. x1, y1 = x0+width, y0 + height

  48.  
  49. cp = [(x0, y0),

  50. (x1, y0), (x1, y1), (x0, y1),

  51. (x0-pad, (y0+y1)/2.), (x0, y0),

  52. (x0, y0)]

  53.  
  54. com = [Path.MOVETO,

  55. Path.LINETO, Path.LINETO, Path.LINETO,

  56. Path.LINETO, Path.LINETO,

  57. Path.CLOSEPOLY]

  58.  
  59. path = Path(cp, com)

  60.  
  61. return path

  62.  
  63.  
  64. # register the custom style

  65. BoxStyle._style_list["angled"] = MyStyle

  66.  
  67. plt.figure(1, figsize=(3,3))

  68. ax = plt.subplot(111)

  69. ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,

  70. bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))

  71.  
  72. del BoxStyle._style_list["angled"]

  73.  
  74. plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

源代码

与之类似,您可以定义一个自定义的ConnectionStyle和一个自定义的ArrowStyle。 请参阅lib/matplotlib/patches.py的源代码,并查看每个样式类是如何定义的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值