clabel return values

Is the list of return values from the clabel() function supposed to represent the position and orientation of the contour labels? I have a script below where I try to re-draw the contour labels using the Text objects in the list returned from clabel(), and they do not line up in my output. I'm using Matplotlib version 0.98.5.1, revision 6622.

If this is intentional, is there some way of retrieving the actual position/orientation of the contour labels? I'm trying to make a drop-shadow effect for those labels, and I need to know where they are exactly for my code to work.

Sample script:
#!/usr/bin/env python
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import math

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

f=plt.figure(facecolor='g')
ax = plt.gca()
ax.set_axis_bgcolor('g')
CS = plt.contour(X, Y, Z)
xt = plt.xticks()
yt = plt.yticks()

fontsize = 10
fontdict2 = {'fontweight':'light',
             'color': 'r',
             'fontsize':fontsize}
labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
    ltext = label.get_text()
    lrot = label.get_rotation()
    lx,ly = label.get_position()
    plt.text(lx,ly,ltext,fontdict2,rotation=lrot)

plt.savefig('output.png')

I guess you're missing vertical and horizontal alignment.
Also, your font properties were not set correctly. The 4th argument of
the text function is a color.

fontdict2 = {'fontweight':'light',
             'color': 'r',
             'fontsize':fontsize}
fp = FontProperties(fontdict2)

labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
    ltext = label.get_text()
    lx,ly = label.get_position()
    lrot=label.get_rotation()
    va, ha = label.get_va(), label.get_ha()
    t = plt.text(lx,ly,ltext, fontproperties=fp,
                 rotation=lrot,va=va, ha=ha)

You may simply use update_from() method.

Anyhow, I'm not sure if you can put dorpshadow effect this way.
Changing font weight usually changes the overall size of each glyph.

Regards,

-JJ

···

On Tue, Jan 6, 2009 at 10:20 AM, Michael Hearne <mhearne@...924...> wrote:

Is the list of return values from the clabel() function supposed to
represent the position and orientation of the contour labels? I have a
script below where I try to re-draw the contour labels using the Text
objects in the list returned from clabel(), and they do not line up in
my output. I'm using Matplotlib version 0.98.5.1, revision 6622.

If this is intentional, is there some way of retrieving the actual
position/orientation of the contour labels? I'm trying to make a
drop-shadow effect for those labels, and I need to know where they are
exactly for my code to work.

Sample script:
#!/usr/bin/env python
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import math

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

f=plt.figure(facecolor='g')
ax = plt.gca()
ax.set_axis_bgcolor('g')
CS = plt.contour(X, Y, Z)
xt = plt.xticks()
yt = plt.yticks()

fontsize = 10
fontdict2 = {'fontweight':'light',
            'color': 'r',
            'fontsize':fontsize}
labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
   ltext = label.get_text()
   lrot = label.get_rotation()
   lx,ly = label.get_position()
   plt.text(lx,ly,ltext,fontdict2,rotation=lrot)

plt.savefig('output.png')

------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

Jae-Joon - Thank you for your suggestion. I wasn't aware I needed the alignments.

However, when I try your sample code in my script, I get a sequence of rendering errors if I use show() or savefig():

Traceback (most recent call last):
  File "/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/figure.py", line 772, in draw
    for a in self.axes: a.draw(renderer)
  File "/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/axes.py", line 1601, in draw
    a.draw(renderer)
  File "/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/text.py", line 450, in draw
    bbox, info = self._get_layout(renderer)
  File "/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/text.py", line 246, in _get_layout
    'lp', self._fontproperties, ismath=False)
  File "/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/backends/backend_macosx.py", line 123, in get_text_width_height_descent
    return self.gc.get_text_width_height_descent(unicode(s), family, size, weight, style)
RuntimeError: ATSUSetAttributes failed

My new script is below:
#!/usr/bin/env python
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import math

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

f=plt.figure(facecolor='g')
ax = plt.gca()
ax.set_axis_bgcolor('g')
CS = plt.contour(X, Y, Z)
xt = plt.xticks()
yt = plt.yticks()

fontsize = 10
fontdict2 = {'fontweight':'light',
             'color': 'r',
             'fontsize':fontsize}
fp = matplotlib.font_manager.FontProperties(fontdict2)

labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
    ltext = label.get_text()
    lx,ly = label.get_position()
    lrot=label.get_rotation()
    va, ha = label.get_va(), label.get_ha()
    t = plt.text(lx,ly,ltext, fontproperties=fp,
                 rotation=lrot,va=va, ha=ha)

plt.savefig('output.png')

Jae-Joon Lee wrote:

···

I guess you're missing vertical and horizontal alignment.
Also, your font properties were not set correctly. The 4th argument of
the text function is a color.

fontdict2 = {'fontweight':'light',
             'color': 'r',
             'fontsize':fontsize}
fp = FontProperties(fontdict2)

labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
    ltext = label.get_text()
    lx,ly = label.get_position()
    lrot=label.get_rotation()
    va, ha = label.get_va(), label.get_ha()
    t = plt.text(lx,ly,ltext, fontproperties=fp,
                 rotation=lrot,va=va, ha=ha)

You may simply use update_from() method.

Anyhow, I'm not sure if you can put dorpshadow effect this way.
Changing font weight usually changes the overall size of each glyph.

Regards,

-JJ

On Tue, Jan 6, 2009 at 10:20 AM, Michael Hearne <mhearne@...924...> wrote:
  

