.. _pylab_examples-demo_text_path: pylab_examples example code: demo_text_path.py ============================================== .. plot:: /home/tcaswell/source/p/matplotlib/doc/mpl_examples/pylab_examples/demo_text_path.py :: # -*- coding: utf-8 -*- 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): # the clip path must be updated every draw. any solution? -JJ 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) # EXAMPLE 1 ax = plt.subplot(211) from matplotlib._png import read_png fn = get_sample_data("grace_hopper.png", asfileobj=False) arr = read_png(fn) text_path = TextPath((0, 0), "!?", size=150) p = PathClippedImagePatch(text_path, arr, ec="k", transform=IdentityTransform()) #p.set_clip_on(False) # make offset box offsetbox = AuxTransformBox(IdentityTransform()) offsetbox.add_artist(p) # make anchored offset box ao = AnchoredOffsetbox(loc=2, child=offsetbox, frameon=True, borderpad=0.2) ax.add_artist(ao) # another text 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") # EXAMPLE 2 ax = plt.subplot(212) arr = np.arange(256).reshape(1, 256)/256. if usetex: s = r"$\displaystyle\left[\sum_{n=1}^\infty\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")) # make offset box offsetbox = AuxTransformBox(IdentityTransform()) offsetbox.add_artist(shadow1) offsetbox.add_artist(shadow2) offsetbox.add_artist(text_patch) # place the anchored offset box using AnnotationBbox ab = AnnotationBbox(offsetbox, (0.5, 0.5), xycoords='data', boxcoords="offset points", box_alignment=(0.5, 0.5), ) #text_path.set_size(10) ax.add_artist(ab) ax.set_xlim(0, 1) ax.set_ylim(0, 1) plt.draw() plt.show() Keywords: python, matplotlib, pylab, example, codex (see :ref:`how-to-search-examples`)