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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
| import matplotlib.pyplot as plt from matplotlib.image import BboxImage import numpy as np from matplotlib.transforms import IdentityTransform
import matplotlib.patches as mpatches
from matplotlib.offsetbox import AnnotationBbox,\ AnchoredOffsetbox, AuxTransformBox
from matplotlib.cbook import get_sample_data
from matplotlib.text import TextPath
class PathClippedImagePatch(mpatches.PathPatch): """ The given image is used to draw the face of the patch. Internally, it uses BboxImage whose clippath set to the path of the patch.
FIXME : The result is currently dpi dependent. """
def __init__(self, path, bbox_image, **kwargs): mpatches.PathPatch.__init__(self, path, **kwargs) self._init_bbox_image(bbox_image)
def set_facecolor(self, color): """simply ignore facecolor""" mpatches.PathPatch.set_facecolor(self, "none")
def _init_bbox_image(self, im):
bbox_image = BboxImage(self.get_window_extent, norm=None, origin=None, ) bbox_image.set_transform(IdentityTransform())
bbox_image.set_data(im) self.bbox_image = bbox_image
def draw(self, renderer=None):
self.bbox_image.set_clip_path(self._path, self.get_transform()) self.bbox_image.draw(renderer)
mpatches.PathPatch.draw(self, renderer)
if 1:
usetex = plt.rcParams["text.usetex"]
fig = plt.figure(1)
ax = plt.subplot(211)
arr = plt.imread(get_sample_data("grace_hopper.png"))
text_path = TextPath((0, 0), "!?", size=150) p = PathClippedImagePatch(text_path, arr, ec="k", transform=IdentityTransform())
offsetbox = AuxTransformBox(IdentityTransform()) offsetbox.add_artist(p)
ao = AnchoredOffsetbox(loc='upper left', child=offsetbox, frameon=True, borderpad=0.2) ax.add_artist(ao)
from matplotlib.patches import PathPatch if usetex: r = r"\mbox{textpath supports mathtext \& \TeX}" else: r = r"textpath supports mathtext & TeX"
text_path = TextPath((0, 0), r, size=20, usetex=usetex)
p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9, transform=IdentityTransform()) p2 = PathPatch(text_path, ec="none", fc="k", transform=IdentityTransform())
offsetbox2 = AuxTransformBox(IdentityTransform()) offsetbox2.add_artist(p1) offsetbox2.add_artist(p2)
ab = AnnotationBbox(offsetbox2, (0.95, 0.05), xycoords='axes fraction', boxcoords="offset points", box_alignment=(1., 0.), frameon=False ) ax.add_artist(ab)
ax.imshow([[0, 1, 2], [1, 2, 3]], cmap=plt.cm.gist_gray_r, interpolation="bilinear", aspect="auto")
ax = plt.subplot(212)
arr = np.arange(256).reshape(1, 256)/256.
if usetex: s = (r"$\displaystyle\left[\sum_{n=1}^\infty" r"\frac{-e^{i\pi}}{2^n}\right]$!") else: s = r"$\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" text_path = TextPath((0, 0), s, size=40, usetex=usetex) text_patch = PathClippedImagePatch(text_path, arr, ec="none", transform=IdentityTransform())
shadow1 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="none", ec="0.6", lw=3)) shadow2 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="0.3", ec="none"))
offsetbox = AuxTransformBox(IdentityTransform()) offsetbox.add_artist(shadow1) offsetbox.add_artist(shadow2) offsetbox.add_artist(text_patch)
ab = AnnotationBbox(offsetbox, (0.5, 0.5), xycoords='data', boxcoords="offset points", box_alignment=(0.5, 0.5), )
ax.add_artist(ab)
ax.set_xlim(0, 1) ax.set_ylim(0, 1)
plt.show()
|