Is the list of return values from the clabel() function supposed to
represent the position and orientation of the contour labels? I have a
script below where I try to re-draw the contour labels using the Text
objects in the list returned from clabel(), and they do not line up in
my output. I'm using Matplotlib version 0.98.5.1, revision 6622.

If this is intentional, is there some way of retrieving the actual
position/orientation of the contour labels? I'm trying to make a
drop-shadow effect for those labels, and I need to know where they are
exactly for my code to work.

Sample script:
#!/usr/bin/env python
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import math

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

f=plt.figure(facecolor='g')
ax = plt.gca()
ax.set_axis_bgcolor('g')
CS = plt.contour(X, Y, Z)
xt = plt.xticks()
yt = plt.yticks()

fontsize = 10
fontdict2 = {'fontweight':'light',
            'color': 'r',
            'fontsize':fontsize}
labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
   ltext = label.get_text()
   lrot = label.get_rotation()
   lx,ly = label.get_position()
   plt.text(lx,ly,ltext,fontdict2,rotation=lrot)

plt.savefig('output.png')

------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

I can't reproduce the error and I guess it is back end specific.
Anyhow, the fontproperties object were created incorrectly and this
may be cause of the problem. I just thought your original dictionary
was in a correct form.

So, test your code w/o fontproperties and see if your text is placed
in a correct position. Then you need to create the fontproperties in a
correct way.
Please take a look at FontProperties document and revise your code accordingly.
It should be something like

FontProperties(weight="light", size=fontsize)

There is no fontweight keyword. And the color needs to be specified as
a parameters of the text function.

I don't have much clue on how font selection work in the mpl, but you
may need some tweaking on that.

Regards,

-JJ

···

On Tue, Jan 6, 2009 at 12:46 PM, Michael Hearne <mhearne@...924...> wrote:

Jae-Joon - Thank you for your suggestion. I wasn't aware I needed the
alignments.

However, when I try your sample code in my script, I get a sequence of
rendering errors if I use show() or savefig():

Traceback (most recent call last):
File
"/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/figure.py",
line 772, in draw
  for a in self.axes: a.draw(renderer)
File
"/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/axes.py",
line 1601, in draw
  a.draw(renderer)
File
"/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/text.py",
line 450, in draw
  bbox, info = self._get_layout(renderer)
File
"/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/text.py",
line 246, in _get_layout
  'lp', self._fontproperties, ismath=False)
File
"/Library/Python/2.5/site-packages/matplotlib-0.98.5.1-py2.5-macosx-10.5-i386.egg/matplotlib/backends/backend_macosx.py",
line 123, in get_text_width_height_descent
  return self.gc.get_text_width_height_descent(unicode(s), family, size,
weight, style)
RuntimeError: ATSUSetAttributes failed

My new script is below:
#!/usr/bin/env python
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import math

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

f=plt.figure(facecolor='g')
ax = plt.gca()
ax.set_axis_bgcolor('g')
CS = plt.contour(X, Y, Z)
xt = plt.xticks()
yt = plt.yticks()

fontsize = 10
fontdict2 = {'fontweight':'light',
           'color': 'r',
           'fontsize':fontsize}
fp = matplotlib.font_manager.FontProperties(fontdict2)

labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
  ltext = label.get_text()
  lx,ly = label.get_position()
  lrot=label.get_rotation()
  va, ha = label.get_va(), label.get_ha()
  t = plt.text(lx,ly,ltext, fontproperties=fp,
               rotation=lrot,va=va, ha=ha)

plt.savefig('output.png')

Jae-Joon Lee wrote:

I guess you're missing vertical and horizontal alignment.
Also, your font properties were not set correctly. The 4th argument of
the text function is a color.

fontdict2 = {'fontweight':'light',
            'color': 'r',
            'fontsize':fontsize}
fp = FontProperties(fontdict2)

labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
   ltext = label.get_text()
   lx,ly = label.get_position()
   lrot=label.get_rotation()
   va, ha = label.get_va(), label.get_ha()
   t = plt.text(lx,ly,ltext, fontproperties=fp,
                rotation=lrot,va=va, ha=ha)

You may simply use update_from() method.

Anyhow, I'm not sure if you can put dorpshadow effect this way.
Changing font weight usually changes the overall size of each glyph.

Regards,

-JJ

On Tue, Jan 6, 2009 at 10:20 AM, Michael Hearne <mhearne@...924...> wrote:

Is the list of return values from the clabel() function supposed to
represent the position and orientation of the contour labels? I have a
script below where I try to re-draw the contour labels using the Text
objects in the list returned from clabel(), and they do not line up in
my output. I'm using Matplotlib version 0.98.5.1, revision 6622.

If this is intentional, is there some way of retrieving the actual
position/orientation of the contour labels? I'm trying to make a
drop-shadow effect for those labels, and I need to know where they are
exactly for my code to work.

Sample script:
#!/usr/bin/env python
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import math

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)

f=plt.figure(facecolor='g')
ax = plt.gca()
ax.set_axis_bgcolor('g')
CS = plt.contour(X, Y, Z)
xt = plt.xticks()
yt = plt.yticks()

fontsize = 10
fontdict2 = {'fontweight':'light',
           'color': 'r',
           'fontsize':fontsize}
labels = plt.clabel(CS, inline=1, fontsize=fontsize,colors='k')
for label in labels:
  ltext = label.get_text()
  lrot = label.get_rotation()
  lx,ly = label.get_position()
  plt.text(lx,ly,ltext,fontdict2,rotation=lrot)

plt.savefig('output.png')

------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options