how to clip text outside a polygon path?

Hi,

I wanna know how to clip text outside a polygon path.
In the attached a.png file, the polygon with red facecolor and green
edgecolor is a Path. I want to get rid of the text 'aaaaaaaaunicode:
Institut' outside the polygon and keep the part inside the polygon
('aaaaaaa') left.

my code as follows. It can work out a 'right' result as i wanted.

a.png

···

------------------
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib.patches as mpatches

import matplotlib.pyplot as plt
from matplotlib.transforms import *

Path=mpath.Path

lines = [ [1,1.5],[1,6],[6,3],[3,1.5],[1,1.5] ]

codes=[Path.LINETO]*len(lines)
codes[0]=Path.MOVETO
codes[-1]=Path.CLOSEPOLY
path=mpath.Path(lines,codes)
patch=mpatches.PathPatch(path,facecolor='red',edgecolor='green',lw=2)#,alpha=1)

fig = plt.figure()
fig.suptitle('bold figure suptitle', fontsize=14, fontweight='bold')
ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)
ax.set_title('axes title')
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.text(3, 8, 'boxed italics text in data coords', style='italic',
bbox={'facecolor':'red', 'alpha':0.5, 'pad':10})
ax.text(2, 6, r'an equation: $E=mc^2$', fontsize=15)

t=ax.text(3, 2, unicode('aaaaaaaaunicode: Institut f\374r Festk\366rperphysik', 'latin-1'))
t.set_clip_path(patch)

ax.text(0.95, 0.01, 'colored text in axes coords',
verticalalignment='bottom', horizontalalignment='right',
transform=ax.transAxes,
color='green', fontsize=15)
ax.plot([2], [1], 'o')
ax.annotate('annotate', xy=(2, 1), xytext=(3, 4),
arrowprops=dict(facecolor='black', shrink=0.05))
ax.axis([0, 10, 0, 10])

ax.add_patch(patch)
ax.set_clip_path(patch)

plt.show()

-------------------

Can anybody give me a example?
thanks.

                   david.shu
                   2010.7.13

It seems that there are at least two issues related with the text clipping.

The first issue is that the Text.draw method does not properly set
clip path. I think I fixed this in r8541 and r8542.

The second issue is that the agg backend does not seem to support a
clip path yet for the text.

Also, your script need to be fixed.
The patch need to be added to the axes (or its transform need to be
set) before you call set_clip_path.

So, with the current svn, you can clip the text with an arbitrary path
when you're using the backends that support it (I only tested with pdf
backend, the attached is the pdf output converted to png).
If you can install matplotlib from the svn, please test the patch.
Also, it would be great if you file a bug in the SF tracker, so that
other developer can fix it later.

Regards,

-JJ

textclip.png

···

On Tue, Jul 13, 2010 at 4:21 AM, shuwj <shuwj5460@...1221...> wrote:

Hi,

I wanna know how to clip text outside a polygon path.
In the attached a.png file, the polygon with red facecolor and green
edgecolor is a Path. I want to get rid of the text 'aaaaaaaaunicode:
Institut' outside the polygon and keep the part inside the polygon
('aaaaaaa') left.

my code as follows. It can work out a 'right' result as i wanted.
------------------
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib.patches as mpatches

import matplotlib.pyplot as plt
from matplotlib.transforms import *

Path=mpath.Path

lines = [ [1,1.5],[1,6],[6,3],[3,1.5],[1,1.5] ]

codes=[Path.LINETO]*len(lines)
codes[0]=Path.MOVETO
codes[-1]=Path.CLOSEPOLY
path=mpath.Path(lines,codes)
patch=mpatches.PathPatch(path,facecolor='red',edgecolor='green',lw=2)#,alpha=1)

fig = plt.figure()
fig.suptitle('bold figure suptitle', fontsize=14, fontweight='bold')
ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)
ax.set_title('axes title')
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.text(3, 8, 'boxed italics text in data coords', style='italic',
bbox={'facecolor':'red', 'alpha':0.5, 'pad':10})
ax.text(2, 6, r'an equation: $E=mc^2$', fontsize=15)

t=ax.text(3, 2, unicode('aaaaaaaaunicode: Institut f\374r Festk\366rperphysik', 'latin-1'))
t.set_clip_path(patch)

ax.text(0.95, 0.01, 'colored text in axes coords',
verticalalignment='bottom', horizontalalignment='right',
transform=ax.transAxes,
color='green', fontsize=15)
ax.plot([2], [1], 'o')
ax.annotate('annotate', xy=(2, 1), xytext=(3, 4),
arrowprops=dict(facecolor='black', shrink=0.05))
ax.axis([0, 10, 0, 10])

ax.add_patch(patch)
ax.set_clip_path(patch)

plt.show()

-------------------

Can anybody give me a example?
thanks.

              david\.shu
              2010\.7\.13

------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Hi JJ,
    Thanks for your reply. I can't access the svn for some network
reason. Will you please send me a copy of your patch about Text.draw?
    Regards,

David.shu

···

It seems that there are at least two issues related with the text
clipping.
The first issue is that the Text.draw method does not properly set
clip path. I think I fixed this in r8541 and r8542.

The second issue is that the agg backend does not seem to support a
clip path yet for the text.

Also, your script need to be fixed.
The patch need to be added to the axes (or its transform need to be
set) before you call set_clip_path.

So, with the current svn, you can clip the text with an arbitrary path
when you're using the backends that support it (I only tested with pdf
backend, the attached is the pdf output converted to png).
If you can install matplotlib from the svn, please test the patch.
Also, it would be great if you file a bug in the SF tracker, so that
other developer can fix it later.

Regards,

-JJ

http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/branches/v1_0_maint/lib/matplotlib/text.py?r1=8512&r2=8541&pathrev=8541

Regards,

-JJ

···

On Wed, Jul 14, 2010 at 1:22 AM, shuwj <shuwj5460@...1221...> wrote:

Hi JJ,
Thanks for your reply. I can't access the svn for some network
reason. Will you please send me a copy of your patch about Text.draw?
Regards,

David.shu

It seems that there are at least two issues related with the text
clipping.
The first issue is that the Text.draw method does not properly set
clip path. I think I fixed this in r8541 and r8542.

The second issue is that the agg backend does not seem to support a
clip path yet for the text.

Also, your script need to be fixed.
The patch need to be added to the axes (or its transform need to be
set) before you call set_clip_path.

So, with the current svn, you can clip the text with an arbitrary path
when you're using the backends that support it (I only tested with pdf
backend, the attached is the pdf output converted to png).
If you can install matplotlib from the svn, please test the patch.
Also, it would be great if you file a bug in the SF tracker, so that
other developer can fix it later.

Regards,

-JJ