You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(115) |
Aug
(120) |
Sep
(137) |
Oct
(170) |
Nov
(461) |
Dec
(263) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(120) |
Feb
(74) |
Mar
(35) |
Apr
(74) |
May
(245) |
Jun
(356) |
Jul
(240) |
Aug
(115) |
Sep
(78) |
Oct
(225) |
Nov
(98) |
Dec
(271) |
2009 |
Jan
(132) |
Feb
(84) |
Mar
(74) |
Apr
(56) |
May
(90) |
Jun
(79) |
Jul
(83) |
Aug
(296) |
Sep
(214) |
Oct
(76) |
Nov
(82) |
Dec
(66) |
2010 |
Jan
(46) |
Feb
(58) |
Mar
(51) |
Apr
(77) |
May
(58) |
Jun
(126) |
Jul
(128) |
Aug
(64) |
Sep
(50) |
Oct
(44) |
Nov
(48) |
Dec
(54) |
2011 |
Jan
(68) |
Feb
(52) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
1
(8) |
2
|
3
|
4
(1) |
5
(2) |
6
(7) |
7
(3) |
8
(7) |
9
(3) |
10
(2) |
11
(4) |
12
(9) |
13
|
14
|
15
|
16
|
17
(5) |
18
(1) |
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
|
|
|
|
|
From: <wea...@us...> - 2011-02-18 19:28:35
|
Revision: 8988 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8988&view=rev Author: weathergod Date: 2011-02-18 19:28:29 +0000 (Fri, 18 Feb 2011) Log Message: ----------- scatter() now supports empty arrays as input (i.e., scatter([], []) is now valid). Enabling this required fixes in both scatter() and in collections.py. Collections now support empty versions of themselves more correctly due to these fixes. Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/lib/matplotlib/axes.py trunk/matplotlib/lib/matplotlib/collections.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2011-02-17 16:44:28 UTC (rev 8987) +++ trunk/matplotlib/CHANGELOG 2011-02-18 19:28:29 UTC (rev 8988) @@ -1,3 +1,6 @@ +2011-02-18 scatter([], []) is now valid. Also fixed issues + with empty collections - BVR + 2011-02-07 Quick workaround for dviread bug #3175113 - JKS 2011-02-05 Add cbook memory monitoring for Windows, using Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2011-02-17 16:44:28 UTC (rev 8987) +++ trunk/matplotlib/lib/matplotlib/axes.py 2011-02-18 19:28:29 UTC (rev 8988) @@ -5832,24 +5832,17 @@ else: collection.autoscale_None() - temp_x = x - temp_y = y - - minx = np.amin(temp_x) - maxx = np.amax(temp_x) - miny = np.amin(temp_y) - maxy = np.amax(temp_y) - - w = maxx-minx - h = maxy-miny - # the pad is a little hack to deal with the fact that we don't # want to transform all the symbols whose scales are in points # to data coords to get the exact bounding box for efficiency # reasons. It can be done right if this is deemed important - padx, pady = 0.05*w, 0.05*h - corners = (minx-padx, miny-pady), (maxx+padx, maxy+pady) - self.update_datalim( corners) + # Also, only bother with this padding if there is anything to draw. + if self._xmargin < 0.05 and x.size > 0 : + self.set_xmargin(0.05) + + if self._ymargin < 0.05 and x.size > 0 : + self.set_ymargin(0.05) + self.autoscale_view() # add the collection last Modified: trunk/matplotlib/lib/matplotlib/collections.py =================================================================== --- trunk/matplotlib/lib/matplotlib/collections.py 2011-02-17 16:44:28 UTC (rev 8987) +++ trunk/matplotlib/lib/matplotlib/collections.py 2011-02-18 19:28:29 UTC (rev 8988) @@ -59,6 +59,8 @@ scalar mappable will be made to set the face colors. """ _offsets = np.array([], np.float_) + # _offsets must be a Nx2 array! + _offsets.shape = (0, 2) _transOffset = transforms.IdentityTransform() _transforms = [] @@ -95,10 +97,11 @@ self._uniform_offsets = None self._offsets = np.array([], np.float_) + # Force _offsets to be Nx2 + self._offsets.shape = (0, 2) if offsets is not None: offsets = np.asarray(offsets) - if len(offsets.shape) == 1: - offsets = offsets[np.newaxis,:] # Make it Nx2. + offsets.shape = (-1, 2) # Make it Nx2 if transOffset is not None: self._offsets = offsets self._transOffset = transOffset @@ -148,13 +151,17 @@ transOffset = self._transOffset offsets = self._offsets paths = self.get_paths() + + if not transform.is_affine: paths = [transform.transform_path_non_affine(p) for p in paths] transform = transform.get_affine() if not transOffset.is_affine: offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() + offsets = np.asarray(offsets, np.float_) + offsets.shape = (-1, 2) # Make it Nx2 result = mpath.get_path_collection_extents( transform.frozen(), paths, self.get_transforms(), @@ -176,6 +183,7 @@ offsets = self._offsets paths = self.get_paths() + if self.have_units(): paths = [] for path in self.get_paths(): @@ -184,17 +192,19 @@ xs = self.convert_xunits(xs) ys = self.convert_yunits(ys) paths.append(mpath.Path(zip(xs, ys), path.codes)) - if len(self._offsets): - xs = self.convert_xunits(self._offsets[:,0]) - ys = self.convert_yunits(self._offsets[:,1]) + + if offsets.size > 0: + xs = self.convert_xunits(offsets[:,0]) + ys = self.convert_yunits(offsets[:,1]) offsets = zip(xs, ys) offsets = np.asarray(offsets, np.float_) + offsets.shape = (-1, 2) # Make it Nx2 if not transform.is_affine: paths = [transform.transform_path_non_affine(path) for path in paths] transform = transform.get_affine() - if not transOffset.is_affine: + if not transOffset.is_affine : offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() @@ -258,8 +268,7 @@ ACCEPTS: float or sequence of floats """ offsets = np.asarray(offsets, np.float_) - if len(offsets.shape) == 1: - offsets = offsets[np.newaxis,:] # Make it Nx2. + offsets.shape = (-1, 2) # Make it Nx2 #This decision is based on how they are initialized above if self._uniform_offsets is None: self._offsets = offsets @@ -1221,6 +1230,7 @@ offsets = zip(xs, ys) offsets = np.asarray(offsets, np.float_) + offsets.shape = (-1, 2) # Make it Nx2 self.update_scalarmappable() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-17 16:44:34
|
Revision: 8987 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8987&view=rev Author: jswhit Date: 2011-02-17 16:44:28 +0000 (Thu, 17 Feb 2011) Log Message: ----------- update Modified Paths: -------------- trunk/toolkits/basemap/Changelog Modified: trunk/toolkits/basemap/Changelog =================================================================== --- trunk/toolkits/basemap/Changelog 2011-02-17 15:51:17 UTC (rev 8986) +++ trunk/toolkits/basemap/Changelog 2011-02-17 16:44:28 UTC (rev 8987) @@ -2,6 +2,7 @@ * added lic_demo.py to examples (line integral convolution, requires scikit.vectorplot). * removed deprecated NetCDFFile. + * added zorder keyword to drawmapscale. version 1.0.1 (svn revision 8967) * regenerated C source with cython 0.14.1. * added new "allsky" example from Tom Loredo. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2011-02-17 15:51:23
|
Revision: 8986 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8986&view=rev Author: mdboom Date: 2011-02-17 15:51:17 +0000 (Thu, 17 Feb 2011) Log Message: ----------- Fix long Unicode characters in SVG backend (fixes mathtext_stixsans test on narrow Python builds.) Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py trunk/matplotlib/lib/matplotlib/mathtext.py Modified: trunk/matplotlib/lib/matplotlib/backends/backend_svg.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backends/backend_svg.py 2011-02-17 15:50:47 UTC (rev 8985) +++ trunk/matplotlib/lib/matplotlib/backends/backend_svg.py 2011-02-17 15:51:17 UTC (rev 8986) @@ -603,7 +603,7 @@ if rcParams['svg.embed_char_paths']: new_chars = [] for c in s: - path = self._add_char_def(prop, c) + path = self._add_char_def(prop, ord(c)) if path is not None: new_chars.append(path) if len(new_chars): @@ -628,7 +628,7 @@ lastgind = None currx = 0 for c in s: - charnum = self._get_char_def_id(prop, c) + charnum = self._get_char_def_id(prop, ord(c)) ccode = ord(c) gind = cmap.get(ccode) if gind is None: @@ -680,13 +680,13 @@ font = prop font.set_size(self.FONT_SCALE, 72) ps_name = font.get_sfnt()[(1,0,0,6)] - char_id = urllib.quote('%s-%d' % (ps_name, ord(char))) + char_id = urllib.quote('%s-%d' % (ps_name, char)) char_num = self._char_defs.get(char_id, None) if char_num is not None: return None path_data = [] - glyph = font.load_char(ord(char), flags=LOAD_NO_HINTING) + glyph = font.load_char(char, flags=LOAD_NO_HINTING) currx, curry = 0.0, 0.0 for step in glyph.path: if step[0] == 0: # MOVE_TO @@ -724,7 +724,7 @@ font = prop font.set_size(self.FONT_SCALE, 72) ps_name = font.get_sfnt()[(1,0,0,6)] - char_id = urllib.quote('%s-%d' % (ps_name, ord(char))) + char_id = urllib.quote('%s-%d' % (ps_name, char)) return self._char_defs[char_id] def _draw_mathtext(self, gc, x, y, s, prop, angle): @@ -742,8 +742,8 @@ if rcParams['svg.embed_char_paths']: new_chars = [] - for font, fontsize, thetext, new_x, new_y_mtc, metrics in svg_glyphs: - path = self._add_char_def(font, thetext) + for font, fontsize, char, new_x, new_y_mtc, metrics in svg_glyphs: + path = self._add_char_def(font, char) if path is not None: new_chars.append(path) if len(new_chars): @@ -760,8 +760,8 @@ svg.append('translate(%f,%f)' % (x, y)) svg.append('">\n') - for font, fontsize, thetext, new_x, new_y_mtc, metrics in svg_glyphs: - charid = self._get_char_def_id(font, thetext) + for font, fontsize, char, new_x, new_y_mtc, metrics in svg_glyphs: + charid = self._get_char_def_id(font, char) svg.append('<use xlink:href="#%s" transform="translate(%f,%f)scale(%f)"/>\n' % (charid, new_x, -new_y_mtc, fontsize / self.FONT_SCALE)) Modified: trunk/matplotlib/lib/matplotlib/mathtext.py =================================================================== --- trunk/matplotlib/lib/matplotlib/mathtext.py 2011-02-17 15:50:47 UTC (rev 8985) +++ trunk/matplotlib/lib/matplotlib/mathtext.py 2011-02-17 15:51:17 UTC (rev 8986) @@ -329,10 +329,9 @@ def render_glyph(self, ox, oy, info): oy = self.height - oy + info.offset - thetext = unichr_safe(info.num) self.svg_glyphs.append( - (info.font, info.fontsize, thetext, ox, oy, info.metrics)) + (info.font, info.fontsize, info.num, ox, oy, info.metrics)) def render_rect_filled(self, x1, y1, x2, y2): self.svg_rects.append( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2011-02-17 15:50:53
|
Revision: 8985 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8985&view=rev Author: mdboom Date: 2011-02-17 15:50:47 +0000 (Thu, 17 Feb 2011) Log Message: ----------- Update image_interps.pdf baseline image. Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf Modified: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2011-02-17 15:50:16
|
Revision: 8984 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8984&view=rev Author: mdboom Date: 2011-02-17 15:50:10 +0000 (Thu, 17 Feb 2011) Log Message: ----------- Adding canonical baseline images Added Paths: ----------- trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.pdf trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.png trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.svg Added: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.pdf =================================================================== (Binary files differ) Property changes on: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.pdf ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.png =================================================================== (Binary files differ) Property changes on: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.svg =================================================================== --- trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.svg (rev 0) +++ trunk/matplotlib/lib/matplotlib/tests/baseline_images/test_axes/canonical.svg 2011-02-17 15:50:10 UTC (rev 8984) @@ -0,0 +1,216 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Created with matplotlib (http://matplotlib.sourceforge.net/) --> +<svg width="576pt" height="432pt" viewBox="0 0 576 432" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + version="1.1" + id="svg1"> +<filter id="colorAdd"><feComposite in="SourceGraphic" in2="BackgroundImage" operator="arithmetic" k2="1" k3="1"/></filter> +<g id="figure1"> +<g id="patch1"> +<path style="fill: #ffffff; stroke: #ffffff; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M0.000000 432.000000L576.000000 432.000000L576.000000 0.000000 +L0.000000 0.000000z"/> +</g> +<g id="axes1"> +<g id="patch2"> +<path style="fill: #ffffff; opacity: 1.000000" d="M72.000000 388.800000L518.400000 388.800000L518.400000 43.200000 +L72.000000 43.200000z"/> +</g> +<g id="line2d1"> +<defs> + <clipPath id="p50431ccdcb28178602d99d9270004dde"> +<rect x="72.000000" y="43.200000" width="446.400000" height="345.600000"/> + </clipPath> +</defs><path style="fill: none; stroke: #0000ff; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" clip-path="url(#p50431ccdcb28178602d99d9270004dde)" d="M72.000000 388.800000L295.200000 216.000000L518.400000 43.200000"/> +</g> +<g id="matplotlib.axis1"> +<g id="xtick1"> +<g id="line2d2"> +<defs><path id="m30e32995789d870ad79a2e54c91cf9c6" d="M0.000000 0.000000L0.000000 -4.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="72.000000" y="388.800000"/> +</g></g> +<g id="line2d3"> +<defs><path id="m9281cae24120827b11d5ea8a7ad3e96b" d="M0.000000 0.000000L0.000000 4.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="72.000000" y="43.200000"/> +</g></g> +<g id="text1"> +<defs> +<path id="c_7a2040fe3b94fcd41d0a72c84e93b115" d="M31.781250 -66.406250q-7.609375 0.000000 -11.453125 7.500000q-3.828125 7.484375 -3.828125 22.531250q0.000000 14.984375 3.828125 22.484375q3.843750 7.500000 11.453125 7.500000q7.671875 0.000000 11.500000 -7.500000q3.843750 -7.500000 3.843750 -22.484375q0.000000 -15.046875 -3.843750 -22.531250q-3.828125 -7.500000 -11.500000 -7.500000M31.781250 -74.218750q12.265625 0.000000 18.734375 9.703125q6.468750 9.687500 6.468750 28.140625q0.000000 18.406250 -6.468750 28.109375q-6.468750 9.687500 -18.734375 9.687500q-12.250000 0.000000 -18.718750 -9.687500q-6.468750 -9.703125 -6.468750 -28.109375q0.000000 -18.453125 6.468750 -28.140625q6.468750 -9.703125 18.718750 -9.703125"/> +<path id="c_ed3e21196fb739f392806f09ca0594ef" d="M10.687500 -12.406250l10.312500 0.000000l0.000000 12.406250l-10.312500 0.000000z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(63.250000,401.706250)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick2"> +<g id="line2d4"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="183.600000" y="388.800000"/> +</g></g> +<g id="line2d5"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="183.600000" y="43.200000"/> +</g></g> +<g id="text2"> +<defs> +<path id="c_1260a2df50f305f3db244e29828f968e" d="M10.796875 -72.906250l38.718750 0.000000l0.000000 8.312500l-29.687500 0.000000l0.000000 17.859375q2.140625 -0.734375 4.281250 -1.093750q2.156250 -0.359375 4.312500 -0.359375q12.203125 0.000000 19.328125 6.687500q7.140625 6.687500 7.140625 18.109375q0.000000 11.765625 -7.328125 18.296875q-7.328125 6.515625 -20.656250 6.515625q-4.593750 0.000000 -9.359375 -0.781250q-4.750000 -0.781250 -9.828125 -2.343750l0.000000 -9.921875q4.390625 2.390625 9.078125 3.562500q4.687500 1.171875 9.906250 1.171875q8.453125 0.000000 13.375000 -4.437500q4.937500 -4.437500 4.937500 -12.062500q0.000000 -7.609375 -4.937500 -12.046875q-4.921875 -4.453125 -13.375000 -4.453125q-3.953125 0.000000 -7.890625 0.875000q-3.921875 0.875000 -8.015625 2.734375z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(174.975000,401.706250)scale(0.120000)"> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick3"> +<g id="line2d6"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="295.200000" y="388.800000"/> +</g></g> +<g id="line2d7"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="295.200000" y="43.200000"/> +</g></g> +<g id="text3"> +<defs> +<path id="c_42baa63129a918535c52adb20d687ea7" d="M12.406250 -8.296875l16.109375 0.000000l0.000000 -55.625000l-17.531250 3.515625l0.000000 -8.984375l17.437500 -3.515625l9.859375 0.000000l0.000000 64.609375l16.109375 0.000000l0.000000 8.296875l-41.984375 0.000000z"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(286.707812,401.706250)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick4"> +<g id="line2d8"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="406.800000" y="388.800000"/> +</g></g> +<g id="line2d9"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="406.800000" y="43.200000"/> +</g></g> +<g id="text4"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(398.432812,401.550000)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="xtick5"> +<g id="line2d10"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="518.400000" y="388.800000"/> +</g></g> +<g id="line2d11"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="518.400000" y="43.200000"/> +</g></g> +<g id="text5"> +<defs> +<path id="c_ed3f3ed3ebfbd18bcb9c012009a68ad1" d="M19.187500 -8.296875l34.421875 0.000000l0.000000 8.296875l-46.281250 0.000000l0.000000 -8.296875q5.609375 -5.812500 15.296875 -15.593750q9.703125 -9.796875 12.187500 -12.640625q4.734375 -5.312500 6.609375 -9.000000q1.890625 -3.687500 1.890625 -7.250000q0.000000 -5.812500 -4.078125 -9.468750q-4.078125 -3.671875 -10.625000 -3.671875q-4.640625 0.000000 -9.796875 1.609375q-5.140625 1.609375 -11.000000 4.890625l0.000000 -9.968750q5.953125 -2.390625 11.125000 -3.609375q5.187500 -1.218750 9.484375 -1.218750q11.328125 0.000000 18.062500 5.671875q6.734375 5.656250 6.734375 15.125000q0.000000 4.500000 -1.687500 8.531250q-1.671875 4.015625 -6.125000 9.484375q-1.218750 1.421875 -7.765625 8.187500q-6.531250 6.765625 -18.453125 18.921875"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(509.689062,401.706250)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +</g> +<g id="matplotlib.axis2"> +<g id="ytick1"> +<g id="line2d12"> +<defs><path id="m3400efa6b1638b3fea9e19e898273957" d="M0.000000 0.000000L4.000000 0.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="388.800000"/> +</g></g> +<g id="line2d13"> +<defs><path id="m20b58b2501143cb5e0a5e8f1ef6f1643" d="M0.000000 0.000000L-4.000000 0.000000"/></defs> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="388.800000"/> +</g></g> +<g id="text6"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(51.015625,393.167188)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick2"> +<g id="line2d14"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="302.400000"/> +</g></g> +<g id="line2d15"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="302.400000"/> +</g></g> +<g id="text7"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(51.265625,306.689062)scale(0.120000)"> +<use xlink:href="#c_42baa63129a918535c52adb20d687ea7"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick3"> +<g id="line2d16"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="216.000000"/> +</g></g> +<g id="line2d17"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="216.000000"/> +</g></g> +<g id="text8"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.578125,220.367188)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick4"> +<g id="line2d18"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="129.600000"/> +</g></g> +<g id="line2d19"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="129.600000"/> +</g></g> +<g id="text9"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.828125,133.967188)scale(0.120000)"> +<use xlink:href="#c_ed3f3ed3ebfbd18bcb9c012009a68ad1"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_1260a2df50f305f3db244e29828f968e" x="95.410156"/> +</g> +</g> +</g> +<g id="ytick5"> +<g id="line2d20"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="43.200000"/> +</g></g> +<g id="line2d21"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="43.200000"/> +</g></g> +<g id="text10"> +<defs> +<path id="c_3dcfa38a02242cb63ec6726c6e70be7a" d="M40.578125 -39.312500q7.078125 1.515625 11.046875 6.312500q3.984375 4.781250 3.984375 11.812500q0.000000 10.781250 -7.421875 16.703125q-7.421875 5.906250 -21.093750 5.906250q-4.578125 0.000000 -9.437500 -0.906250q-4.859375 -0.906250 -10.031250 -2.718750l0.000000 -9.515625q4.093750 2.390625 8.968750 3.609375q4.890625 1.218750 10.218750 1.218750q9.265625 0.000000 14.125000 -3.656250q4.859375 -3.656250 4.859375 -10.640625q0.000000 -6.453125 -4.515625 -10.078125q-4.515625 -3.640625 -12.562500 -3.640625l-8.500000 0.000000l0.000000 -8.109375l8.890625 0.000000q7.265625 0.000000 11.125000 -2.906250q3.859375 -2.906250 3.859375 -8.375000q0.000000 -5.609375 -3.984375 -8.609375q-3.968750 -3.015625 -11.390625 -3.015625q-4.062500 0.000000 -8.703125 0.890625q-4.640625 0.875000 -10.203125 2.718750l0.000000 -8.781250q5.625000 -1.562500 10.531250 -2.343750q4.906250 -0.781250 9.250000 -0.781250q11.234375 0.000000 17.765625 5.109375q6.546875 5.093750 6.546875 13.781250q0.000000 6.062500 -3.468750 10.234375q-3.468750 4.171875 -9.859375 5.781250"/> +</defs> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.625000,47.567187)scale(0.120000)"> +<use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a"/> +<use xlink:href="#c_ed3e21196fb739f392806f09ca0594ef" x="63.623047"/> +<use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="95.410156"/> +</g> +</g> +</g> +</g> +<g id="patch3"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M72.000000 43.200000L518.400000 43.200000"/> +</g> +<g id="patch4"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M518.400000 388.800000L518.400000 43.200000"/> +</g> +<g id="patch5"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M72.000000 388.800000L518.400000 388.800000"/> +</g> +<g id="patch6"> +<path style="fill: none; stroke: #000000; stroke-width: 1.000000; stroke-linejoin: round; stroke-linecap: square; opacity: 1.000000" d="M72.000000 388.800000L72.000000 43.200000"/> +</g> +</g> +</g> +</svg> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-17 04:33:40
|
Revision: 8983 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8983&view=rev Author: jswhit Date: 2011-02-17 04:33:34 +0000 (Thu, 17 Feb 2011) Log Message: ----------- include zorder keyword for drawmapscale. Modified Paths: -------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2011-02-12 16:10:15 UTC (rev 8982) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2011-02-17 04:33:34 UTC (rev 8983) @@ -3454,7 +3454,7 @@ def drawmapscale(self,lon,lat,lon0,lat0,length,barstyle='simple',\ units='km',fontsize=9,yoffset=None,labelstyle='simple',\ fontcolor='k',fillcolor1='w',fillcolor2='k',ax=None,\ - format='%d'): + format='%d',zorder=None): """ Draw a map scale at ``lon,lat`` of length ``length`` representing distance in the map @@ -3487,6 +3487,7 @@ fillcolor1(2) colors of the alternating filled regions (default white and black). Only relevant for 'fancy' barstyle. + zorder sets the zorder for the map scale. ============== ==================================================== Extra keyword ``ax`` can be used to override the default axis instance. @@ -3625,6 +3626,8 @@ fontsize=fontsize,color=fontcolor)) else: raise KeyError("barstyle must be 'simple' or 'fancy'") + if zorder is not None: + rets = [ret.set_zorder(zorder) for ret in rets] return rets def nightshade(self,date,color="k",delta=0.25,alpha=0.5,ax=None,zorder=2): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 16:10:21
|
Revision: 8982 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8982&view=rev Author: jswhit Date: 2011-02-12 16:10:15 +0000 (Sat, 12 Feb 2011) Log Message: ----------- add comments. Modified Paths: -------------- trunk/toolkits/basemap/examples/lic_demo.py Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 16:08:44 UTC (rev 8981) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 16:10:15 UTC (rev 8982) @@ -8,7 +8,7 @@ try: from scikits.vectorplot import lic_internal except ImportError: - raise ImportError('need vectorplot scikit for this example') + raise ImportError('need vectorplot scikit for this example') # H*wind data from http://www.aoml.noaa.gov/hrd/data_sub/wind.html ncfile = NetCDFFile('rita.nc') @@ -20,7 +20,7 @@ lons, lats = np.meshgrid(lons1,lats1) ncfile.close() -# downsample to finer grid. +# downsample to finer grid for nicer looking plot. nlats = 2*udat.shape[0]; nlons = 2*udat.shape[1] lons = np.linspace(lons1[0],lons1[-1],nlons) lats = np.linspace(lats1[0],lats1[-1],nlats) @@ -31,11 +31,13 @@ fig = plt.figure(figsize=(8,8)) m = Basemap(projection='cyl',llcrnrlat=lats1[0],llcrnrlon=lons1[0],urcrnrlat=lats1[-1],urcrnrlon=lons1[-1],resolution='i') +# pass texture, kernel and data to LIC function from vectorplot. kernellen=31 texture = np.random.rand(udat.shape[0],udat.shape[1]).astype(np.float32) kernel = np.sin(np.arange(kernellen)*np.pi/kernellen).astype(np.float32) image = lic_internal.line_integral_convolution(udat.astype(np.float32),\ vdat.astype(np.float32), texture, kernel) +# plot the resulting image. im = m.imshow(image,plt.cm.gist_stern) m.drawcoastlines() m.drawmeridians(np.arange(-120,-60,2),labels=[0,0,0,1]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 16:08:50
|
Revision: 8981 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8981&view=rev Author: jswhit Date: 2011-02-12 16:08:44 +0000 (Sat, 12 Feb 2011) Log Message: ----------- interpolate to finer grid for nicer looking plot Modified Paths: -------------- trunk/toolkits/basemap/examples/lic_demo.py Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 16:01:55 UTC (rev 8980) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 16:08:44 UTC (rev 8981) @@ -2,7 +2,7 @@ # flow field (from Hurricane Earl). Produces something akin to streamlines. # Requires vectorplot scikit (http://scikits.appspot.com/vectorplot). from netCDF4 import Dataset as NetCDFFile -from mpl_toolkits.basemap import Basemap +from mpl_toolkits.basemap import Basemap, interp import numpy as np import matplotlib.pyplot as plt try: @@ -20,7 +20,15 @@ lons, lats = np.meshgrid(lons1,lats1) ncfile.close() +# downsample to finer grid. +nlats = 2*udat.shape[0]; nlons = 2*udat.shape[1] +lons = np.linspace(lons1[0],lons1[-1],nlons) +lats = np.linspace(lats1[0],lats1[-1],nlats) +lons, lats = np.meshgrid(lons, lats) +udat = interp(udat,lons1,lats1,lons,lats,order=3) +vdat = interp(vdat,lons1,lats1,lons,lats,order=3) + fig = plt.figure(figsize=(8,8)) m = Basemap(projection='cyl',llcrnrlat=lats1[0],llcrnrlon=lons1[0],urcrnrlat=lats1[-1],urcrnrlon=lons1[-1],resolution='i') kernellen=31 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 16:02:02
|
Revision: 8980 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8980&view=rev Author: jswhit Date: 2011-02-12 16:01:55 +0000 (Sat, 12 Feb 2011) Log Message: ----------- obsolete file. Removed Paths: ------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/pupynere.py Deleted: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/pupynere.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/pupynere.py 2011-02-12 14:01:34 UTC (rev 8979) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/pupynere.py 2011-02-12 16:01:55 UTC (rev 8980) @@ -1,688 +0,0 @@ -""" -NetCDF reader/writer module. - -This module implements the Scientific.IO.NetCDF API to read and create -NetCDF files. The same API is also used in the PyNIO and pynetcdf -modules, allowing these modules to be used interchangebly when working -with NetCDF files. The major advantage of ``scipy.io.netcdf`` over other -modules is that it doesn't require the code to be linked to the NetCDF -libraries as the other modules do. - -The code is based on the `NetCDF file format specification -<http://www.unidata.ucar.edu/software/netcdf/guide_15.html>`_. A NetCDF -file is a self-describing binary format, with a header followed by -data. The header contains metadata describing dimensions, variables -and the position of the data in the file, so access can be done in an -efficient manner without loading unnecessary data into memory. We use -the ``mmap`` module to create Numpy arrays mapped to the data on disk, -for the same purpose. - -The structure of a NetCDF file is as follows: - - C D F <VERSION BYTE> <NUMBER OF RECORDS> - <DIMENSIONS> <GLOBAL ATTRIBUTES> <VARIABLES METADATA> - <NON-RECORD DATA> <RECORD DATA> - -Record data refers to data where the first axis can be expanded at -will. All record variables share a same dimension at the first axis, -and they are stored at the end of the file per record, ie - - A[0], B[0], ..., A[1], B[1], ..., etc, - -so that new data can be appended to the file without changing its original -structure. Non-record data are padded to a 4n bytes boundary. Record data -are also padded, unless there is exactly one record variable in the file, -in which case the padding is dropped. All data is stored in big endian -byte order. - -The Scientific.IO.NetCDF API allows attributes to be added directly to -instances of ``netcdf_file`` and ``netcdf_variable``. To differentiate -between user-set attributes and instance attributes, user-set attributes -are automatically stored in the ``_attributes`` attribute by overloading -``__setattr__``. This is the reason why the code sometimes uses -``obj.__dict__['key'] = value``, instead of simply ``obj.key = value``; -otherwise the key would be inserted into userspace attributes. - -To create a NetCDF file:: - - >>> import time - >>> f = netcdf_file('simple.nc', 'w') - >>> f.history = 'Created for a test' - >>> f.createDimension('time', 10) - >>> time = f.createVariable('time', 'i', ('time',)) - >>> time[:] = range(10) - >>> time.units = 'days since 2008-01-01' - >>> f.close() - -To read the NetCDF file we just created:: - - >>> f = netcdf_file('simple.nc', 'r') - >>> print f.history - Created for a test - >>> time = f.variables['time'] - >>> print time.units - days since 2008-01-01 - >>> print time.shape - (10,) - >>> print time[-1] - 9 - >>> f.close() - -TODO: properly implement ``_FillValue``. -""" - -__all__ = ['netcdf_file', 'netcdf_variable'] - - -from operator import mul -from mmap import mmap, ACCESS_READ - -from numpy import fromstring, ndarray, dtype, empty, array, asarray, squeeze,\ - zeros, ma -from numpy import little_endian as LITTLE_ENDIAN - - -ABSENT = '\x00\x00\x00\x00\x00\x00\x00\x00' -ZERO = '\x00\x00\x00\x00' -NC_BYTE = '\x00\x00\x00\x01' -NC_CHAR = '\x00\x00\x00\x02' -NC_SHORT = '\x00\x00\x00\x03' -NC_INT = '\x00\x00\x00\x04' -NC_FLOAT = '\x00\x00\x00\x05' -NC_DOUBLE = '\x00\x00\x00\x06' -NC_DIMENSION = '\x00\x00\x00\n' -NC_VARIABLE = '\x00\x00\x00\x0b' -NC_ATTRIBUTE = '\x00\x00\x00\x0c' - - -TYPEMAP = { NC_BYTE: ('b', 1), - NC_CHAR: ('c', 1), - NC_SHORT: ('h', 2), - NC_INT: ('i', 4), - NC_FLOAT: ('f', 4), - NC_DOUBLE: ('d', 8) } - -REVERSE = { 'b': NC_BYTE, - 'c': NC_CHAR, - 'h': NC_SHORT, - 'i': NC_INT, - 'f': NC_FLOAT, - 'd': NC_DOUBLE, - - # these come from asarray(1).dtype.char and asarray('foo').dtype.char, - # used when getting the types from generic attributes. - 'l': NC_INT, - 'S': NC_CHAR } - - -class netcdf_file(object): - """ - A ``netcdf_file`` object has two standard attributes: ``dimensions`` and - ``variables``. The values of both are dictionaries, mapping dimension - names to their associated lengths and variable names to variables, - respectively. Application programs should never modify these - dictionaries. - - All other attributes correspond to global attributes defined in the - NetCDF file. Global file attributes are created by assigning to an - attribute of the ``netcdf_file`` object. - - """ - def __init__(self, filename, mode='r', mmap=True, version=1,\ - maskandscale=False): - self.filename = filename - self.use_mmap = mmap - self.version_byte = version - self._maskandscale = maskandscale - - assert mode in 'rw', "Mode must be either 'r' or 'w'." - self.mode = mode - - self.dimensions = {} - self.variables = {} - - self._dims = [] - self._recs = 0 - self._recsize = 0 - - self.fp = open(self.filename, '%sb' % mode) - - self._attributes = {} - - if mode is 'r': - self._read() - - def __setattr__(self, attr, value): - # Store user defined attributes in a separate dict, - # so we can save them to file later. - try: - self._attributes[attr] = value - except AttributeError: - pass - self.__dict__[attr] = value - - def close(self): - if not self.fp.closed: - try: - self.flush() - finally: - self.fp.close() - __del__ = close - - def createDimension(self, name, length): - self.dimensions[name] = length - self._dims.append(name) - - def createVariable(self, name, type, dimensions): - shape = tuple([self.dimensions[dim] for dim in dimensions]) - shape_ = tuple([dim or 0 for dim in shape]) # replace None with 0 for numpy - - if isinstance(type, basestring): type = dtype(type) - typecode, size = type.char, type.itemsize - dtype_ = '>%s' % typecode - if size > 1: dtype_ += str(size) - - data = empty(shape_, dtype=dtype_) - self.variables[name] = netcdf_variable(data, typecode, shape,\ - dimensions, maskandscale=self._maskandscale) - return self.variables[name] - - def flush(self): - if self.mode is 'w': - self._write() - sync = flush - - def _write(self): - self.fp.write('CDF') - self.fp.write(array(self.version_byte, '>b').tostring()) - - # Write headers and data. - self._write_numrecs() - self._write_dim_array() - self._write_gatt_array() - self._write_var_array() - - def _write_numrecs(self): - # Get highest record count from all record variables. - for var in self.variables.values(): - if var.isrec and len(var.data) > self._recs: - self.__dict__['_recs'] = len(var.data) - self._pack_int(self._recs) - - def _write_dim_array(self): - if self.dimensions: - self.fp.write(NC_DIMENSION) - self._pack_int(len(self.dimensions)) - for name in self._dims: - self._pack_string(name) - length = self.dimensions[name] - self._pack_int(length or 0) # replace None with 0 for record dimension - else: - self.fp.write(ABSENT) - - def _write_gatt_array(self): - self._write_att_array(self._attributes) - - def _write_att_array(self, attributes): - if attributes: - self.fp.write(NC_ATTRIBUTE) - self._pack_int(len(attributes)) - for name, values in attributes.items(): - self._pack_string(name) - self._write_values(values) - else: - self.fp.write(ABSENT) - - def _write_var_array(self): - if self.variables: - self.fp.write(NC_VARIABLE) - self._pack_int(len(self.variables)) - - # Sort variables non-recs first, then recs. - variables = self.variables.items() - variables.sort(key=lambda (k, v): v._shape and not v.isrec) - variables.reverse() - variables = [k for (k, v) in variables] - - # Set the metadata for all variables. - for name in variables: - self._write_var_metadata(name) - # Now that we have the metadata, we know the vsize of - # each record variable, so we can calculate recsize. - self.__dict__['_recsize'] = sum([ - var._vsize for var in self.variables.values() - if var.isrec]) - # Set the data for all variables. - for name in variables: - self._write_var_data(name) - else: - self.fp.write(ABSENT) - - def _write_var_metadata(self, name): - var = self.variables[name] - - self._pack_string(name) - self._pack_int(len(var.dimensions)) - for dimname in var.dimensions: - dimid = self._dims.index(dimname) - self._pack_int(dimid) - - self._write_att_array(var._attributes) - - nc_type = REVERSE[var.typecode()] - self.fp.write(nc_type) - - if not var.isrec: - vsize = var.data.size * var.data.itemsize - vsize += -vsize % 4 - else: # record variable - try: - vsize = var.data[0].size * var.data.itemsize - except IndexError: - vsize = 0 - rec_vars = len([var for var in self.variables.values() - if var.isrec]) - if rec_vars > 1: - vsize += -vsize % 4 - self.variables[name].__dict__['_vsize'] = vsize - self._pack_int(vsize) - - # Pack a bogus begin, and set the real value later. - self.variables[name].__dict__['_begin'] = self.fp.tell() - self._pack_begin(0) - - def _write_var_data(self, name): - var = self.variables[name] - - # Set begin in file header. - the_beguine = self.fp.tell() - self.fp.seek(var._begin) - self._pack_begin(the_beguine) - self.fp.seek(the_beguine) - - # Write data. - if not var.isrec: - self.fp.write(var.data.tostring()) - count = var.data.size * var.data.itemsize - self.fp.write('0' * (var._vsize - count)) - else: # record variable - # Handle rec vars with shape[0] < nrecs. - if self._recs > len(var.data): - shape = (self._recs,) + var.data.shape[1:] - var.data.resize(shape) - - pos0 = pos = self.fp.tell() - for rec in var.data: - # Apparently scalars cannot be converted to big endian. If we - # try to convert a ``=i4`` scalar to, say, '>i4' the dtype - # will remain as ``=i4``. - if not rec.shape and (rec.dtype.byteorder == '<' or - (rec.dtype.byteorder == '=' and LITTLE_ENDIAN)): - rec = rec.byteswap() - self.fp.write(rec.tostring()) - # Padding - count = rec.size * rec.itemsize - self.fp.write('0' * (var._vsize - count)) - pos += self._recsize - self.fp.seek(pos) - self.fp.seek(pos0 + var._vsize) - - def _write_values(self, values): - values = asarray(values) - values = values.astype(values.dtype.newbyteorder('>')) - - nc_type = REVERSE[values.dtype.char] - self.fp.write(nc_type) - - if values.dtype.char == 'S': - nelems = values.itemsize - else: - nelems = values.size - self._pack_int(nelems) - - if not values.shape and (values.dtype.byteorder == '<' or - (values.dtype.byteorder == '=' and LITTLE_ENDIAN)): - values = values.byteswap() - self.fp.write(values.tostring()) - count = values.size * values.itemsize - self.fp.write('0' * (-count % 4)) # pad - - def _read(self): - # Check magic bytes and version - magic = self.fp.read(3) - assert magic == 'CDF', "Error: %s is not a valid NetCDF 3 file" % self.filename - self.__dict__['version_byte'] = fromstring(self.fp.read(1), '>b')[0] - - # Read file headers and set data. - self._read_numrecs() - self._read_dim_array() - self._read_gatt_array() - self._read_var_array() - - def _read_numrecs(self): - self.__dict__['_recs'] = self._unpack_int() - - def _read_dim_array(self): - header = self.fp.read(4) - assert header in [ZERO, NC_DIMENSION] - count = self._unpack_int() - - for dim in range(count): - name = self._unpack_string() - length = self._unpack_int() or None # None for record dimension - self.dimensions[name] = length - self._dims.append(name) # preserve order - - def _read_gatt_array(self): - for k, v in self._read_att_array().items(): - self.__setattr__(k, v) - - def _read_att_array(self): - header = self.fp.read(4) - assert header in [ZERO, NC_ATTRIBUTE] - count = self._unpack_int() - - attributes = {} - for attr in range(count): - name = self._unpack_string() - attributes[name] = self._read_values() - return attributes - - def _read_var_array(self): - header = self.fp.read(4) - assert header in [ZERO, NC_VARIABLE] - - begin = 0 - dtypes = {'names': [], 'formats': []} - rec_vars = [] - count = self._unpack_int() - for var in range(count): - name, dimensions, shape, attributes, typecode, size, dtype_, begin_, vsize = self._read_var() - if shape and shape[0] is None: - rec_vars.append(name) - self.__dict__['_recsize'] += vsize - if begin == 0: begin = begin_ - dtypes['names'].append(name) - dtypes['formats'].append(str(shape[1:]) + dtype_) - - # Handle padding with a virtual variable. - if typecode in 'bch': - actual_size = reduce(mul, (1,) + shape[1:]) * size - padding = -actual_size % 4 - if padding: - dtypes['names'].append('_padding_%d' % var) - dtypes['formats'].append('(%d,)>b' % padding) - - # Data will be set later. - data = None - else: - if self.use_mmap: - mm = mmap(self.fp.fileno(), begin_+vsize, access=ACCESS_READ) - data = ndarray.__new__(ndarray, shape, dtype=dtype_, - buffer=mm, offset=begin_, order=0) - else: - pos = self.fp.tell() - self.fp.seek(begin_) - data = fromstring(self.fp.read(vsize), dtype=dtype_) - data.shape = shape - self.fp.seek(pos) - - # Add variable. - self.variables[name] = netcdf_variable( - data, typecode, shape, dimensions, attributes, - maskandscale=self._maskandscale) - - if rec_vars: - # Remove padding when only one record variable. - if len(rec_vars) == 1: - dtypes['names'] = dtypes['names'][:1] - dtypes['formats'] = dtypes['formats'][:1] - - # Build rec array. - if self.use_mmap: - mm = mmap(self.fp.fileno(), begin+self._recs*self._recsize, access=ACCESS_READ) - rec_array = ndarray.__new__(ndarray, (self._recs,), dtype=dtypes, - buffer=mm, offset=begin, order=0) - else: - pos = self.fp.tell() - self.fp.seek(begin) - rec_array = fromstring(self.fp.read(self._recs*self._recsize), dtype=dtypes) - rec_array.shape = (self._recs,) - self.fp.seek(pos) - - for var in rec_vars: - self.variables[var].__dict__['data'] = rec_array[var] - - def _read_var(self): - name = self._unpack_string() - dimensions = [] - shape = [] - dims = self._unpack_int() - - for i in range(dims): - dimid = self._unpack_int() - dimname = self._dims[dimid] - dimensions.append(dimname) - dim = self.dimensions[dimname] - shape.append(dim) - dimensions = tuple(dimensions) - shape = tuple(shape) - - attributes = self._read_att_array() - nc_type = self.fp.read(4) - vsize = self._unpack_int() - begin = [self._unpack_int, self._unpack_int64][self.version_byte-1]() - - typecode, size = TYPEMAP[nc_type] - if typecode is 'c': - dtype_ = '>c' - else: - dtype_ = '>%s' % typecode - if size > 1: dtype_ += str(size) - - return name, dimensions, shape, attributes, typecode, size, dtype_, begin, vsize - - def _read_values(self): - nc_type = self.fp.read(4) - n = self._unpack_int() - - typecode, size = TYPEMAP[nc_type] - - count = n*size - values = self.fp.read(count) - self.fp.read(-count % 4) # read padding - - if typecode is not 'c': - values = fromstring(values, dtype='>%s%d' % (typecode, size)) - if values.shape == (1,): values = values[0] - else: - values = values.rstrip('\x00') - return values - - def _pack_begin(self, begin): - if self.version_byte == 1: - self._pack_int(begin) - elif self.version_byte == 2: - self._pack_int64(begin) - - def _pack_int(self, value): - self.fp.write(array(value, '>i').tostring()) - _pack_int32 = _pack_int - - def _unpack_int(self): - return fromstring(self.fp.read(4), '>i')[0] - _unpack_int32 = _unpack_int - - def _pack_int64(self, value): - self.fp.write(array(value, '>q').tostring()) - - def _unpack_int64(self): - return fromstring(self.fp.read(8), '>q')[0] - - def _pack_string(self, s): - count = len(s) - self._pack_int(count) - self.fp.write(s) - self.fp.write('0' * (-count % 4)) # pad - - def _unpack_string(self): - count = self._unpack_int() - s = self.fp.read(count).rstrip('\x00') - self.fp.read(-count % 4) # read padding - return s - - -class netcdf_variable(object): - """ - ``netcdf_variable`` objects are constructed by calling the method - ``createVariable`` on the netcdf_file object. - - ``netcdf_variable`` objects behave much like array objects defined in - Numpy, except that their data resides in a file. Data is read by - indexing and written by assigning to an indexed subset; the entire - array can be accessed by the index ``[:]`` or using the methods - ``getValue`` and ``assignValue``. ``netcdf_variable`` objects also - have attribute ``shape`` with the same meaning as for arrays, but - the shape cannot be modified. There is another read-only attribute - ``dimensions``, whose value is the tuple of dimension names. - - All other attributes correspond to variable attributes defined in - the NetCDF file. Variable attributes are created by assigning to an - attribute of the ``netcdf_variable`` object. - - """ - def __init__(self, data, typecode, shape, dimensions, attributes=None,\ - maskandscale=False): - self.data = data - self._typecode = typecode - self._shape = shape - self.dimensions = dimensions - self._maskandscale = maskandscale - - self._attributes = attributes or {} - for k, v in self._attributes.items(): - self.__dict__[k] = v - - def __setattr__(self, attr, value): - # Store user defined attributes in a separate dict, - # so we can save them to file later. - try: - self._attributes[attr] = value - except AttributeError: - pass - self.__dict__[attr] = value - - @property - def isrec(self): - return self.data.shape and not self._shape[0] - - @property - def shape(self): - return self.data.shape - - def __len__(self): - return self.data.shape[0] - - def getValue(self): - return self.data.item() - - def assignValue(self, value): - self.data.itemset(value) - - def typecode(self): - return self._typecode - - def __getitem__(self, index): - data = squeeze(self.data[index]) - if self._maskandscale: - return _unmaskandscale(self,data) - else: - return data - - def __setitem__(self, index, data): - if self._maskandscale: - data = _maskandscale(self,data) - # Expand data for record vars? - if self.isrec: - if isinstance(index, tuple): - rec_index = index[0] - else: - rec_index = index - if isinstance(rec_index, slice): - recs = (rec_index.start or 0) + len(data) - else: - recs = rec_index + 1 - if recs > len(self.data): - shape = (recs,) + self._shape[1:] - self.data.resize(shape) - self.data[index] = data - - -NetCDFFile = netcdf_file -NetCDFVariable = netcdf_variable - -# default _FillValue for netcdf types (apply also to corresponding -# DAP types). -_default_fillvals = {'c':'\0', - 'S':"", - 'b':-127, - 'B':-127, - 'h':-32767, - 'H':65535, - 'i':-2147483647L, - 'L':4294967295L, - 'q':-2147483647L, - 'f':9.9692099683868690e+36, - 'd':9.9692099683868690e+36} -def _unmaskandscale(var,data): - # if _maskandscale mode set to True, perform - # automatic unpacking using scale_factor/add_offset - # and automatic conversion to masked array using - # missing_value/_Fill_Value. - totalmask = zeros(data.shape, bool) - fill_value = None - if hasattr(var, 'missing_value') and (data == var.missing_value).any(): - mask=data==var.missing_value - fill_value = var.missing_value - totalmask += mask - if hasattr(var, '_FillValue') and (data == var._FillValue).any(): - mask=data==var._FillValue - if fill_value is None: - fill_value = var._FillValue - totalmask += mask - else: - fillval = _default_fillvals[var.typecode()] - if (data == fillval).any(): - mask=data==fillval - if fill_value is None: - fill_value = fillval - totalmask += mask - # all values where data == missing_value or _FillValue are - # masked. fill_value set to missing_value if it exists, - # otherwise _FillValue. - if fill_value is not None: - data = ma.masked_array(data,mask=totalmask,fill_value=fill_value) - # if variable has scale_factor and add_offset attributes, rescale. - if hasattr(var, 'scale_factor') and hasattr(var, 'add_offset'): - data = var.scale_factor*data + var.add_offset - return data - -def _maskandscale(var,data): - # if _maskandscale mode set to True, perform - # automatic packing using scale_factor/add_offset - # and automatic filling of masked arrays using - # missing_value/_Fill_Value. - # use missing_value as fill value. - # if no missing value set, use _FillValue. - if hasattr(data,'mask'): - if hasattr(var, 'missing_value'): - fillval = var.missing_value - elif hasattr(var, '_FillValue'): - fillval = var._FillValue - else: - fillval = _default_fillvals[var.typecode()] - data = data.filled(fill_value=fillval) - # pack using scale_factor and add_offset. - if hasattr(var, 'scale_factor') and hasattr(var, 'add_offset'): - data = (data - var.add_offset)/var.scale_factor - return data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 14:01:41
|
Revision: 8979 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8979&view=rev Author: jswhit Date: 2011-02-12 14:01:34 +0000 (Sat, 12 Feb 2011) Log Message: ----------- use netcdf4-python instead of built-in NetCDFFile. Modified Paths: -------------- trunk/toolkits/basemap/MANIFEST.in trunk/toolkits/basemap/examples/ccsm_popgrid.py trunk/toolkits/basemap/examples/fcstmaps.py trunk/toolkits/basemap/examples/fcstmaps_axesgrid.py trunk/toolkits/basemap/examples/lic_demo.py trunk/toolkits/basemap/examples/plothighsandlows.py trunk/toolkits/basemap/examples/ploticos.py trunk/toolkits/basemap/examples/plotprecip.py trunk/toolkits/basemap/examples/plotsst.py trunk/toolkits/basemap/examples/pnganim.py Removed Paths: ------------- trunk/toolkits/basemap/examples/NetCDFFile_tst.py Modified: trunk/toolkits/basemap/MANIFEST.in =================================================================== --- trunk/toolkits/basemap/MANIFEST.in 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/MANIFEST.in 2011-02-12 14:01:34 UTC (rev 8979) @@ -80,7 +80,6 @@ include examples/C02562.orog.nc include examples/ccsm_popgrid.nc include examples/rita.nc -include examples/NetCDFFile_tst.py include examples/maskoceans.py include examples/README include lib/mpl_toolkits/__init__.py Deleted: trunk/toolkits/basemap/examples/NetCDFFile_tst.py =================================================================== --- trunk/toolkits/basemap/examples/NetCDFFile_tst.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/NetCDFFile_tst.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -1,70 +0,0 @@ -import sys -import unittest -import os -import tempfile -from numpy import ma -from numpy.testing import assert_array_equal, assert_array_almost_equal -from numpy.random.mtrand import uniform -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile - -# test automatic conversion of masked arrays, and -# packing/unpacking of short ints. - -FILE_NAME = tempfile.mktemp(".nc") -ndim = 10 -ranarr = 100.*uniform(size=(ndim)) -packeddata = 10.*uniform(size=(ndim)) -missing_value = -9999. -ranarr[::2] = missing_value -maskedarr = ma.masked_values(ranarr,-9999.) -scale_factor = (packeddata.max()-packeddata.min())/(2.*32766.) -add_offset = 0.5*(packeddata.max()+packeddata.min()) -packeddata2 = ((packeddata-add_offset)/scale_factor).astype('i2') - -class TestCase(unittest.TestCase): - - def setUp(self): - self.file = FILE_NAME - file = NetCDFFile(self.file,'w') - file.createDimension('n', None) # use unlimited dim. - foo = file.createVariable('maskeddata', 'f8', ('n',)) - foo.missing_value = missing_value - bar = file.createVariable('packeddata', 'i2', ('n',)) - bar.scale_factor = scale_factor - bar.add_offset = add_offset - foo[0:ndim] = maskedarr - bar[0:ndim] = packeddata - file.close() - - def tearDown(self): - # Remove the temporary files - os.remove(self.file) - - def runTest(self): - """testing auto-conversion of masked arrays and packed integers""" - # no auto-conversion. - file = NetCDFFile(self.file,maskandscale=False) - datamasked = file.variables['maskeddata'] - datapacked = file.variables['packeddata'] - if hasattr(datapacked,'set_auto_maskandscale'): - datapacked.set_auto_maskandscale(False) - # check missing_value, scale_factor and add_offset attributes. - assert datamasked.missing_value == missing_value - assert datapacked.scale_factor == scale_factor - assert datapacked.add_offset == add_offset - assert_array_equal(datapacked[:],packeddata2) - assert_array_almost_equal(datamasked[:],ranarr) - file.close() - # auto-conversion - file = NetCDFFile(self.file) - datamasked = file.variables['maskeddata'] - datapacked = file.variables['packeddata'] - assert_array_almost_equal(datamasked[:].filled(datamasked.missing_value),ranarr) - assert_array_almost_equal(datapacked[:],packeddata,decimal=4) - file.close() - -if __name__ == '__main__': - unittest.main() Modified: trunk/toolkits/basemap/examples/ccsm_popgrid.py =================================================================== --- trunk/toolkits/basemap/examples/ccsm_popgrid.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/ccsm_popgrid.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -25,10 +25,7 @@ import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile # read in data from netCDF file. infile = 'ccsm_popgrid.nc' Modified: trunk/toolkits/basemap/examples/fcstmaps.py =================================================================== --- trunk/toolkits/basemap/examples/fcstmaps.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/fcstmaps.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -6,10 +6,7 @@ import numpy.ma as ma import datetime from mpl_toolkits.basemap import Basemap, addcyclic, num2date -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile # today's date is default. Modified: trunk/toolkits/basemap/examples/fcstmaps_axesgrid.py =================================================================== --- trunk/toolkits/basemap/examples/fcstmaps_axesgrid.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/fcstmaps_axesgrid.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -8,10 +8,7 @@ import datetime from mpl_toolkits.basemap import Basemap, addcyclic, num2date from mpl_toolkits.axes_grid1 import AxesGrid -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile # today's date is default. Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -1,10 +1,7 @@ # example showing how to use Line Integral Convolution to visualize a vector # flow field (from Hurricane Earl). Produces something akin to streamlines. # Requires vectorplot scikit (http://scikits.appspot.com/vectorplot). -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile from mpl_toolkits.basemap import Basemap import numpy as np import matplotlib.pyplot as plt Modified: trunk/toolkits/basemap/examples/plothighsandlows.py =================================================================== --- trunk/toolkits/basemap/examples/plothighsandlows.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/plothighsandlows.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -7,10 +7,7 @@ import sys from mpl_toolkits.basemap import Basemap, addcyclic from scipy.ndimage.filters import minimum_filter, maximum_filter -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile def extrema(mat,mode='wrap',window=10): """find the indices of local extrema (min and max) Modified: trunk/toolkits/basemap/examples/ploticos.py =================================================================== --- trunk/toolkits/basemap/examples/ploticos.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/ploticos.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -2,10 +2,7 @@ import matplotlib.pyplot as plt import numpy as np from numpy import ma -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile # read in orography of icosahedral global grid. f = NetCDFFile('C02562.orog.nc') lons = (180./np.pi)*f.variables['grid_center_lon'][:] Modified: trunk/toolkits/basemap/examples/plotprecip.py =================================================================== --- trunk/toolkits/basemap/examples/plotprecip.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/plotprecip.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -1,8 +1,5 @@ from mpl_toolkits.basemap import Basemap, cm -try: - from netCDF4 import Dataset as NetCDFFile -except ImportError: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile import numpy as np import matplotlib.pyplot as plt import copy Modified: trunk/toolkits/basemap/examples/plotsst.py =================================================================== --- trunk/toolkits/basemap/examples/plotsst.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/plotsst.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -1,8 +1,5 @@ from mpl_toolkits.basemap import Basemap, date2index, num2date -try: - from netCDF4 import Dataset as NetCDFFile -except: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile import numpy as np import matplotlib.pyplot as plt import sys, datetime Modified: trunk/toolkits/basemap/examples/pnganim.py =================================================================== --- trunk/toolkits/basemap/examples/pnganim.py 2011-02-12 13:58:04 UTC (rev 8978) +++ trunk/toolkits/basemap/examples/pnganim.py 2011-02-12 14:01:34 UTC (rev 8979) @@ -10,10 +10,7 @@ import numpy.ma as ma import datetime, sys, time, subprocess from mpl_toolkits.basemap import Basemap, shiftgrid, date2index, num2date -try: - from netCDF4 import Dataset as NetCDFFile -except: - from mpl_toolkits.basemap import NetCDFFile +from netCDF4 import Dataset as NetCDFFile # times for March 1993 'storm of the century' date1 = datetime.datetime(1993,3,10,0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 13:58:10
|
Revision: 8978 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8978&view=rev Author: jswhit Date: 2011-02-12 13:58:04 +0000 (Sat, 12 Feb 2011) Log Message: ----------- httplib2 and dap removed Modified Paths: -------------- trunk/toolkits/basemap/setup.cfg Modified: trunk/toolkits/basemap/setup.cfg =================================================================== --- trunk/toolkits/basemap/setup.cfg 2011-02-12 13:56:44 UTC (rev 8977) +++ trunk/toolkits/basemap/setup.cfg 2011-02-12 13:58:04 UTC (rev 8978) @@ -6,6 +6,4 @@ # False: do not install # auto: install only if the package is unavailable. This # is the default behavior -pydap = auto -httplib2 = auto pyshapelib = auto This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 13:56:51
|
Revision: 8977 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8977&view=rev Author: jswhit Date: 2011-02-12 13:56:44 +0000 (Sat, 12 Feb 2011) Log Message: ----------- remove more vestiges of netcdf support Modified Paths: -------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py Removed Paths: ------------- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdf.py trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdftime.py Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2011-02-12 13:54:34 UTC (rev 8976) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2011-02-12 13:56:44 UTC (rev 8977) @@ -11,12 +11,6 @@ :func:`shiftgrid`: shifts global lat/lon grids east or west. :func:`addcyclic`: Add cyclic (wraparound) point in longitude. - -:func:`num2date`: convert from a numeric time value to a datetime object. - -:func:`date2num`: convert from a datetime object to a numeric time value. - -:func:`date2index`: compute a time variable index corresponding to a date. """ from matplotlib import __version__ as _matplotlib_version from matplotlib.cbook import is_scalar, dedent @@ -38,7 +32,7 @@ import numpy as np import numpy.ma as ma from shapelib import ShapeFile -import _geoslib, netcdftime +import _geoslib # basemap data files now installed in lib/matplotlib/toolkits/basemap/data # check to see if environment variable BASEMAPDATA set to a directory, @@ -3974,160 +3968,6 @@ else: return corners -def num2date(times,units='days since 0001-01-01 00:00:00',calendar='proleptic_gregorian'): - """ - Return datetime objects given numeric time values. The units - of the numeric time values are described by the ``units`` argument - and the ``calendar`` keyword. The returned datetime objects represent - UTC with no time-zone offset, even if the specified - units contain a time-zone offset. - - Default behavior is the same as the matplotlib.dates.num2date function - but the reference time and calendar can be changed via the - ``units`` and ``calendar`` keywords. - - .. tabularcolumns:: |l|L| - - ============== ==================================================== - Arguments Description - ============== ==================================================== - times numeric time values. Maximum resolution is 1 second. - ============== ==================================================== - - .. tabularcolumns:: |l|L| - - ============== ==================================================== - Keywords Description - ============== ==================================================== - units a string of the form '<time units> since - <reference time>' describing the units and - origin of the time coordinate. - <time units> can be days, hours, minutes - or seconds. <reference time> is the time origin. - Default is 'days since 0001-01-01 00:00:00'. - calendar describes the calendar used in the time - calculations. All the values currently defined in - the CF metadata convention - (http://cf-pcmdi.llnl.gov/documents/cf-conventions/) - are supported. - Valid calendars ``standard``, ``gregorian``, - ``proleptic_gregorian``, ``noleap``, ``365_day``, - ``julian``, ``all_leap``, ``366_day``. - Default is ``proleptic_gregorian``. - ============== ==================================================== - - Returns a datetime instance, or an array of datetime instances. - - The datetime instances returned are 'real' python datetime - objects if the date falls in the Gregorian calendar (i.e. - calendar=``proleptic_gregorian``, or calendar = ``standard`` - or ``gregorian`` and the date is after 1582-10-15). - Otherwise, they are 'phony' datetime - objects which support some but not all the methods of 'real' python - datetime objects. The datetime instances do not contain - a time-zone offset, even if the specified units contains one. - """ - cdftime = netcdftime.utime(units,calendar=calendar) - return cdftime.num2date(times) - -def date2num(dates,units='days since 0001-01-01 00:00:00',calendar='proleptic_gregorian'): - """ - Return numeric time values given datetime objects. The units - of the numeric time values are described by the ``units`` argument - and the ``calendar`` keyword. The datetime objects must - be in UTC with no time-zone offset. If there is a - time-zone offset in units, it will be applied to the - returned numeric values. - - Default behavior is the same as the matplotlib.dates.date2num function - but the reference time and calendar can be changed via the - ``units`` and ``calendar`` keywords. - - .. tabularcolumns:: |l|L| - - ============== ==================================================== - Arguments Description - ============== ==================================================== - dates A datetime object or a sequence of datetime objects. - The datetime objects should not include a - time-zone offset. - ============== ==================================================== - - .. tabularcolumns:: |l|L| - - ============== ==================================================== - Keywords Description - ============== ==================================================== - units a string of the form '<time units> since - <reference time>' describing the units and - origin of the time coordinate. - <time units> can be days, hours, minutes - or seconds. <reference time> is the time origin. - Default is 'days since 0001-01-01 00:00:00'. - calendar describes the calendar used in the time - calculations. All the values currently defined in - the CF metadata convention - (http://cf-pcmdi.llnl.gov/documents/cf-conventions/) - are supported. - Valid calendars ``standard``, ``gregorian``, - ``proleptic_gregorian``, ``noleap``, ``365_day``, - ``julian``, ``all_leap``, ``366_day``. - Default is ``proleptic_gregorian``. - ============== ==================================================== - - Returns a numeric time value, or an array of numeric time values. - - The maximum resolution of the numeric time values is 1 second. - """ - cdftime = netcdftime.utime(units,calendar=calendar) - return cdftime.date2num(dates) - -def date2index(dates, nctime, calendar=None,select='exact'): - """ - Return indices of a netCDF time variable corresponding to the given dates. - - .. tabularcolumns:: |l|L| - - ============== ==================================================== - Arguments Description - ============== ==================================================== - dates A datetime object or a sequence of datetime objects. - The datetime objects should not include a - time-zone offset. - nctime A netCDF time variable object. The nctime object - must have a ``units`` attribute. - ============== ==================================================== - - .. tabularcolumns:: |l|L| - - ============== ==================================================== - Keywords Description - ============== ==================================================== - calendar describes the calendar used in the time - calculations. All the values currently defined in - the CF metadata convention - (http://cf-pcmdi.llnl.gov/documents/cf-conventions/) - are supported. - Valid calendars ``standard``, ``gregorian``, - ``proleptic_gregorian``, ``noleap``, ``365_day``, - ``julian``, ``all_leap``, ``366_day``. - If ``calendar=None``, will use ``calendar`` attribute - of ``nctime`` object, and if that attribute does - not exist calendar is set to ``standard``. - Default is ``None``. - select The index selection method. ``exact`` will return the - indices perfectly matching the dates given. - ``before`` and ``after`` will return the indices - corresponding to the dates just before or after - the given dates if an exact match cannot be found. - ``nearest`` will return the indices that - correspond to the closest dates. Default ``exact``. - ============== ==================================================== - - Returns an index or a sequence of indices. - """ - return netcdftime.date2index(dates, nctime, calendar=calendar, select=select) - def maskoceans(lonsin,latsin,datain,inlands=False): """ mask data (``datain``), defined on a grid with latitudes ``latsin`` Deleted: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdf.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdf.py 2011-02-12 13:54:34 UTC (rev 8976) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdf.py 2011-02-12 13:56:44 UTC (rev 8977) @@ -1,81 +0,0 @@ -from numpy import ma, squeeze -from pupynere import netcdf_file, _unmaskandscale -from dap.client import open as open_remote -from dap.dtypes import ArrayType, GridType, typemap - -_typecodes = dict([[_v,_k] for _k,_v in typemap.items()]) - -class _RemoteFile(object): - """A NetCDF file reader. API is the same as Scientific.IO.NetCDF.""" - - def __init__(self, file, maskandscale=False, cache=None,\ - username=None, password=None, verbose=False): - self._buffer = open_remote(file,cache=cache,\ - username=username,password=password,verbose=verbose) - self._maskandscale = maskandscale - self._parse() - - def read(self, size=-1): - """Alias for reading the file buffer.""" - return self._buffer.read(size) - - def _parse(self): - """Initial parsing of the header.""" - # Read header info. - self._dim_array() - self._gatt_array() - self._var_array() - - def _dim_array(self): - """Read a dict with dimensions names and sizes.""" - self.dimensions = {} - self._dims = [] - for k,d in self._buffer.iteritems(): - if (isinstance(d, ArrayType) or isinstance(d, GridType)) and len(d.shape) == 1 and k == d.dimensions[0]: - name = k - length = len(d) - self.dimensions[name] = length - self._dims.append(name) # preserve dim order - - def _gatt_array(self): - """Read global attributes.""" - self.__dict__.update(self._buffer.attributes) - - def _var_array(self): - """Read all variables.""" - # Read variables. - self.variables = {} - for k,d in self._buffer.iteritems(): - if isinstance(d, GridType) or isinstance(d, ArrayType): - name = k - self.variables[name] = _RemoteVariable(d,self._maskandscale) - - def close(self): - # this is a no-op provided for compatibility - pass - -class _RemoteVariable(object): - def __init__(self, var, maskandscale): - self._var = var - self._maskandscale = maskandscale - self.dtype = var.type - self.shape = var.shape - self.dimensions = var.dimensions - self.__dict__.update(var.attributes) - - def __getitem__(self, index): - datout = squeeze(self._var.__getitem__(index)) - # automatically - # - remove singleton dimensions - # - create a masked array using missing_value or _FillValue attribute - # - apply scale_factor and add_offset to packed integer data - if self._maskandscale: - return _unmaskandscale(self,datout) - else: - return datout - - def __len__(self): - return self.shape[0] - - def typecode(self): - return _typecodes[self.dtype] Deleted: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdftime.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdftime.py 2011-02-12 13:54:34 UTC (rev 8976) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/netcdftime.py 2011-02-12 13:56:44 UTC (rev 8977) @@ -1,1050 +0,0 @@ -""" -Performs conversions of netCDF time coordinate data to/from datetime objects. -""" -import math, numpy, re, time -from datetime import datetime as real_datetime - -_units = ['days','hours','minutes','seconds','day','hour','minute','second'] -_calendars = ['standard','gregorian','proleptic_gregorian','noleap','julian','all_leap','365_day','366_day','360_day'] - -__version__ = '0.7.1' - -class datetime: - """ -Phony datetime object which mimics the python datetime object, -but allows for dates that don't exist in the proleptic gregorian calendar. -Doesn't do timedelta operations, doesn't overload + and -. - -Has strftime, timetuple and __repr__ methods. The format -of the string produced by __repr__ is controlled by self.format -(default %Y-%m-%d %H:%M:%S). - -Instance variables are year,month,day,hour,minute,second,dayofwk,dayofyr -and format. - """ - def __init__(self,year,month,day,hour=0,minute=0,second=0,dayofwk=-1,dayofyr=1): - """dayofyr set to 1 by default - otherwise time.strftime will complain""" - self.year=year - self.month=month - self.day=day - self.hour=hour - self.minute=minute - self.dayofwk=dayofwk - self.dayofyr=dayofyr - self.second=second - self.format='%Y-%m-%d %H:%M:%S' - def strftime(self,format=None): - if format is None: - format = self.format - return _strftime(self,format) - def timetuple(self): - return (self.year,self.month,self.day,self.hour,self.minute,self.second,self.dayofwk,self.dayofyr,-1) - def __repr__(self): - return self.strftime(self.format) - -def JulianDayFromDate(date,calendar='standard'): - - """ - -creates a Julian Day from a 'datetime-like' object. Returns the fractional -Julian Day (resolution 1 second). - -if calendar='standard' or 'gregorian' (default), Julian day follows Julian -Calendar on and before 1582-10-5, Gregorian calendar after 1582-10-15. - -if calendar='proleptic_gregorian', Julian Day follows gregorian calendar. - -if calendar='julian', Julian Day follows julian calendar. - -Algorithm: - -Meeus, Jean (1998) Astronomical Algorithms (2nd Edition). Willmann-Bell, -Virginia. p. 63 - - """ - - # based on redate.py by David Finlayson. - - year=date.year; month=date.month; day=date.day - hour=date.hour; minute=date.minute; second=date.second - # Convert time to fractions of a day - day = day + hour/24.0 + minute/1440.0 + second/86400.0 - - # Start Meeus algorithm (variables are in his notation) - if (month < 3): - month = month + 12 - year = year - 1 - - A = int(year/100) - - jd = int(365.25 * (year + 4716)) + int(30.6001 * (month + 1)) + \ - day - 1524.5 - - # optionally adjust the jd for the switch from - # the Julian to Gregorian Calendar - # here assumed to have occurred the day after 1582 October 4 - if calendar in ['standard','gregorian']: - if jd >= 2299170.5: - # 1582 October 15 (Gregorian Calendar) - B = 2 - A + int(A/4) - elif jd < 2299160.5: - # 1582 October 5 (Julian Calendar) - B = 0 - else: - raise ValueError, 'impossible date (falls in gap between end of Julian calendar and beginning of Gregorian calendar' - elif calendar == 'proleptic_gregorian': - B = 2 - A + int(A/4) - elif calendar == 'julian': - B = 0 - else: - raise ValueError, 'unknown calendar, must be one of julian,standard,gregorian,proleptic_gregorian, got %s' % calendar - - # adjust for Julian calendar if necessary - jd = jd + B - - return jd - -def _NoLeapDayFromDate(date): - - """ - -creates a Julian Day for a calendar with no leap years from a datetime -instance. Returns the fractional Julian Day (resolution 1 second). - - """ - - year=date.year; month=date.month; day=date.day - hour=date.hour; minute=date.minute; second=date.second - # Convert time to fractions of a day - day = day + hour/24.0 + minute/1440.0 + second/86400.0 - - # Start Meeus algorithm (variables are in his notation) - if (month < 3): - month = month + 12 - year = year - 1 - - jd = int(365. * (year + 4716)) + int(30.6001 * (month + 1)) + \ - day - 1524.5 - - return jd - -def _AllLeapFromDate(date): - - """ - -creates a Julian Day for a calendar where all years have 366 days from -a 'datetime-like' object. -Returns the fractional Julian Day (resolution 1 second). - - """ - - year=date.year; month=date.month; day=date.day - hour=date.hour; minute=date.minute; second=date.second - # Convert time to fractions of a day - day = day + hour/24.0 + minute/1440.0 + second/86400.0 - - # Start Meeus algorithm (variables are in his notation) - if (month < 3): - month = month + 12 - year = year - 1 - - jd = int(366. * (year + 4716)) + int(30.6001 * (month + 1)) + \ - day - 1524.5 - - return jd - -def _360DayFromDate(date): - - """ - -creates a Julian Day for a calendar where all months have 30 daysfrom -a 'datetime-like' object. -Returns the fractional Julian Day (resolution 1 second). - - """ - - year=date.year; month=date.month; day=date.day - hour=date.hour; minute=date.minute; second=date.second - # Convert time to fractions of a day - day = day + hour/24.0 + minute/1440.0 + second/86400.0 - - jd = int(360. * (year + 4716)) + int(30. * (month - 1)) + day - - return jd - -def DateFromJulianDay(JD,calendar='standard'): - """ - -returns a 'datetime-like' object given Julian Day. Julian Day is a -fractional day with a resolution of 1 second. - -if calendar='standard' or 'gregorian' (default), Julian day follows Julian -Calendar on and before 1582-10-5, Gregorian calendar after 1582-10-15. - -if calendar='proleptic_gregorian', Julian Day follows gregorian calendar. - -if calendar='julian', Julian Day follows julian calendar. - -The datetime object is a 'real' datetime object if the date falls in -the Gregorian calendar (i.e. calendar='proleptic_gregorian', or -calendar = 'standard'/'gregorian' and the date is after 1582-10-15). -Otherwise, it's a 'phony' datetime object which is actually an instance -of netcdftime.datetime. - - -Algorithm: - -Meeus, Jean (1998) Astronomical Algorithms (2nd Edition). Willmann-Bell, -Virginia. p. 63 - - """ - - # based on redate.py by David Finlayson. - - if JD < 0: - raise ValueError, 'Julian Day must be positive' - - dayofwk = int(math.fmod(int(JD + 1.5),7)) - (F, Z) = math.modf(JD + 0.5) - Z = int(Z) - if calendar in ['standard','gregorian']: - if JD < 2299160.5: - A = Z - else: - alpha = int((Z - 1867216.25)/36524.25) - A = Z + 1 + alpha - int(alpha/4) - - elif calendar == 'proleptic_gregorian': - alpha = int((Z - 1867216.25)/36524.25) - A = Z + 1 + alpha - int(alpha/4) - elif calendar == 'julian': - A = Z - else: - raise ValueError, 'unknown calendar, must be one of julian,standard,gregorian,proleptic_gregorian, got %s' % calendar - - B = A + 1524 - C = int((B - 122.1)/365.25) - D = int(365.25 * C) - E = int((B - D)/30.6001) - - # Convert to date - day = B - D - int(30.6001 * E) + F - nday = B-D-123 - if nday <= 305: - dayofyr = nday+60 - else: - dayofyr = nday-305 - if E < 14: - month = E - 1 - else: - month = E - 13 - - if month > 2: - year = C - 4716 - else: - year = C - 4715 - - # a leap year? - leap = 0 - if year % 4 == 0: - leap = 1 - if calendar == 'proleptic_gregorian' or \ - (calendar in ['standard','gregorian'] and JD >= 2299160.5): - if year % 100 == 0 and year % 400 != 0: - print year % 100, year % 400 - leap = 0 - if leap and month > 2: - dayofyr = dayofyr + leap - - # Convert fractions of a day to time - (dfrac, days) = math.modf(day/1.0) - (hfrac, hours) = math.modf(dfrac * 24.0) - (mfrac, minutes) = math.modf(hfrac * 60.0) - seconds = round(mfrac * 60.0) # seconds are rounded - - if seconds > 59: - seconds = 0 - minutes = minutes + 1 - if minutes > 59: - minutes = 0 - hours = hours + 1 - if hours > 23: - hours = 0 - days = days + 1 - - # return a 'real' datetime instance if calendar is gregorian. - if calendar == 'proleptic_gregorian' or \ - (calendar in ['standard','gregorian'] and JD >= 2299160.5): - return real_datetime(year,month,int(days),int(hours),int(minutes),int(seconds)) - else: - # or else, return a 'datetime-like' instance. - return datetime(year,month,int(days),int(hours),int(minutes),int(seconds),dayofwk,dayofyr) - -def _DateFromNoLeapDay(JD): - """ - -returns a 'datetime-like' object given Julian Day for a calendar with no leap -days. Julian Day is a fractional day with a resolution of 1 second. - - """ - - # based on redate.py by David Finlayson. - - if JD < 0: - raise ValueError, 'Julian Day must be positive' - - dayofwk = int(math.fmod(int(JD + 1.5),7)) - (F, Z) = math.modf(JD + 0.5) - Z = int(Z) - A = Z - B = A + 1524 - C = int((B - 122.1)/365.) - D = int(365. * C) - E = int((B - D)/30.6001) - - # Convert to date - day = B - D - int(30.6001 * E) + F - nday = B-D-123 - if nday <= 305: - dayofyr = nday+60 - else: - dayofyr = nday-305 - if E < 14: - month = E - 1 - else: - month = E - 13 - - if month > 2: - year = C - 4716 - else: - year = C - 4715 - - # Convert fractions of a day to time - (dfrac, days) = math.modf(day/1.0) - (hfrac, hours) = math.modf(dfrac * 24.0) - (mfrac, minutes) = math.modf(hfrac * 60.0) - seconds = round(mfrac * 60.0) # seconds are rounded - - if seconds > 59: - seconds = 0 - minutes = minutes + 1 - if minutes > 59: - minutes = 0 - hours = hours + 1 - if hours > 23: - hours = 0 - days = days + 1 - - return datetime(year,month,int(days),int(hours),int(minutes),int(seconds), dayofwk, dayofyr) - -def _DateFromAllLeap(JD): - """ - -returns a 'datetime-like' object given Julian Day for a calendar where all -years have 366 days. -Julian Day is a fractional day with a resolution of 1 second. - - """ - - # based on redate.py by David Finlayson. - - if JD < 0: - raise ValueError, 'Julian Day must be positive' - - dayofwk = int(math.fmod(int(JD + 1.5),7)) - (F, Z) = math.modf(JD + 0.5) - Z = int(Z) - A = Z - B = A + 1524 - C = int((B - 122.1)/366.) - D = int(366. * C) - E = int((B - D)/30.6001) - - # Convert to date - day = B - D - int(30.6001 * E) + F - nday = B-D-123 - if nday <= 305: - dayofyr = nday+60 - else: - dayofyr = nday-305 - if E < 14: - month = E - 1 - else: - month = E - 13 - if month > 2: - dayofyr = dayofyr+1 - - if month > 2: - year = C - 4716 - else: - year = C - 4715 - - # Convert fractions of a day to time - (dfrac, days) = math.modf(day/1.0) - (hfrac, hours) = math.modf(dfrac * 24.0) - (mfrac, minutes) = math.modf(hfrac * 60.0) - seconds = round(mfrac * 60.0) # seconds are rounded - - if seconds > 59: - seconds = 0 - minutes = minutes + 1 - if minutes > 59: - minutes = 0 - hours = hours + 1 - if hours > 23: - hours = 0 - days = days + 1 - - return datetime(year,month,int(days),int(hours),int(minutes),int(seconds), dayofwk, dayofyr) - -def _DateFrom360Day(JD): - """ - -returns a 'datetime-like' object given Julian Day for a calendar where all -months have 30 days. -Julian Day is a fractional day with a resolution of 1 second. - - """ - - if JD < 0: - raise ValueError, 'Julian Day must be positive' - - #jd = int(360. * (year + 4716)) + int(30. * (month - 1)) + day - (F, Z) = math.modf(JD) - year = int((Z-0.5)/360.) - 4716 - dayofyr = JD - (year+4716)*360 - month = int((dayofyr-0.5)/30)+1 - day = dayofyr - (month-1)*30 + F - - # Convert fractions of a day to time - (dfrac, days) = math.modf(day/1.0) - (hfrac, hours) = math.modf(dfrac * 24.0) - (mfrac, minutes) = math.modf(hfrac * 60.0) - seconds = round(mfrac * 60.0) # seconds are rounded - - if seconds > 59: - seconds = 0 - minutes = minutes + 1 - if minutes > 59: - minutes = 0 - hours = hours + 1 - if hours > 23: - hours = 0 - days = days + 1 - - return datetime(year,month,int(days),int(hours),int(minutes),int(seconds),-1, int(dayofyr)) - -def _dateparse(timestr): - """parse a string of the form time-units since yyyy-mm-dd hh:mm:ss - return a tuple (units, datetimeinstance)""" - timestr_split = timestr.split() - units = timestr_split[0].lower() - if units not in _units: - raise ValueError,"units must be one of 'seconds', 'minutes', 'hours' or 'days' (or singular version of these), got '%s'" % units - if timestr_split[1].lower() != 'since': - raise ValueError,"no 'since' in unit_string" - # parse the date string. - n = timestr.find('since')+6 - year,month,day,hour,minute,second,utc_offset = _parse_date(timestr[n:]) - return units, utc_offset, datetime(year, month, day, hour, minute, second) - -class utime: - """ -Performs conversions of netCDF time coordinate -data to/from datetime objects. - -To initialize: C{t = utime(unit_string,calendar='standard')} - -where - -B{C{unit_string}} is a string of the form -C{'time-units since <time-origin>'} defining the time units. - -Valid time-units are days, hours, minutes and seconds (the singular forms -are also accepted). An example unit_string would be C{'hours -since 0001-01-01 00:00:00'}. - -The B{C{calendar}} keyword describes the calendar used in the time calculations. -All the values currently defined in the U{CF metadata convention -<http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.1/cf-conventions.html#time-coordinate>} -are accepted. The default is C{'standard'}, which corresponds to the mixed -Gregorian/Julian calendar used by the C{udunits library}. Valid calendars -are: - -C{'gregorian'} or C{'standard'} (default): - -Mixed Gregorian/Julian calendar as defined by udunits. - -C{'proleptic_gregorian'}: - -A Gregorian calendar extended to dates before 1582-10-15. That is, a year -is a leap year if either (i) it is divisible by 4 but not by 100 or (ii) -it is divisible by 400. - -C{'noleap'} or C{'365_day'}: - -Gregorian calendar without leap years, i.e., all years are 365 days long. -all_leap or 366_day Gregorian calendar with every year being a leap year, -i.e., all years are 366 days long. - -C{'360_day'}: - -All years are 360 days divided into 30 day months. - -C{'julian'}: - -Proleptic Julian calendar, extended to dates after 1582-10-5. A year is a -leap year if it is divisible by 4. - -The C{L{num2date}} and C{L{date2num}} class methods can used to convert datetime -instances to/from the specified time units using the specified calendar. - -The datetime instances returned by C{num2date} are 'real' python datetime -objects if the date falls in the Gregorian calendar (i.e. -C{calendar='proleptic_gregorian', 'standard'} or C{'gregorian'} and -the date is after 1582-10-15). Otherwise, they are 'phony' datetime -objects which are actually instances of C{L{netcdftime.datetime}}. This is -because the python datetime module cannot handle the weird dates in some -calendars (such as C{'360_day'} and C{'all_leap'}) which don't exist in any real -world calendar. - - -Example usage: - ->>> from netcdftime import utime ->>> from datetime import datetime ->>> cdftime = utime('hours since 0001-01-01 00:00:00') ->>> date = datetime.now() ->>> print date -2006-03-17 16:04:02.561678 ->>> ->>> t = cdftime.date2num(date) ->>> print t -17577328.0672 ->>> ->>> date = cdftime.num2date(t) ->>> print date -2006-03-17 16:04:02 ->>> - -The resolution of the transformation operation is 1 second. - -Warning: Dates between 1582-10-5 and 1582-10-15 do not exist in the -C{'standard'} or C{'gregorian'} calendars. An exception will be raised if you pass -a 'datetime-like' object in that range to the C{L{date2num}} class method. - -Words of Wisdom from the British MetOffice concerning reference dates: - -"udunits implements the mixed Gregorian/Julian calendar system, as -followed in England, in which dates prior to 1582-10-15 are assumed to use -the Julian calendar. Other software cannot be relied upon to handle the -change of calendar in the same way, so for robustness it is recommended -that the reference date be later than 1582. If earlier dates must be used, -it should be noted that udunits treats 0 AD as identical to 1 AD." - -@ivar origin: datetime instance defining the origin of the netCDF time variable. -@ivar calendar: the calendar used (as specified by the C{calendar} keyword). -@ivar unit_string: a string defining the the netCDF time variable. -@ivar units: the units part of C{unit_string} (i.e. 'days', 'hours', 'seconds'). - """ - def __init__(self,unit_string,calendar='standard'): - """ -@param unit_string: a string of the form -C{'time-units since <time-origin>'} defining the time units. - -Valid time-units are days, hours, minutes and seconds (the singular forms -are also accepted). An example unit_string would be C{'hours -since 0001-01-01 00:00:00'}. - -@keyword calendar: describes the calendar used in the time calculations. -All the values currently defined in the U{CF metadata convention -<http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.1/cf-conventions.html#time-coordinate>} -are accepted. The default is C{'standard'}, which corresponds to the mixed -Gregorian/Julian calendar used by the C{udunits library}. Valid calendars -are: - - C{'gregorian'} or C{'standard'} (default): - Mixed Gregorian/Julian calendar as defined by udunits. - - C{'proleptic_gregorian'}: - A Gregorian calendar extended to dates before 1582-10-15. That is, a year - is a leap year if either (i) it is divisible by 4 but not by 100 or (ii) - it is divisible by 400. - - C{'noleap'} or C{'365_day'}: - Gregorian calendar without leap years, i.e., all years are 365 days long. - - C{'all_leap'} or C{'366_day'}: - Gregorian calendar with every year being a leap year, i.e., - all years are 366 days long. - -C{'360_day'}: - All years are 360 days divided into 30 day months. - -C{'julian'}: - Proleptic Julian calendar, extended to dates after 1582-10-5. A year is a - leap year if it is divisible by 4. - -@returns: A class instance which may be used for converting times from netCDF -units to datetime objects. - """ - if calendar in _calendars: - self.calendar = calendar - else: - raise ValueError, "calendar must be one of %s, got '%s'" % (str(_calendars),calendar) - units, tzoffset, self.origin = _dateparse(unit_string) - self.tzoffset = tzoffset # time zone offset in minutes - self.units = units - self.unit_string = unit_string - if self.calendar in ['noleap','365_day'] and self.origin.month == 2 and self.origin.day == 29: - raise ValueError, 'cannot specify a leap day as the reference time with the noleap calendar' - if self.calendar == '360_day' and self.origin.day > 30: - raise ValueError, 'there are only 30 days in every month with the 360_day calendar' - if self.calendar in ['noleap','365_day']: - self._jd0 = _NoLeapDayFromDate(self.origin) - elif self.calendar in ['all_leap','366_day']: - self._jd0 = _AllLeapFromDate(self.origin) - elif self.calendar == '360_day': - self._jd0 = _360DayFromDate(self.origin) - else: - self._jd0 = JulianDayFromDate(self.origin,calendar=self.calendar) - - def date2num(self,date): - """ -Returns C{time_value} in units described by L{unit_string}, using -the specified L{calendar}, given a 'datetime-like' object. - -The datetime object must represent UTC with no time-zone offset. -If there is a time-zone offset implied by L{unit_string}, it will -be applied to the returned numeric values. - -Resolution is 1 second. - -If C{calendar = 'standard'} or C{'gregorian'} (indicating -that the mixed Julian/Gregorian calendar is to be used), an -exception will be raised if the 'datetime-like' object describes -a date between 1582-10-5 and 1582-10-15. - -Works for scalars, sequences and numpy arrays. -Returns a scalar if input is a scalar, else returns a numpy array. - """ - isscalar = False - try: - date[0] - except: - isscalar = True - if not isscalar: - date = numpy.array(date) - shape = date.shape - if self.calendar in ['julian','standard','gregorian','proleptic_gregorian']: - if isscalar: - jdelta = JulianDayFromDate(date,self.calendar)-self._jd0 - else: - jdelta = [JulianDayFromDate(d,self.calendar)-self._jd0 for d in date.flat] - elif self.calendar in ['noleap','365_day']: - if date.month == 2 and date.day == 29: - raise ValueError, 'there is no leap day in the noleap calendar' - if isscalar: - jdelta = _NoLeapDayFromDate(date) - self._jd0 - else: - jdelta = [_NoLeapDayFromDate(d)-self._jd0 for d in date.flat] - elif self.calendar in ['all_leap','366_day']: - if isscalar: - jdelta = _AllLeapFromDate(date) - self._jd0 - else: - jdelta = [_AllLeapFromDate(d)-self._jd0 for d in date.flat] - elif self.calendar == '360_day': - if self.calendar == '360_day' and date.day > 30: - raise ValueError, 'there are only 30 days in every month with the 360_day calendar' - if isscalar: - jdelta = _360DayFromDate(date) - self._jd0 - else: - jdelta = [_360DayFromDate(d)-self._jd0 for d in date.flat] - if not isscalar: - jdelta = numpy.array(jdelta) - # convert to desired units, add time zone offset. - if self.units in ['second','seconds']: - jdelta = jdelta*86400. + self.tzoffset*60. - elif self.units in ['minute','minutes']: - jdelta = jdelta*1440. + self.tzoffset - elif self.units in ['hour','hours']: - jdelta = jdelta*24. + self.tzoffset/60. - elif self.units in ['day','days']: - jdelta = jdelta + self.tzoffset/1440. - if isscalar: - return jdelta - else: - return numpy.reshape(jdelta,shape) - - def num2date(self,time_value): - """ -Return a 'datetime-like' object given a C{time_value} in units -described by L{unit_string}, using L{calendar}. - -dates are in UTC with no offset, even if L{unit_string} contains -a time zone offset from UTC. - -Resolution is 1 second. - -Works for scalars, sequences and numpy arrays. -Returns a scalar if input is a scalar, else returns a numpy array. - -The datetime instances returned by C{num2date} are 'real' python datetime -objects if the date falls in the Gregorian calendar (i.e. -C{calendar='proleptic_gregorian'}, or C{calendar = 'standard'/'gregorian'} and -the date is after 1582-10-15). Otherwise, they are 'phony' datetime -objects which are actually instances of netcdftime.datetime. This is -because the python datetime module cannot handle the weird dates in some -calendars (such as C{'360_day'} and C{'all_leap'}) which -do not exist in any real world calendar. - """ - isscalar = False - try: - time_value[0] - except: - isscalar = True - if not isscalar: - time_value = numpy.array(time_value, dtype='d') - shape = time_value.shape - # convert to desired units, remove time zone offset. - if self.units in ['second','seconds']: - jdelta = time_value/86400. - self.tzoffset/1440. - elif self.units in ['minute','minutes']: - jdelta = time_value/1440. - self.tzoffset/1440. - elif self.units in ['hour','hours']: - jdelta = time_value/24. - self.tzoffset/1440. - elif self.units in ['day','days']: - jdelta = time_value - self.tzoffset/1440. - jd = self._jd0 + jdelta - if self.calendar in ['julian','standard','gregorian','proleptic_gregorian']: - if not isscalar: - date = [DateFromJulianDay(j,self.calendar) for j in jd.flat] - else: - date = DateFromJulianDay(jd,self.calendar) - elif self.calendar in ['noleap','365_day']: - if not isscalar: - date = [_DateFromNoLeapDay(j) for j in jd.flat] - else: - date = _DateFromNoLeapDay(jd) - elif self.calendar in ['all_leap','366_day']: - if not isscalar: - date = [_DateFromAllLeap(j) for j in jd.flat] - else: - date = _DateFromAllLeap(jd) - elif self.calendar == '360_day': - if not isscalar: - date = [_DateFrom360Day(j) for j in jd.flat] - else: - date = _DateFrom360Day(jd) - if isscalar: - return date - else: - return numpy.reshape(numpy.array(date),shape) - -def _parse_date(origin): - """Parses a date string and returns a tuple - (year,month,day,hour,minute,second,utc_offset). - utc_offset is in minutes. - - This function parses the 'origin' part of the time unit. It should be - something like:: - - 2004-11-03 14:42:27.0 +2:00 - - Lots of things are optional; just the date is mandatory. - - by Roberto De Almeida - - excerpted from coards.py - http://cheeseshop.python.org/pypi/coards/ - """ - # yyyy-mm-dd [hh:mm:ss[.s][ [+-]hh[:][mm]]] - p = re.compile( r'''(?P<year>\d{1,4}) # yyyy - - # - (?P<month>\d{1,2}) # mm or m - - # - (?P<day>\d{1,2}) # dd or d - # - (?: # [optional time and timezone] - \s # - (?P<hour>\d{1,2}) # hh or h - : # - (?P<min>\d{1,2}) # mm or m - (?: - \: - (?P<sec>\d{1,2}) # ss or s (optional) - )? - # - (?: # [optional decisecond] - \. # . - (?P<dsec>\d) # s - )? # - (?: # [optional timezone] - \s # - (?P<ho>[+-]? # [+ or -] - \d{1,2}) # hh or h - :? # [:] - (?P<mo>\d{2})? # [mm] - )? # - )? # - $ # EOL - ''', re.VERBOSE) - - m = p.match(origin.strip()) - if m: - c = m.groupdict(0) - # UTC offset. - offset = int(c['ho'])*60 + int(c['mo']) - return int(c['year']),int(c['month']),int(c['day']),int(c['hour']),int(c['min']),int(c['sec']),offset - - raise Exception('Invalid date origin: %s' % origin) - -# remove the unsupposed "%s" command. But don't -# do it if there's an even number of %s before the s -# because those are all escaped. Can't simply -# remove the s because the result of -# %sY -# should be %Y if %s isn't supported, not the -# 4 digit year. -_illegal_s = re.compile(r"((^|[^%])(%%)*%s)") - -def _findall(text, substr): - # Also finds overlaps - sites = [] - i = 0 - while 1: - j = text.find(substr, i) - if j == -1: - break - sites.append(j) - i=j+1 - return sites - -# Every 28 years the calendar repeats, except through century leap -# years where it's 6 years. But only if you're using the Gregorian -# calendar. ;) - -def _strftime(dt, fmt): - if _illegal_s.search(fmt): - raise TypeError("This strftime implementation does not handle %s") - # don't use strftime method at all. - #if dt.year > 1900: - # return dt.strftime(fmt) - - year = dt.year - # For every non-leap year century, advance by - # 6 years to get into the 28-year repeat cycle - delta = 2000 - year - off = 6*(delta // 100 + delta // 400) - year = year + off - - # Move to around the year 2000 - year = year + ((2000 - year)//28)*28 - timetuple = dt.timetuple() - s1 = time.strftime(fmt, (year,) + timetuple[1:]) - sites1 = _findall(s1, str(year)) - - s2 = time.strftime(fmt, (year+28,) + timetuple[1:]) - sites2 = _findall(s2, str(year+28)) - - sites = [] - for site in sites1: - if site in sites2: - sites.append(site) - - s = s1 - syear = "%4d" % (dt.year,) - for site in sites: - s = s[:site] + syear + s[site+4:] - return s - -def date2num(dates,units,calendar='standard'): - """ -date2num(dates,units,calendar='standard') - -Return numeric time values given datetime objects. The units -of the numeric time values are described by the L{units} argument -and the L{calendar} keyword. The datetime objects must -be in UTC with no time-zone offset. If there is a -time-zone offset in C{units}, it will be applied to the -returned numeric values. - -Like the matplotlib C{date2num} function, except that it allows -for different units and calendars. Behaves the same if -C{units = 'days since 0001-01-01 00:00:00'} and -C{calendar = 'proleptic_gregorian'}. - -@param dates: A datetime object or a sequence of datetime objects. - The datetime objects should not include a time-zone offset. - -@param units: a string of the form C{'B{time units} since B{reference time}}' - describing the time units. B{C{time units}} can be days, hours, minutes - or seconds. B{C{reference time}} is the time origin. A valid choice - would be units=C{'hours since 1800-01-01 00:00:00 -6:00'}. - -@param calendar: describes the calendar used in the time calculations. - All the values currently defined in the U{CF metadata convention - <http://cf-pcmdi.llnl.gov/documents/cf-conventions/>} are supported. - Valid calendars C{'standard', 'gregorian', 'proleptic_gregorian' - 'noleap', '365_day', '360_day', 'julian', 'all_leap', '366_day'}. - Default is C{'standard'}, which is a mixed Julian/Gregorian calendar. - -@return: a numeric time value, or an array of numeric time values. - -The maximum resolution of the numeric time values is 1 second. - """ - cdftime = utime(units,calendar=calendar) - return cdftime.date2num(dates) - -def num2date(times,units,calendar='standard'): - """ -num2date(times,units,calendar='standard') - -Return datetime objects given numeric time values. The units -of the numeric time values are described by the C{units} argument -and the C{calendar} keyword. The returned datetime objects represent -UTC with no time-zone offset, even if the specified -C{units} contain a time-zone offset. - -Like the matplotlib C{num2date} function, except that it allows -for different units and calendars. Behaves the same if -C{units = 'days since 001-01-01 00:00:00'} and -C{calendar = 'proleptic_gregorian'}. - -@param times: numeric time values. Maximum resolution is 1 second. - -@param units: a string of the form C{'B{time units} since B{reference time}}' -describing the time units. B{C{time units}} can be days, hours, minutes -or seconds. B{C{reference time}} is the time origin. A valid choice -would be units=C{'hours since 1800-01-01 00:00:00 -6:00'}. - -@param calendar: describes the calendar used in the time calculations. -All the values currently defined in the U{CF metadata convention -<http://cf-pcmdi.llnl.gov/documents/cf-conventions/>} are supported. -Valid calendars C{'standard', 'gregorian', 'proleptic_gregorian' -'noleap', '365_day', '360_day', 'julian', 'all_leap', '366_day'}. -Default is C{'standard'}, which is a mixed Julian/Gregorian calendar. - -@return: a datetime instance, or an array of datetime instances. - -The datetime instances returned are 'real' python datetime -objects if the date falls in the Gregorian calendar (i.e. -C{calendar='proleptic_gregorian'}, or C{calendar = 'standard'} or C{'gregorian'} -and the date is after 1582-10-15). Otherwise, they are 'phony' datetime -objects which support some but not all the methods of 'real' python -datetime objects. This is because the python datetime module cannot -the uses the C{'proleptic_gregorian'} calendar, even before the switch -occured from the Julian calendar in 1582. The datetime instances -do not contain a time-zone offset, even if the specified C{units} -contains one. - """ - cdftime = utime(units,calendar=calendar) - return cdftime.num2date(times) - -def _check_index(indices, dates, nctime, calendar): - """Return True if the time indices given correspond to the given dates, - False otherwise. - - Parameters: - - indices : sequence of integers - Positive integers indexing the time variable. - - dates : sequence of datetime objects - Reference dates. - - nctime : netCDF Variable object - NetCDF time object. - - calendar : string - Calendar of nctime. - """ - if (indices <0).any(): - return False - - if (indices >= nctime.shape[0]).any(): - return False - -# t = nctime[indices] -# fancy indexing not available, fall back on this. - t=[] - for ind in indices: - t.append(nctime[ind]) - return numpy.all( num2date(t, nctime.units, calendar) == dates) - - -def date2index(dates, nctime, calendar=None, select='exact'): - """ - date2index(dates, nctime, calendar=None, select='exact') - - Return indices of a netCDF time variable corresponding to the given dates. - - @param dates: A datetime object or a sequence of datetime objects. - The datetime objects should not include a time-zone offset. - - @param nctime: A netCDF time variable object. The nctime object must have a - C{units} attribute. The entries are assumed to be stored in increasing - order. - - @param calendar: Describes the calendar used in the time calculation. - Valid calendars C{'standard', 'gregorian', 'proleptic_gregorian' - 'noleap', '365_day', '360_day', 'julian', 'all_leap', '366_day'}. - Default is C{'standard'}, which is a mixed Julian/Gregorian calendar - If C{calendar} is None, its value is given by C{nctime.calendar} or - C{standard} if no such attribute exists. - - @param select: C{'exact', 'before', 'after', 'nearest'} - The index selection method. C{exact} will return the indices perfectly - matching the dates given. C{before} and C{after} will return the indices - corresponding to the dates just before or just after the given dates if - an exact match cannot be found. C{nearest} will return the indices that - correpond to the closest dates. - """ - # Setting the calendar. - - if calendar == None: - calendar = getattr(nctime, 'calendar', 'standard') - - num = numpy.atleast_1d(date2num(dates, nctime.units, calendar)) - - # Trying to infer the correct index from the starting time and the stride. - # This assumes that the times are increasing uniformly. - t0, t1 = nctime[:2] - dt = t1 - t0 - index = numpy.array((num-t0)/dt, int) - - # Checking that the index really corresponds to the given date. - # If the times do not correspond, then it means that the times - # are not increasing uniformly and we try the bisection method. - if not _check_index(index, dates, nctime, calendar): - - # Use the bisection method. Assumes the dates are ordered. - import bisect - - index = numpy.array([bisect.bisect_left(nctime, n) for n in num], int) - - # Find the dates for which the match is not perfect. - # Use list comprehension instead of the simpler `nctime[index]` since - # not all time objects support numpy integer indexing (eg dap). - ncnum = numpy.squeeze([nctime[i] for i in index]) - mismatch = numpy.nonzero(ncnum != num)[0] - - if select == 'exact': - if len(mismatch) > 0: - raise ValueError, 'Some dates not found.' - - elif select == 'before': - index[mismatch] -= 1 - - elif select == 'after': - pass - - elif select == 'nearest': - nearest_to_left = num[mismatch] < numpy.array( [nctime[i-1] + nctime[i] for i in index[mismatch]]) / 2. - index[mismatch] = index[mismatch] - 1 * nearest_to_left - - else: - raise ValueError("%s is not an option for the `select` argument."%select) - - # convert numpy scalars or single element arrays to python ints. - return _toscalar(index) - - -def _toscalar(a): - if a.shape in [(),(1,)]: - return a.item() - else: - return a This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 13:54:40
|
Revision: 8976 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8976&view=rev Author: jswhit Date: 2011-02-12 13:54:34 +0000 (Sat, 12 Feb 2011) Log Message: ----------- no longer needed since NetCDFFile has been removed Removed Paths: ------------- trunk/toolkits/basemap/lib/dap/ trunk/toolkits/basemap/lib/httplib2/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 13:53:36
|
Revision: 8975 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8975&view=rev Author: jswhit Date: 2011-02-12 13:53:30 +0000 (Sat, 12 Feb 2011) Log Message: ----------- remove deprecated NetCDFFile Modified Paths: -------------- trunk/toolkits/basemap/Changelog trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py trunk/toolkits/basemap/setup.py Modified: trunk/toolkits/basemap/Changelog =================================================================== --- trunk/toolkits/basemap/Changelog 2011-02-12 04:35:09 UTC (rev 8974) +++ trunk/toolkits/basemap/Changelog 2011-02-12 13:53:30 UTC (rev 8975) @@ -1,3 +1,7 @@ +version 1.0.2 (not yet released) + * added lic_demo.py to examples (line integral convolution, + requires scikit.vectorplot). + * removed deprecated NetCDFFile. version 1.0.1 (svn revision 8967) * regenerated C source with cython 0.14.1. * added new "allsky" example from Tom Loredo. Modified: trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py =================================================================== --- trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2011-02-12 04:35:09 UTC (rev 8974) +++ trunk/toolkits/basemap/lib/mpl_toolkits/basemap/__init__.py 2011-02-12 13:53:30 UTC (rev 8975) @@ -4,10 +4,6 @@ Contains the :class:`Basemap` class (which does most of the heavy lifting), and the following functions: -:func:`NetCDFFile`: Read local and remote NetCDF datasets. Deprecated -as of version 1.0.1 (will be removed in 1.0.2). Use netcdf4-python -(http://netcdf4-python.googlecode.com) module instead. - :func:`interp`: bilinear interpolation between rectilinear grids. :func:`maskoceans`: mask 'wet' points of an input array. @@ -54,7 +50,7 @@ else: basemap_datadir = os.sep.join([os.path.dirname(__file__), 'data']) -__version__ = '1.0.1' +__version__ = '1.0.2' # supported map projections. _projnames = {'cyl' : 'Cylindrical Equidistant', @@ -3978,52 +3974,6 @@ else: return corners -def NetCDFFile(file, mode='r', maskandscale=True, cache=None, mmap=True,\ - username=None, password=None, verbose=False): - """NetCDF File reader/writer. API is the same as Scientific.IO.NetCDF. - - If ``file`` is a URL that starts with `http`, it is assumed - to be a remote OPenDAP dataset, and pydap is used - to retrieve the data. Only the OPenDAP Array and Grid data - types are recognized. If file does not start with `http`, it - is assumed to be a local netCDF file and is read - with scipy.io.netcdf. Both pydap and scipy.io.netcdf are written - by Roberto De Almeida. - - Data will - automatically be converted to and from masked arrays if the variable - has either a ``missing_value`` or ``_FillValue`` attribute, and - some data points are equal to the value specified by that attribute. - In addition, variables that have the ``scale_factor`` and ``add_offset`` - attribute will automatically be converted to and from short integers. - To suppress these automatic conversions, set the ``maskandscale`` - keyword to False. - - The keywords ``cache``, ``username``, ``password`` and ``verbose`` are only - valid for remote OPenDAP datasets. ``username`` and ``password`` are used - to access OPenDAP datasets that require authentication. ``verbose=True`` - will make the pydap client print out the URLs being accessed. - ``cache`` is a location (a directory) for caching data, so that repeated - accesses to the same URL avoid the network. - - The keyword ``mmap`` is only valid for local netCDF files. When - ``mmap=True`` (default), the mmap module is used to access the data. - This may be slow for very large netCDF variables. - """ - import netcdf - import warnings - msg=dedent(""" - - NetCDFFile will be removed in 1.0.2, please use netcdf4-python - (http://netcdf4-python.googlecode.com) instead - """) - warnings.warn(msg,DeprecationWarning) - if file.startswith('http'): - return netcdf._RemoteFile(file,maskandscale=maskandscale,\ - cache=cache,username=username,password=password,verbose=verbose) - else: - return netcdf.netcdf_file(file,mode=mode,mmap=mmap,maskandscale=maskandscale) - def num2date(times,units='days since 0001-01-01 00:00:00',calendar='proleptic_gregorian'): """ Return datetime objects given numeric time values. The units Modified: trunk/toolkits/basemap/setup.py =================================================================== --- trunk/toolkits/basemap/setup.py 2011-02-12 04:35:09 UTC (rev 8974) +++ trunk/toolkits/basemap/setup.py 2011-02-12 13:53:30 UTC (rev 8975) @@ -241,7 +241,7 @@ setup( name = "basemap", - version = "1.0.1", + version = "1.0.2", description = "Plot data on map projections with matplotlib", long_description = """ An add-on toolkit for matplotlib that lets you plot data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-12 04:35:17
|
Revision: 8974 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8974&view=rev Author: jswhit Date: 2011-02-12 04:35:09 +0000 (Sat, 12 Feb 2011) Log Message: ----------- fix import Modified Paths: -------------- trunk/toolkits/basemap/examples/lic_demo.py Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 21:04:16 UTC (rev 8973) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-12 04:35:09 UTC (rev 8974) @@ -9,7 +9,7 @@ import numpy as np import matplotlib.pyplot as plt try: - from vectorplot import lic_internal + from scikits.vectorplot import lic_internal except ImportError: raise ImportError('need vectorplot scikit for this example') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-11 21:04:22
|
Revision: 8973 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8973&view=rev Author: jswhit Date: 2011-02-11 21:04:16 +0000 (Fri, 11 Feb 2011) Log Message: ----------- no regridding Modified Paths: -------------- trunk/toolkits/basemap/examples/lic_demo.py Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 20:52:28 UTC (rev 8972) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 21:04:16 UTC (rev 8973) @@ -15,27 +15,26 @@ # H*wind data from http://www.aoml.noaa.gov/hrd/data_sub/wind.html ncfile = NetCDFFile('rita.nc') -u = ncfile.variables['sfc_u'][0,:,:] -v = ncfile.variables['sfc_v'][0,:,:] +udat = ncfile.variables['sfc_u'][0,:,:] +vdat = ncfile.variables['sfc_v'][0,:,:] lons1 = ncfile.variables['longitude'][:] lats1 = ncfile.variables['latitude'][:] lat0 = lats1[len(lats1)/2]; lon0 = lons1[len(lons1)/2] -print lat0,lon0 lons, lats = np.meshgrid(lons1,lats1) ncfile.close() + fig = plt.figure(figsize=(8,8)) -m = Basemap(projection='stere',lat_0=lat0,lon_0=lon0,width=1.e6,height=1.e6,resolution='i') -nxv = 301; nyv = 301; kernellen=41 -udat, vdat, xv, yv = m.transform_vector(u,v,lons1,lats1,nxv,nyv,returnxy=True) +m = Basemap(projection='cyl',llcrnrlat=lats1[0],llcrnrlon=lons1[0],urcrnrlat=lats1[-1],urcrnrlon=lons1[-1],resolution='i') +kernellen=31 texture = np.random.rand(udat.shape[0],udat.shape[1]).astype(np.float32) kernel = np.sin(np.arange(kernellen)*np.pi/kernellen).astype(np.float32) image = lic_internal.line_integral_convolution(udat.astype(np.float32),\ vdat.astype(np.float32), texture, kernel) im = m.imshow(image,plt.cm.gist_stern) m.drawcoastlines() -m.drawmeridians(np.arange(0,360,2),labels=[0,0,0,1]) -m.drawparallels(np.arange(-30,30,2),labels=[1,0,0,0]) +m.drawmeridians(np.arange(-120,-60,2),labels=[0,0,0,1]) +m.drawparallels(np.arange(0,30,2),labels=[1,0,0,0]) plt.title('Hurricane Rita flow field visualized with Line Integral Convolution',\ fontsize=13) plt.show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-11 20:52:34
|
Revision: 8972 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8972&view=rev Author: jswhit Date: 2011-02-11 20:52:28 +0000 (Fri, 11 Feb 2011) Log Message: ----------- use rita data from AOML for lic example. Modified Paths: -------------- trunk/toolkits/basemap/MANIFEST.in trunk/toolkits/basemap/examples/lic_demo.py Added Paths: ----------- trunk/toolkits/basemap/examples/rita.nc Removed Paths: ------------- trunk/toolkits/basemap/examples/hurrearl.nc Modified: trunk/toolkits/basemap/MANIFEST.in =================================================================== --- trunk/toolkits/basemap/MANIFEST.in 2011-02-11 20:29:37 UTC (rev 8971) +++ trunk/toolkits/basemap/MANIFEST.in 2011-02-11 20:52:28 UTC (rev 8972) @@ -79,7 +79,7 @@ include examples/nws_precip_conus_20061222.nc include examples/C02562.orog.nc include examples/ccsm_popgrid.nc -include examples/hurrearl.nc +include examples/rita.nc include examples/NetCDFFile_tst.py include examples/maskoceans.py include examples/README Deleted: trunk/toolkits/basemap/examples/hurrearl.nc =================================================================== (Binary files differ) Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 20:29:37 UTC (rev 8971) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 20:52:28 UTC (rev 8972) @@ -13,14 +13,14 @@ except ImportError: raise ImportError('need vectorplot scikit for this example') -date = '2010090100' -lat0=22.6; lon0=-69.2 - -ncfile = NetCDFFile('hurrearl.nc') -u = ncfile.variables['u10m'][:,:] -v = ncfile.variables['v10m'][:,:] -lons1 = ncfile.variables['lon'][:] -lats1 = ncfile.variables['lat'][:] +# H*wind data from http://www.aoml.noaa.gov/hrd/data_sub/wind.html +ncfile = NetCDFFile('rita.nc') +u = ncfile.variables['sfc_u'][0,:,:] +v = ncfile.variables['sfc_v'][0,:,:] +lons1 = ncfile.variables['longitude'][:] +lats1 = ncfile.variables['latitude'][:] +lat0 = lats1[len(lats1)/2]; lon0 = lons1[len(lons1)/2] +print lat0,lon0 lons, lats = np.meshgrid(lons1,lats1) ncfile.close() @@ -36,6 +36,6 @@ m.drawcoastlines() m.drawmeridians(np.arange(0,360,2),labels=[0,0,0,1]) m.drawparallels(np.arange(-30,30,2),labels=[1,0,0,0]) -plt.title('Hurricane Earl flow field visualized with Line Integral Convolution',\ +plt.title('Hurricane Rita flow field visualized with Line Integral Convolution',\ fontsize=13) plt.show() Added: trunk/toolkits/basemap/examples/rita.nc =================================================================== (Binary files differ) Property changes on: trunk/toolkits/basemap/examples/rita.nc ___________________________________________________________________ Added: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-11 20:29:43
|
Revision: 8971 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8971&view=rev Author: jswhit Date: 2011-02-11 20:29:37 +0000 (Fri, 11 Feb 2011) Log Message: ----------- remove un-needed imports Modified Paths: -------------- trunk/toolkits/basemap/examples/lic_demo.py Modified: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 19:30:12 UTC (rev 8970) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 20:29:37 UTC (rev 8971) @@ -5,7 +5,7 @@ from netCDF4 import Dataset as NetCDFFile except ImportError: from mpl_toolkits.basemap import NetCDFFile -from mpl_toolkits.basemap import Basemap, cm, shiftgrid +from mpl_toolkits.basemap import Basemap import numpy as np import matplotlib.pyplot as plt try: @@ -26,10 +26,9 @@ fig = plt.figure(figsize=(8,8)) m = Basemap(projection='stere',lat_0=lat0,lon_0=lon0,width=1.e6,height=1.e6,resolution='i') -nxv = 501; nyv = 501 +nxv = 301; nyv = 301; kernellen=41 udat, vdat, xv, yv = m.transform_vector(u,v,lons1,lats1,nxv,nyv,returnxy=True) texture = np.random.rand(udat.shape[0],udat.shape[1]).astype(np.float32) -kernellen=51 kernel = np.sin(np.arange(kernellen)*np.pi/kernellen).astype(np.float32) image = lic_internal.line_integral_convolution(udat.astype(np.float32),\ vdat.astype(np.float32), texture, kernel) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-11 19:30:20
|
Revision: 8970 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8970&view=rev Author: jswhit Date: 2011-02-11 19:30:12 +0000 (Fri, 11 Feb 2011) Log Message: ----------- add new Line Integral Convolution (LIC) example (requires vectorplot scikit) Modified Paths: -------------- trunk/toolkits/basemap/MANIFEST.in trunk/toolkits/basemap/examples/README trunk/toolkits/basemap/examples/run_all.py Added Paths: ----------- trunk/toolkits/basemap/examples/hurrearl.nc trunk/toolkits/basemap/examples/lic_demo.py Modified: trunk/toolkits/basemap/MANIFEST.in =================================================================== --- trunk/toolkits/basemap/MANIFEST.in 2011-02-10 07:37:05 UTC (rev 8969) +++ trunk/toolkits/basemap/MANIFEST.in 2011-02-11 19:30:12 UTC (rev 8970) @@ -75,9 +75,11 @@ include examples/cities.shx include examples/show_colormaps.py include examples/plotprecip.py +include examples/lic_demo.py include examples/nws_precip_conus_20061222.nc include examples/C02562.orog.nc include examples/ccsm_popgrid.nc +include examples/hurrearl.nc include examples/NetCDFFile_tst.py include examples/maskoceans.py include examples/README Modified: trunk/toolkits/basemap/examples/README =================================================================== --- trunk/toolkits/basemap/examples/README 2011-02-10 07:37:05 UTC (rev 8969) +++ trunk/toolkits/basemap/examples/README 2011-02-11 19:30:12 UTC (rev 8970) @@ -141,3 +141,6 @@ daynight.py shows how to shade the regions of a map where the sun has set. ploticos.py demonstrates plotting on unstructured grids. + +lic_demo.py shows how to use vectorplot scikit to visualize vector fields with +Line Integral Convolutions (LIC). Added: trunk/toolkits/basemap/examples/hurrearl.nc =================================================================== (Binary files differ) Property changes on: trunk/toolkits/basemap/examples/hurrearl.nc ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/toolkits/basemap/examples/lic_demo.py =================================================================== --- trunk/toolkits/basemap/examples/lic_demo.py (rev 0) +++ trunk/toolkits/basemap/examples/lic_demo.py 2011-02-11 19:30:12 UTC (rev 8970) @@ -0,0 +1,42 @@ +# example showing how to use Line Integral Convolution to visualize a vector +# flow field (from Hurricane Earl). Produces something akin to streamlines. +# Requires vectorplot scikit (http://scikits.appspot.com/vectorplot). +try: + from netCDF4 import Dataset as NetCDFFile +except ImportError: + from mpl_toolkits.basemap import NetCDFFile +from mpl_toolkits.basemap import Basemap, cm, shiftgrid +import numpy as np +import matplotlib.pyplot as plt +try: + from vectorplot import lic_internal +except ImportError: + raise ImportError('need vectorplot scikit for this example') + +date = '2010090100' +lat0=22.6; lon0=-69.2 + +ncfile = NetCDFFile('hurrearl.nc') +u = ncfile.variables['u10m'][:,:] +v = ncfile.variables['v10m'][:,:] +lons1 = ncfile.variables['lon'][:] +lats1 = ncfile.variables['lat'][:] +lons, lats = np.meshgrid(lons1,lats1) +ncfile.close() + +fig = plt.figure(figsize=(8,8)) +m = Basemap(projection='stere',lat_0=lat0,lon_0=lon0,width=1.e6,height=1.e6,resolution='i') +nxv = 501; nyv = 501 +udat, vdat, xv, yv = m.transform_vector(u,v,lons1,lats1,nxv,nyv,returnxy=True) +texture = np.random.rand(udat.shape[0],udat.shape[1]).astype(np.float32) +kernellen=51 +kernel = np.sin(np.arange(kernellen)*np.pi/kernellen).astype(np.float32) +image = lic_internal.line_integral_convolution(udat.astype(np.float32),\ + vdat.astype(np.float32), texture, kernel) +im = m.imshow(image,plt.cm.gist_stern) +m.drawcoastlines() +m.drawmeridians(np.arange(0,360,2),labels=[0,0,0,1]) +m.drawparallels(np.arange(-30,30,2),labels=[1,0,0,0]) +plt.title('Hurricane Earl flow field visualized with Line Integral Convolution',\ + fontsize=13) +plt.show() Property changes on: trunk/toolkits/basemap/examples/lic_demo.py ___________________________________________________________________ Added: svn:executable + * Modified: trunk/toolkits/basemap/examples/run_all.py =================================================================== --- trunk/toolkits/basemap/examples/run_all.py 2011-02-10 07:37:05 UTC (rev 8969) +++ trunk/toolkits/basemap/examples/run_all.py 2011-02-11 19:30:12 UTC (rev 8970) @@ -10,6 +10,7 @@ test_files.remove('plotsst.py') test_files.remove('embedding_map_in_wx.py') # requires wx test_files.remove('plothighsandlows.py') # requires scipy +test_files.remove('lic_demo.py') print test_files py_path = os.environ.get('PYTHONPATH') if py_path is None: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2011-02-10 07:37:11
|
Revision: 8969 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8969&view=rev Author: efiring Date: 2011-02-10 07:37:05 +0000 (Thu, 10 Feb 2011) Log Message: ----------- LogNorm: speed-up by dealing with mask explicitly Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/colors.py Modified: trunk/matplotlib/lib/matplotlib/colors.py =================================================================== --- trunk/matplotlib/lib/matplotlib/colors.py 2011-02-10 01:21:27 UTC (rev 8968) +++ trunk/matplotlib/lib/matplotlib/colors.py 2011-02-10 07:37:05 UTC (rev 8969) @@ -921,9 +921,17 @@ mask=mask) #result = (ma.log(result)-np.log(vmin))/(np.log(vmax)-np.log(vmin)) # in-place equivalent of above can be much faster - np.ma.log(result, result) - result -= np.log(vmin) - result /= (np.log(vmax) - np.log(vmin)) + resdat = result.data + mask = result.mask + if mask is np.ma.nomask: + mask = (resdat <= 0) + else: + mask |= resdat <= 0 + np.putmask(resdat, mask, 1) + np.log(resdat, resdat) + resdat -= np.log(vmin) + resdat /= (np.log(vmax) - np.log(vmin)) + result = np.ma.array(resdat, mask=mask, copy=False) if is_scalar: result = result[0] return result This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2011-02-10 01:21:34
|
Revision: 8968 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8968&view=rev Author: efiring Date: 2011-02-10 01:21:27 +0000 (Thu, 10 Feb 2011) Log Message: ----------- bugfix: handle alpha correctly in colormapping with uint8 Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/colors.py Modified: trunk/matplotlib/lib/matplotlib/colors.py =================================================================== --- trunk/matplotlib/lib/matplotlib/colors.py 2011-02-09 17:57:14 UTC (rev 8967) +++ trunk/matplotlib/lib/matplotlib/colors.py 2011-02-10 01:21:27 UTC (rev 8968) @@ -547,6 +547,8 @@ if alpha is not None: alpha = min(alpha, 1.0) # alpha must be between 0 and 1 alpha = max(alpha, 0.0) + if bytes: + alpha = int(alpha * 255) if (lut[-1] == 0).all(): lut[:-1, -1] = alpha # All zeros is taken as a flag for the default bad This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-09 17:57:20
|
Revision: 8967 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8967&view=rev Author: jswhit Date: 2011-02-09 17:57:14 +0000 (Wed, 09 Feb 2011) Log Message: ----------- add missing nc file to MANIFEST Modified Paths: -------------- trunk/toolkits/basemap/Changelog trunk/toolkits/basemap/MANIFEST.in Modified: trunk/toolkits/basemap/Changelog =================================================================== --- trunk/toolkits/basemap/Changelog 2011-02-09 07:45:18 UTC (rev 8966) +++ trunk/toolkits/basemap/Changelog 2011-02-09 17:57:14 UTC (rev 8967) @@ -1,4 +1,4 @@ -version 1.0.1 (svn revision 8963) +version 1.0.1 (svn revision 8967) * regenerated C source with cython 0.14.1. * added new "allsky" example from Tom Loredo. * added 'celestial' keyword - if True astronomical convention for Modified: trunk/toolkits/basemap/MANIFEST.in =================================================================== --- trunk/toolkits/basemap/MANIFEST.in 2011-02-09 07:45:18 UTC (rev 8966) +++ trunk/toolkits/basemap/MANIFEST.in 2011-02-09 17:57:14 UTC (rev 8967) @@ -69,7 +69,6 @@ include examples/garp.py include examples/setwh.py include examples/ccsm_popgrid.py -include examples/ccsm_popgrid.nc include examples/plot_tissot.py include examples/cities.dbf include examples/cities.shp @@ -77,6 +76,8 @@ include examples/show_colormaps.py include examples/plotprecip.py include examples/nws_precip_conus_20061222.nc +include examples/C02562.orog.nc +include examples/ccsm_popgrid.nc include examples/NetCDFFile_tst.py include examples/maskoceans.py include examples/README This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2011-02-09 07:45:24
|
Revision: 8966 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8966&view=rev Author: efiring Date: 2011-02-09 07:45:18 +0000 (Wed, 09 Feb 2011) Log Message: ----------- _image.cpp: speed up image_frombyte; patch by C. Gohlke Non-contiguous arrays, such as those resulting from pan and zoom, are handled efficiently without additional copying. This noticeably speeds up zoom and pan on large images. Modified Paths: -------------- trunk/matplotlib/src/_image.cpp Modified: trunk/matplotlib/src/_image.cpp =================================================================== --- trunk/matplotlib/src/_image.cpp 2011-02-09 04:16:08 UTC (rev 8965) +++ trunk/matplotlib/src/_image.cpp 2011-02-09 07:45:18 UTC (rev 8966) @@ -1085,7 +1085,7 @@ Py::Object x = args[0]; int isoutput = Py::Int(args[1]); - PyArrayObject *A = (PyArrayObject *) PyArray_ContiguousFromObject(x.ptr(), PyArray_UBYTE, 3, 3); + PyArrayObject *A = (PyArrayObject *) PyArray_FromObject(x.ptr(), PyArray_UBYTE, 3, 3); if (A == NULL) { throw Py::ValueError("Array must have 3 dimensions"); @@ -1104,35 +1104,86 @@ agg::int8u *arrbuf; agg::int8u *buffer; + agg::int8u *dstbuf; arrbuf = reinterpret_cast<agg::int8u *>(A->data); size_t NUMBYTES(imo->colsIn * imo->rowsIn * imo->BPP); - buffer = new agg::int8u[NUMBYTES]; + buffer = dstbuf = new agg::int8u[NUMBYTES]; if (buffer == NULL) //todo: also handle allocation throw { throw Py::MemoryError("_image_module::frombyte could not allocate memory"); } - const size_t N = imo->rowsIn * imo->colsIn * imo->BPP; - size_t i = 0; - if (A->dimensions[2] == 4) + if PyArray_ISCONTIGUOUS(A) { - memmove(buffer, arrbuf, N); + if (A->dimensions[2] == 4) + { + memmove(dstbuf, arrbuf, imo->rowsIn * imo->colsIn * 4); + } + else + { + size_t i = imo->rowsIn * imo->colsIn; + while (i--) + { + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = 255; + } + } } + else if ((A->strides[1] == 4) && (A->strides[2] == 1)) + { + const size_t N = imo->colsIn * 4; + const size_t stride = A->strides[0]; + for (size_t rownum = 0; rownum < imo->rowsIn; rownum++) + { + memmove(dstbuf, arrbuf, N); + arrbuf += stride; + dstbuf += N; + } + } + else if ((A->strides[1] == 3) && (A->strides[2] == 1)) + { + const size_t stride = A->strides[0] - imo->colsIn * 3; + for (size_t rownum = 0; rownum < imo->rowsIn; rownum++) + { + for (size_t colnum = 0; colnum < imo->colsIn; colnum++) + { + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = *arrbuf++; + *dstbuf++ = 255; + } + arrbuf += stride; + } + } else { - while (i < N) + PyArrayIterObject *iter; + iter = (PyArrayIterObject *)PyArray_IterNew((PyObject *)A); + if (A->dimensions[2] == 4) { - memmove(buffer, arrbuf, 3); - buffer += 3; - arrbuf += 3; - *buffer++ = 255; - i += 4; + while (iter->index < iter->size) { + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + } } - buffer -= N; - arrbuf -= imo->rowsIn * imo->colsIn; + else + { + while (iter->index < iter->size) { + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + *dstbuf++ = *((unsigned char *)iter->dataptr); + PyArray_ITER_NEXT(iter); + *dstbuf++ = 255; + } + } + Py_DECREF(iter); } if (isoutput) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2011-02-09 04:16:14
|
Revision: 8965 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8965&view=rev Author: efiring Date: 2011-02-09 04:16:08 +0000 (Wed, 09 Feb 2011) Log Message: ----------- Normalize: major speed-up via bypassing masked array division Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/colors.py Modified: trunk/matplotlib/lib/matplotlib/colors.py =================================================================== --- trunk/matplotlib/lib/matplotlib/colors.py 2011-02-08 13:27:16 UTC (rev 8964) +++ trunk/matplotlib/lib/matplotlib/colors.py 2011-02-09 04:16:08 UTC (rev 8965) @@ -853,8 +853,11 @@ mask = ma.getmask(result) result = ma.array(np.clip(result.filled(vmax), vmin, vmax), mask=mask) - result -= vmin - result /= vmax - vmin + # ma division is very slow; we can take a shortcut + resdat = result.data + resdat -= vmin + resdat /= (vmax - vmin) + result = np.ma.array(resdat, mask=result.mask, copy=False) if is_scalar: result = result[0] return result This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <js...@us...> - 2011-02-08 13:27:22
|
Revision: 8964 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8964&view=rev Author: jswhit Date: 2011-02-08 13:27:16 +0000 (Tue, 08 Feb 2011) Log Message: ----------- don't run allskymap module. Modified Paths: -------------- trunk/toolkits/basemap/examples/run_all.py Modified: trunk/toolkits/basemap/examples/run_all.py =================================================================== --- trunk/toolkits/basemap/examples/run_all.py 2011-02-08 13:20:01 UTC (rev 8963) +++ trunk/toolkits/basemap/examples/run_all.py 2011-02-08 13:27:16 UTC (rev 8964) @@ -1,6 +1,7 @@ import glob, os, sys test_files = glob.glob('*.py') test_files.remove('run_all.py') +test_files.remove('allskymap.py') test_files.remove('fcstmaps.py') test_files.remove('fcstmaps_axesgrid.py') test_files.remove('testgdal.py') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |