Revision: 4634
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4634&view=rev
Author: mdboom
Date: 2007-12-05 13:13:46 -0800 (Wed, 05 Dec 2007)
Log Message:
-----------
Merged revisions 4621-4633 via svnmerge from
http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib
........
r4622 | jdh2358 | 2007-12-05 12:11:28 -0500 (Wed, 05 Dec 2007) | 2 lines
updated autofmt_xdate to work in more cases. it no longer raises if axes
aren't subplots
........
r4629 | jdh2358 | 2007-12-05 14:27:14 -0500 (Wed, 05 Dec 2007) | 2 lines
minor rec2excel enhancements
........
r4632 | pkienzle | 2007-12-05 14:36:36 -0500 (Wed, 05 Dec 2007) | 1 line
docu update: coord reporting works in wx
........
r4633 | mdboom | 2007-12-05 15:28:28 -0500 (Wed, 05 Dec 2007) | 2 lines
Fix bug where font files were opened many more times than they need to be.
........
Modified Paths:
--------------
branches/transforms/examples/coords_report.py
branches/transforms/examples/loadrec.py
branches/transforms/lib/matplotlib/backends/backend_agg.py
branches/transforms/lib/matplotlib/backends/backend_pdf.py
branches/transforms/lib/matplotlib/backends/backend_ps.py
branches/transforms/lib/matplotlib/backends/backend_svg.py
branches/transforms/lib/matplotlib/figure.py
branches/transforms/lib/matplotlib/font_manager.py
branches/transforms/lib/matplotlib/mlab.py
Property Changed:
----------------
branches/transforms/
Property changes on: branches/transforms
___________________________________________________________________
Name: svnmerge-integrated
- /trunk/matplotlib:1-4620
+ /trunk/matplotlib:1-4633
Modified: branches/transforms/examples/coords_report.py
===================================================================
--- branches/transforms/examples/coords_report.py 2007-12-05 20:28:28 UTC
(rev 4633)
+++ branches/transforms/examples/coords_report.py 2007-12-05 21:13:46 UTC
(rev 4634)
@@ -1,7 +1,6 @@
#!/usr/bin/env python
-# override the default reporting of coords (coords reporting not
-# implemented yet on wx*)
+# override the default reporting of coords
from pylab import *
Modified: branches/transforms/examples/loadrec.py
===================================================================
--- branches/transforms/examples/loadrec.py 2007-12-05 20:28:28 UTC (rev
4633)
+++ branches/transforms/examples/loadrec.py 2007-12-05 21:13:46 UTC (rev
4634)
@@ -9,4 +9,6 @@
ax = fig.add_subplot(111)
ax.plot(a.date, a.adj_close, '-')
fig.autofmt_xdate()
+
+mlab.rec2excel(a, 'test.xls', colnum=4)
show()
Modified: branches/transforms/lib/matplotlib/backends/backend_agg.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_agg.py 2007-12-05
20:28:28 UTC (rev 4633)
+++ branches/transforms/lib/matplotlib/backends/backend_agg.py 2007-12-05
21:13:46 UTC (rev 4634)
@@ -31,7 +31,8 @@
from matplotlib._pylab_helpers import Gcf
from matplotlib.backend_bases import RendererBase,\
GraphicsContextBase, FigureManagerBase, FigureCanvasBase
-from matplotlib.cbook import enumerate, is_string_like, exception_to_str
+from matplotlib.cbook import enumerate, is_string_like, exception_to_str, \
+ maxdict
from matplotlib.figure import Figure
from matplotlib.font_manager import findfont
from matplotlib.ft2font import FT2Font, LOAD_FORCE_AUTOHINT
@@ -49,7 +50,8 @@
context instance that controls the colors/styles
"""
debug=1
- texd = {} # a cache of tex image rasters
+ texd = maxdict(50) # a cache of tex image rasters
+ _fontd = maxdict(50)
def __init__(self, width, height, dpi):
if __debug__: verbose.report('RendererAgg.__init__', 'debug-annoying')
RendererBase.__init__(self)
@@ -70,7 +72,6 @@
self.restore_region = self._renderer.restore_region
self.tostring_rgba_minimized = self._renderer.tostring_rgba_minimized
self.mathtext_parser = MathTextParser('Agg')
- self._fontd = {}
self.bbox = Bbox.from_bounds(0, 0, self.width, self.height)
if __debug__: verbose.report('RendererAgg.__init__ done',
@@ -172,7 +173,10 @@
if font is None:
fname = findfont(prop)
- font = FT2Font(str(fname))
+ font = self._fontd.get(fname)
+ if font is None:
+ font = FT2Font(str(fname))
+ self._fontd[fname] = font
self._fontd[key] = font
font.clear()
Modified: branches/transforms/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-12-05
20:28:28 UTC (rev 4633)
+++ branches/transforms/lib/matplotlib/backends/backend_pdf.py 2007-12-05
21:13:46 UTC (rev 4634)
@@ -26,7 +26,7 @@
FigureManagerBase, FigureCanvasBase
from matplotlib.backends.backend_mixed import MixedModeRenderer
from matplotlib.cbook import Bunch, enumerate, is_string_like, reverse_dict, \
- get_realpath_and_stat, is_writable_file_like
+ get_realpath_and_stat, is_writable_file_like, maxdict
from matplotlib.figure import Figure
from matplotlib.font_manager import findfont, is_opentype_cff_font
from matplotlib.afm import AFM
@@ -1162,13 +1162,13 @@
self.write("\nstartxref\n%d\n%%%%EOF\n" % self.startxref)
class RendererPdf(RendererBase):
+ truetype_font_cache = maxdict(50)
+ afm_font_cache = maxdict(50)
def __init__(self, file, dpi):
RendererBase.__init__(self)
self.file = file
self.gc = self.new_gc()
- self.truetype_font_cache = {}
- self.afm_font_cache = {}
self.file.used_characters = self.used_characters = {}
self.mathtext_parser = MathTextParser("Pdf")
self.dpi = dpi
@@ -1176,8 +1176,6 @@
def finalize(self):
self.gc.finalize()
- del self.truetype_font_cache
- del self.afm_font_cache
def check_gc(self, gc, fillcolor=None):
orig_fill = gc._fillcolor
@@ -1589,9 +1587,12 @@
font = self.afm_font_cache.get(key)
if font is None:
filename = findfont(prop, fontext='afm')
- fh = file(filename)
- font = AFM(fh)
- fh.close()
+ font = self.afm_font_cache.get(filename)
+ if font is None:
+ fh = file(filename)
+ font = AFM(fh)
+ self.afm_font_cache[filename] = font
+ fh.close()
self.afm_font_cache[key] = font
return font
@@ -1600,7 +1601,10 @@
font = self.truetype_font_cache.get(key)
if font is None:
filename = findfont(prop)
- font = FT2Font(str(filename))
+ font = self.truetype_font_cache.get(filename)
+ if font is None:
+ font = FT2Font(str(filename))
+ self.truetype_font_cache[filename] = font
self.truetype_font_cache[key] = font
font.clear()
font.set_size(prop.get_size_in_points(), self.dpi)
Modified: branches/transforms/lib/matplotlib/backends/backend_ps.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-12-05
20:28:28 UTC (rev 4633)
+++ branches/transforms/lib/matplotlib/backends/backend_ps.py 2007-12-05
21:13:46 UTC (rev 4634)
@@ -15,7 +15,7 @@
FigureManagerBase, FigureCanvasBase
from matplotlib.cbook import is_string_like, izip, get_realpath_and_stat, \
- is_writable_file_like
+ is_writable_file_like, maxdict
from matplotlib.figure import Figure
from matplotlib.font_manager import findfont, is_opentype_cff_font
@@ -122,6 +122,9 @@
context instance that controls the colors/styles.
"""
+ fontd = maxdict(50)
+ afmfontd = maxdict(50)
+
def __init__(self, width, height, pswriter, dpi=72):
RendererBase.__init__(self)
self.width = width
@@ -144,8 +147,6 @@
self._clip_paths = {}
self._path_collection_id = 0
- self.fontd = {}
- self.afmfontd = {}
self.used_characters = {}
self.mathtext_parser = MathTextParser("PS")
@@ -316,7 +317,11 @@
key = hash(prop)
font = self.afmfontd.get(key)
if font is None:
- font = AFM(file(findfont(prop, fontext='afm')))
+ fname = findfont(prop, fontext='afm')
+ font = self.afmfontd.get(fname)
+ if font is None:
+ font = AFM(file(findfont(prop, fontext='afm')))
+ self.afmfontd[fname] = font
self.afmfontd[key] = font
return font
@@ -325,7 +330,10 @@
font = self.fontd.get(key)
if font is None:
fname = findfont(prop)
- font = FT2Font(str(fname))
+ font = self.fontd.get(fname)
+ if font is None:
+ font = FT2Font(str(fname))
+ self.fontd[fname] = font
self.fontd[key] = font
font.clear()
size = prop.get_size_in_points()
Modified: branches/transforms/lib/matplotlib/backends/backend_svg.py
===================================================================
--- branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-12-05
20:28:28 UTC (rev 4633)
+++ branches/transforms/lib/matplotlib/backends/backend_svg.py 2007-12-05
21:13:46 UTC (rev 4634)
@@ -6,7 +6,7 @@
from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\
FigureManagerBase, FigureCanvasBase
from matplotlib.backends.backend_mixed import MixedModeRenderer
-from matplotlib.cbook import is_string_like, is_writable_file_like
+from matplotlib.cbook import is_string_like, is_writable_file_like, maxdict
from matplotlib.colors import rgb2hex
from matplotlib.figure import Figure
from matplotlib.font_manager import findfont, FontProperties
@@ -30,6 +30,7 @@
_capstyle_d = {'projecting' : 'square', 'butt' : 'butt', 'round': 'round',}
class RendererSVG(RendererBase):
FONT_SCALE = 100.0
+ fontd = maxdict(50)
def __init__(self, width, height, svgwriter, basename=None):
self.width=width
@@ -46,7 +47,6 @@
self._markers = {}
self._path_collection_id = 0
self.mathtext_parser = MathTextParser('SVG')
- self.fontd = {}
svgwriter.write(svgProlog%(width,height,width,height))
def _draw_svg_element(self, element, details, gc, rgbFace):
@@ -59,13 +59,16 @@
style = self._get_style(gc, rgbFace)
self._svgwriter.write ('<%s style="%s" %s %s/>\n' % (
element, style, clippath, details))
-
+
def _get_font(self, prop):
key = hash(prop)
font = self.fontd.get(key)
if font is None:
fname = findfont(prop)
- font = FT2Font(str(fname))
+ font = self.fontd.get(fname)
+ if font is None:
+ font = FT2Font(str(fname))
+ self.fontd[fname] = font
self.fontd[key] = font
font.clear()
size = prop.get_size_in_points()
@@ -119,7 +122,7 @@
path = '<rect x="%(x)s" y="%(y)s" width="%(w)s" height="%(h)s"/>'
% locals()
else:
return None
-
+
id = self._clipd.get(path)
if id is None:
id = 'p%x' % len(self._clipd)
@@ -154,7 +157,7 @@
Affine2D()
.scale(1.0, -1.0)
.translate(0.0, self.height))
-
+
def _convert_path(self, path, transform):
tpath = transform.transform_path(path)
@@ -174,7 +177,7 @@
appender(segment)
currpos += len(segment)
return ''.join(path_data)
-
+
def draw_path(self, gc, path, transform, rgbFace=None):
trans_and_flip = self._make_flip_transform(transform)
path_data = self._convert_path(path, trans_and_flip)
@@ -182,7 +185,7 @@
def draw_markers(self, gc, marker_path, marker_trans, path, trans,
rgbFace=None):
write = self._svgwriter.write
-
+
key = self._convert_path(marker_path, marker_trans +
Affine2D().scale(1.0, -1.0))
name = self._markers.get(key)
if name is None:
@@ -201,7 +204,7 @@
offsetTrans, facecolors, edgecolors, linewidths,
linestyles, antialiaseds):
write = self._svgwriter.write
-
+
path_codes = []
write('<defs>\n')
for i, (path, transform) in enumerate(self._iter_collection_raw_paths(
@@ -212,7 +215,7 @@
write('<path id="%s" d="%s"/>\n' % (name, d))
path_codes.append(name)
write('</defs>\n')
-
+
for xo, yo, path_id, gc, rgbFace in self._iter_collection(
path_codes, cliprect, clippath, clippath_trans,
offsets, offsetTrans, facecolors, edgecolors,
@@ -221,7 +224,7 @@
self._draw_svg_element('use', details, gc, rgbFace)
self._path_collection_id += 1
-
+
def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None):
# MGDTODO: Support clippath here
trans = [1,0,0,1,0,0]
@@ -288,7 +291,7 @@
font = self._get_font(prop)
font.set_text(s, 0.0, flags=LOAD_NO_HINTING)
y -= font.get_descent() / 64.0
-
+
fontsize = prop.get_size_in_points()
color = rgb2hex(gc.get_rgb()[:3])
@@ -429,7 +432,7 @@
for font, fontsize, thetext, new_x, new_y_mtc, metrics in
svg_glyphs:
new_y = - new_y_mtc
style = "font-size: %f; font-family: %s" % (fontsize,
font.family_name)
-
+
svg.append('<tspan style="%s"' % style)
xadvance = metrics.advance
svg.append(' textLength="%s"' % xadvance)
@@ -503,14 +506,20 @@
'svgz': 'Scalable Vector Graphics'}
def print_svg(self, filename, *args, **kwargs):
- svgwriter = codecs.open(filename, 'w', 'utf-8')
- return self._print_svg(filename, svgwriter)
+ if is_string_like(filename):
+ fh_to_close = svgwriter = codecs.open(filename, 'w', 'utf-8')
+ elif is_writable_file_like(filename):
+ svgwriter = codecs.EncodedFile(filename, 'utf-8')
+ fh_to_close = None
+ else:
+ raise ValueError("filename must be a path or a file-like object")
+ return self._print_svg(filename, svgwriter, fh_to_close)
def print_svgz(self, filename, *args, **kwargs):
gzipwriter = gzip.GzipFile(filename, 'w')
svgwriter = codecs.EncodedFile(gzipwriter, 'utf-8')
return self._print_svg(filename, svgwriter)
-
+
def _print_svg(self, filename, svgwriter, fh_to_close=None):
self.figure.set_dpi(72.0)
width, height = self.figure.get_size_inches()
@@ -522,10 +531,10 @@
renderer.finalize()
if fh_to_close is not None:
svgwriter.close()
-
+
def get_default_filetype(self):
return 'svg'
-
+
class FigureManagerSVG(FigureManagerBase):
pass
Modified: branches/transforms/lib/matplotlib/figure.py
===================================================================
--- branches/transforms/lib/matplotlib/figure.py 2007-12-05 20:28:28 UTC
(rev 4633)
+++ branches/transforms/lib/matplotlib/figure.py 2007-12-05 21:13:46 UTC
(rev 4634)
@@ -165,27 +165,36 @@
def autofmt_xdate(self, bottom=0.2, rotation=30, ha='right'):
"""
- A common use case is a number of subplots with shared xaxes
- where the x-axis is date data. The ticklabels are often
- long,and it helps to rotate them on the bottom subplot and
- turn them off on other subplots. This function will raise a
- RuntimeError if any of the Axes are not Subplots.
+ Date ticklabels often overlap, so it is useful to rotate them
+ and right align them. Also, a common use case is a number of
+ subplots with shared xaxes where the x-axis is date data. The
+ ticklabels are often long, and it helps to rotate them on the
+ bottom subplot and turn them off on other subplots, as well as
+ turn off xlabels.
+
bottom : the bottom of the subplots for subplots_adjust
rotation: the rotation of the xtick labels
ha : the horizontal alignment of the xticklabels
"""
- for ax in self.get_axes():
- if not hasattr(ax, 'is_last_row'):
- raise RuntimeError('Axes must be subplot instances; found
%s'%type(ax))
- if ax.is_last_row():
- for label in ax.get_xticklabels():
- label.set_ha(ha)
- label.set_rotation(rotation)
- else:
- for label in ax.get_xticklabels():
- label.set_visible(False)
- if not self._autoLayout:
+ allsubplots = npy.alltrue([hasattr(ax, 'is_last_row') for ax in
self.axes])
+ if len(self.axes)==1:
+ for label in ax.get_xticklabels():
+ label.set_ha(ha)
+ label.set_rotation(rotation)
+ else:
+ if allsubplots:
+ for ax in self.get_axes():
+ if ax.is_last_row():
+ for label in ax.get_xticklabels():
+ label.set_ha(ha)
+ label.set_rotation(rotation)
+ else:
+ for label in ax.get_xticklabels():
+ label.set_visible(False)
+ ax.set_xlabel('')
+
+ if allsubplots and not self._autoLayout:
self.subplots_adjust(bottom=bottom)
def get_children(self):
Modified: branches/transforms/lib/matplotlib/font_manager.py
===================================================================
--- branches/transforms/lib/matplotlib/font_manager.py 2007-12-05 20:28:28 UTC
(rev 4633)
+++ branches/transforms/lib/matplotlib/font_manager.py 2007-12-05 21:13:46 UTC
(rev 4634)
@@ -36,7 +36,7 @@
import os, sys, glob
from sets import Set
import matplotlib
-from matplotlib import afm
+from matplotlib import afm
from matplotlib import ft2font
from matplotlib import rcParams, get_configdir
from matplotlib.cbook import is_string_like
@@ -49,7 +49,7 @@
import pickle
USE_FONTCONFIG = False
-
+
verbose = matplotlib.verbose
font_scalings = {'xx-small': 0.579, 'x-small': 0.694, 'small': 0.833,
@@ -98,7 +98,7 @@
def get_fontext_synonyms(fontext):
return {'ttf': ('ttf', 'otf'),
'afm': ('afm',)}[fontext]
-
+
def win32FontDirectory():
"""Return the user-specified font directory for Win32."""
@@ -126,7 +126,7 @@
directory = win32FontDirectory()
fontext = get_fontext_synonyms(fontext)
-
+
key, items = None, {}
for fontdir in MSFontDirectories:
try:
@@ -178,7 +178,7 @@
directory = OSXFontDirectory()
fontext = get_fontext_synonyms(fontext)
-
+
files = []
for path in directory:
if fontext is None:
@@ -214,7 +214,7 @@
return {}
fontext = get_fontext_synonyms(fontext)
-
+
fontfiles = {}
status, output = commands.getstatusoutput("fc-list file")
if status == 0:
@@ -236,7 +236,7 @@
"""
fontfiles = {}
fontexts = get_fontext_synonyms(fontext)
-
+
if fontpaths is None:
if sys.platform == 'win32':
fontdir = win32FontDirectory()
@@ -635,7 +635,7 @@
stretch = [rcParams['font.stretch']]
size = [rcParams['font.size']]
file = None
-
+
def __init__(self,
family = None,
style = None,
@@ -653,7 +653,7 @@
if _init is not None:
self.__props.__dict__.update(_init)
return
-
+
if is_string_like(family):
# Treat family as a fontconfig pattern if it is the only
# parameter provided.
@@ -674,16 +674,16 @@
self.set_stretch(stretch)
self.set_file(fname)
self.set_size(size)
-
+
def _parse_fontconfig_pattern(self, pattern):
return parse_fontconfig_pattern(pattern)
def __hash__(self):
- return hash(repr(self.__props))
+ return hash(repr(self.__props.__dict__))
def __str__(self):
return self.get_fontconfig_pattern()
-
+
def get_family(self):
"""Return a list of font names that comprise the font family.
"""
@@ -727,7 +727,7 @@
def get_fontconfig_pattern(self):
return generate_fontconfig_pattern(self.__props.__dict__)
-
+
def set_family(self, family):
"""
Change the font family. May be either an alias (generic name
@@ -741,7 +741,7 @@
family = [family]
self.__props.family = family
set_name = set_family
-
+
def set_style(self, style):
"""Set the font style. Values are: normal, italic or oblique."""
if style is None:
@@ -812,7 +812,7 @@
def add_property_pair(self, key, val):
self.__props.setdefault(key, []).append(val)
-
+
def copy(self):
"""Return a deep copy of self"""
return FontProperties(_init = self.__props.__dict__)
@@ -862,7 +862,7 @@
def __init__(self, size=None, weight='normal'):
self.__default_weight = weight
self.default_size = size
-
+
paths = [os.path.join(rcParams['datapath'],'fonts','ttf'),
os.path.join(rcParams['datapath'],'fonts','afm')]
@@ -1076,8 +1076,8 @@
_is_opentype_cff_font_cache[filename] = result
return result
return False
-
-
+
+
if USE_FONTCONFIG and sys.platform != 'win32':
import re
@@ -1095,7 +1095,7 @@
_fc_match_regex = re.compile(r'\sfile:\s+"([^"]*)"')
_fc_match_cache = {}
-
+
def findfont(prop, fontext='ttf'):
if not is_string_like(prop):
prop = prop.get_fontconfig_pattern()
Modified: branches/transforms/lib/matplotlib/mlab.py
===================================================================
--- branches/transforms/lib/matplotlib/mlab.py 2007-12-05 20:28:28 UTC (rev
4633)
+++ branches/transforms/lib/matplotlib/mlab.py 2007-12-05 21:13:46 UTC (rev
4634)
@@ -2367,7 +2367,7 @@
xlstyle.num_format_str = '#,##;[RED]-#,##'
elif isinstance(format, FormatPercent):
zeros = ''.join(['0']*format.precision)
- xlstyle.num_format_str = '0.%s%;[RED]-0.%s%'%(zeros, zeros)
+ xlstyle.num_format_str = '0.%s%%;[RED]-0.%s%%'%(zeros, zeros)
format.scale = 1.
else:
xlstyle = None
@@ -2376,12 +2376,14 @@
return format
- def rec2excel(r, ws, formatd=None, rownum=0):
+ def rec2excel(r, ws, formatd=None, rownum=0, colnum=0):
"""
save record array r to excel pyExcelerator worksheet ws
starting at rownum. if ws is string like, assume it is a
filename and save to it
+ start writing at rownum, colnum
+
formatd is a dictionary mapping dtype name -> FormatXL instances
The next rownum after writing is returned
@@ -2399,6 +2401,12 @@
formatd = dict()
formats = []
+ font = excel.Font()
+ font.bold = True
+
+ stylehdr = excel.XFStyle()
+ stylehdr.font = font
+
for i, name in enumerate(r.dtype.names):
dt = r.dtype[name]
format = formatd.get(name)
@@ -2406,7 +2414,7 @@
format = defaultformatd.get(dt.type, FormatObj())
format = xlformat_factory(format)
- ws.write(rownum, i, name)
+ ws.write(rownum, colnum+i, name, stylehdr)
formats.append(format)
rownum+=1
@@ -2419,12 +2427,12 @@
format = formats[i]
val = format.toval(val)
if format.xlstyle is None:
- ws.write(rownum, i, val)
+ ws.write(rownum, colnum+i, val)
else:
if safe_isnan(val):
- ws.write(rownum, i, 'NaN')
+ ws.write(rownum, colnum+i, 'NaN')
else:
- ws.write(rownum, i, val, format.xlstyle)
+ ws.write(rownum, colnum+i, val, format.xlstyle)
rownum += 1
if autosave:
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell. From the desktop to the data center, Linux is going
mainstream. Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins