From: <wea...@us...> - 2010-07-14 02:42:26
|
Revision: 8543 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8543&view=rev Author: weathergod Date: 2010-07-14 02:42:19 +0000 (Wed, 14 Jul 2010) Log Message: ----------- Added documentation and examples for new, easier Axes3D use. Modified Paths: -------------- branches/v1_0_maint/doc/mpl_toolkits/mplot3d/tutorial.rst branches/v1_0_maint/examples/mplot3d/2dcollections3d_demo.py branches/v1_0_maint/examples/mplot3d/bars3d_demo.py branches/v1_0_maint/examples/mplot3d/contour3d_demo.py branches/v1_0_maint/examples/mplot3d/contour3d_demo2.py branches/v1_0_maint/examples/mplot3d/contour3d_demo3.py branches/v1_0_maint/examples/mplot3d/contourf3d_demo.py branches/v1_0_maint/examples/mplot3d/hist3d_demo.py branches/v1_0_maint/examples/mplot3d/lines3d_demo.py branches/v1_0_maint/examples/mplot3d/pathpatch3d_demo.py branches/v1_0_maint/examples/mplot3d/polys3d_demo.py branches/v1_0_maint/examples/mplot3d/rotate_axes3d_demo.py branches/v1_0_maint/examples/mplot3d/scatter3d_demo.py branches/v1_0_maint/examples/mplot3d/subplot3d_demo.py branches/v1_0_maint/examples/mplot3d/surface3d_demo.py branches/v1_0_maint/examples/mplot3d/surface3d_demo2.py branches/v1_0_maint/examples/mplot3d/surface3d_demo3.py branches/v1_0_maint/examples/mplot3d/surface3d_radial_demo.py branches/v1_0_maint/examples/mplot3d/text3d_demo.py branches/v1_0_maint/examples/mplot3d/wire3d_animation_demo.py branches/v1_0_maint/examples/mplot3d/wire3d_demo.py Added Paths: ----------- branches/v1_0_maint/examples/mplot3d/mixed_subplots_demo.py Modified: branches/v1_0_maint/doc/mpl_toolkits/mplot3d/tutorial.rst =================================================================== --- branches/v1_0_maint/doc/mpl_toolkits/mplot3d/tutorial.rst 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/doc/mpl_toolkits/mplot3d/tutorial.rst 2010-07-14 02:42:19 UTC (rev 8543) @@ -7,13 +7,15 @@ Getting started =============== -Create a new :class:`matplotlib.figure.Figure` and an -:class:`~mpl_toolkits.mplot3d.Axes3D` object in it:: +An Axes3D object is created just like any other axes using +the projection='3d' keyword. +Create a new :class:`matplotlib.figure.Figure` and +add a new axes to it of type :class:`~mpl_toolkits.mplot3d.Axes3D`:: - import pylab - fig = pylab.figure() + import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D - ax = Axes3D(fig) + fig = pyplt.figure() + ax = fig.add_subplot(111, projection='3d') Line plots ==================== @@ -39,6 +41,7 @@ .. plot:: mpl_examples/mplot3d/surface3d_demo.py .. plot:: mpl_examples/mplot3d/surface3d_demo2.py +.. plot:: mpl_examples/mplot3d/surface3d_demo3.py Contour plots ============= @@ -46,6 +49,7 @@ .. plot:: mpl_examples/mplot3d/contour3d_demo.py .. plot:: mpl_examples/mplot3d/contour3d_demo2.py +.. plot:: mpl_examples/mplot3d/contour3d_demo3.py Filled contour plots ==================== @@ -75,3 +79,11 @@ .. plot:: mpl_examples/mplot3d/text3d_demo.py +Subplotting +==================== +Having multiple 3D plots in a single figure is the same +as it is for 2D plots. And you can mix 2D and 3D plots +into the same figure. + +.. plot:: mpl_examples/mplot3d/subplot3d_demo.py +.. plot:: mpl_examples/mplot3d/mixed_subplots_demo.py Modified: branches/v1_0_maint/examples/mplot3d/2dcollections3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/2dcollections3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/2dcollections3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') x = np.linspace(0, 1, 100) y = np.sin(x * 2 * np.pi) / 2 + 0.5 Modified: branches/v1_0_maint/examples/mplot3d/bars3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/bars3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/bars3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20) ys = np.random.rand(20) Modified: branches/v1_0_maint/examples/mplot3d/contour3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/contour3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/contour3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) Modified: branches/v1_0_maint/examples/mplot3d/contour3d_demo2.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/contour3d_demo2.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/contour3d_demo2.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contour(X, Y, Z, 16, extend3d=True) ax.clabel(cset, fontsize=9, inline=1) Modified: branches/v1_0_maint/examples/mplot3d/contour3d_demo3.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/contour3d_demo3.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/contour3d_demo3.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) cset = ax.contour(X, Y, Z, zdir='z', offset=-100) Modified: branches/v1_0_maint/examples/mplot3d/contourf3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/contourf3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/contourf3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.gca(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) cset = ax.contourf(X, Y, Z) ax.clabel(cset, fontsize=9, inline=1) Modified: branches/v1_0_maint/examples/mplot3d/hist3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/hist3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/hist3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') x, y = np.random.rand(2, 100) * 4 hist, xedges, yedges = np.histogram2d(x, y, bins=4) Modified: branches/v1_0_maint/examples/mplot3d/lines3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/lines3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/lines3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -6,7 +6,7 @@ mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) z = np.linspace(-2, 2, 100) r = z**2 + 1 Added: branches/v1_0_maint/examples/mplot3d/mixed_subplots_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/mixed_subplots_demo.py (rev 0) +++ branches/v1_0_maint/examples/mplot3d/mixed_subplots_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -0,0 +1,48 @@ +""" +Demonstrate the mixing of 2d and 3d subplots +""" +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +import numpy as np + +def f(t): + s1 = np.cos(2*np.pi*t) + e1 = np.exp(-t) + return np.multiply(s1,e1) + + +################ +# First subplot +################ +t1 = np.arange(0.0, 5.0, 0.1) +t2 = np.arange(0.0, 5.0, 0.02) +t3 = np.arange(0.0, 2.0, 0.01) + +fig = plt.figure() +fig.suptitle('A tale of 2 subplots') +ax = fig.add_subplot(2, 1, 1) +l = ax.plot(t1, f(t1), 'bo', + t2, f(t2), 'k--', markerfacecolor='green') +ax.grid(True) +ax.set_ylabel('Damped oscillation') + + +################# +# Second subplot +################# +ax = fig.add_subplot(2, 1, 2, projection='3d') +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1, 1) + +plt.show() + Modified: branches/v1_0_maint/examples/mplot3d/pathpatch3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/pathpatch3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/pathpatch3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -25,7 +25,7 @@ fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') p = Circle((5, 5), 3) ax.add_patch(p) Modified: branches/v1_0_maint/examples/mplot3d/polys3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/polys3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/polys3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -5,7 +5,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) Modified: branches/v1_0_maint/examples/mplot3d/rotate_axes3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/rotate_axes3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/rotate_axes3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -5,7 +5,7 @@ plt.ion() fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.1) ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5) Modified: branches/v1_0_maint/examples/mplot3d/scatter3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/scatter3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/scatter3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -6,7 +6,7 @@ return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') n = 100 for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: xs = randrange(n, 23, 32) Modified: branches/v1_0_maint/examples/mplot3d/subplot3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/subplot3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/subplot3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -1,11 +1,16 @@ from mpl_toolkits.mplot3d.axes3d import Axes3D -from matplotlib import cm -#from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter import matplotlib.pyplot as plt + + +# imports specific to the plots in this example import numpy as np +from matplotlib import cm +from mpl_toolkits.mplot3d.axes3d import get_test_data -fig = plt.figure() +fig = plt.figure(figsize=(9.5,5.0)) + +#---- First subplot ax = fig.add_subplot(1, 2, 1, projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) @@ -16,12 +21,9 @@ linewidth=0, antialiased=False) ax.set_zlim3d(-1.01, 1.01) -#ax.w_zaxis.set_major_locator(LinearLocator(10)) -#ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) +fig.colorbar(surf, shrink=0.5, aspect=10) -fig.colorbar(surf, shrink=0.5, aspect=5) - -from mpl_toolkits.mplot3d.axes3d import get_test_data +#---- Second subplot ax = fig.add_subplot(1, 2, 2, projection='3d') X, Y, Z = get_test_data(0.05) ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) Modified: branches/v1_0_maint/examples/mplot3d/surface3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/surface3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/surface3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -5,7 +5,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) Modified: branches/v1_0_maint/examples/mplot3d/surface3d_demo2.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/surface3d_demo2.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/surface3d_demo2.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) Modified: branches/v1_0_maint/examples/mplot3d/surface3d_demo3.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/surface3d_demo3.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/surface3d_demo3.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -5,7 +5,7 @@ import numpy as np fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) xlen = len(X) Y = np.arange(-5, 5, 0.25) Modified: branches/v1_0_maint/examples/mplot3d/surface3d_radial_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/surface3d_radial_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/surface3d_radial_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -8,7 +8,7 @@ step = 0.04 maxval = 1.0 fig = plt.figure() -ax = Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') # create supporting points in polar coordinates r = np.linspace(0,1.25,50) Modified: branches/v1_0_maint/examples/mplot3d/text3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/text3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/text3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -2,7 +2,7 @@ import matplotlib.pyplot as plt fig = plt.figure() -ax = Axes3D(fig) +ax = fig.gca(projection='3d') zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1)) xs = (2, 6, 4, 9, 7, 2) Modified: branches/v1_0_maint/examples/mplot3d/wire3d_animation_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/wire3d_animation_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/wire3d_animation_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -1,3 +1,6 @@ +""" +A very simple 'animation' of a 3D plot +""" from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt import numpy as np @@ -9,7 +12,7 @@ plt.ion() fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') xs = np.linspace(-1, 1, 50) ys = np.linspace(-1, 1, 50) Modified: branches/v1_0_maint/examples/mplot3d/wire3d_demo.py =================================================================== --- branches/v1_0_maint/examples/mplot3d/wire3d_demo.py 2010-07-13 16:48:20 UTC (rev 8542) +++ branches/v1_0_maint/examples/mplot3d/wire3d_demo.py 2010-07-14 02:42:19 UTC (rev 8543) @@ -3,7 +3,7 @@ import numpy as np fig = plt.figure() -ax = axes3d.Axes3D(fig) +ax = fig.add_subplot(111, projection='3d') X, Y, Z = axes3d.get_test_data(0.05) ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ian...@us...> - 2010-07-16 13:46:20
|
Revision: 8559 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8559&view=rev Author: ianthomas23 Date: 2010-07-16 13:46:14 +0000 (Fri, 16 Jul 2010) Log Message: ----------- Added tri* functions to pyplot docs. Modified Paths: -------------- branches/v1_0_maint/doc/_templates/index.html branches/v1_0_maint/doc/api/api_changes.rst branches/v1_0_maint/lib/matplotlib/pylab.py branches/v1_0_maint/lib/matplotlib/tri/tricontour.py Modified: branches/v1_0_maint/doc/_templates/index.html =================================================================== --- branches/v1_0_maint/doc/_templates/index.html 2010-07-15 20:47:28 UTC (rev 8558) +++ branches/v1_0_maint/doc/_templates/index.html 2010-07-16 13:46:14 UTC (rev 8559) @@ -994,7 +994,6 @@ </td> </tr> - <tr> <th align="left"> <a href="api/pyplot_api.html#matplotlib.pyplot.title">title</a> @@ -1008,6 +1007,50 @@ </tr> <tr> <th align="left"> + <a href="api/pyplot_api.html#matplotlib.pyplot.tricontour">tricontour</a> + + </th> + + <td align="left"> + make a contour plot on a triangular grid + </td> + + </tr> + <tr> + <th align="left"> + <a href="api/pyplot_api.html#matplotlib.pyplot.tricontourf">tricontourf</a> + + </th> + + <td align="left"> + make a filled contour plot on a triangular grid + </td> + + </tr> + <tr> + <th align="left"> + <a href="api/pyplot_api.html#matplotlib.pyplot.tripcolor">tripcolor</a> + + </th> + + <td align="left"> + make a pseudocolor plot on a triangular grid + </td> + + </tr> + <tr> + <th align="left"> + <a href="api/pyplot_api.html#matplotlib.pyplot.triplot">triplot</a> + + </th> + + <td align="left"> + plot a triangular grid + </td> + + </tr> + <tr> + <th align="left"> <a href="api/pyplot_api.html#matplotlib.pyplot.xcorr">xcorr</a> </th> Modified: branches/v1_0_maint/doc/api/api_changes.rst =================================================================== --- branches/v1_0_maint/doc/api/api_changes.rst 2010-07-15 20:47:28 UTC (rev 8558) +++ branches/v1_0_maint/doc/api/api_changes.rst 2010-07-16 13:46:14 UTC (rev 8559) @@ -117,6 +117,21 @@ draw_image(self, gc, x, y, im) +* There are four new Axes methods with corresponding pyplot + functions that deal with unstructured triangular grids: + + + :meth:`matplotlib.axes.Axes.tricontour` draws contour lines + on a triangular grid. + + + :meth:`matplotlib.axes.Axes.tricontourf` draws filled contours + on a triangular grid. + + + :meth:`matplotlib.axes.Axes.tripcolor` draws a pseudocolor + plot on a triangular grid. + + + :meth:`matplotlib.axes.Axes.triplot` draws a triangular grid + as lines and/or markers. + Changes in 0.99 ====================== Modified: branches/v1_0_maint/lib/matplotlib/pylab.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/pylab.py 2010-07-15 20:47:28 UTC (rev 8558) +++ branches/v1_0_maint/lib/matplotlib/pylab.py 2010-07-16 13:46:14 UTC (rev 8559) @@ -92,6 +92,10 @@ tick_params - control the appearance of ticks and tick labels ticklabel_format - control the format of tick labels title - add a title to the current axes + tricontour - make a contour plot on a triangular grid + tricontourf - make a filled contour plot on a triangular grid + tripcolor - make a pseudocolor plot on a triangular grid + triplot - plot a triangular grid xcorr - plot the autocorrelation function of x and y xlim - set/get the xlimits ylim - set/get the ylimits Modified: branches/v1_0_maint/lib/matplotlib/tri/tricontour.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/tri/tricontour.py 2010-07-15 20:47:28 UTC (rev 8558) +++ branches/v1_0_maint/lib/matplotlib/tri/tricontour.py 2010-07-16 13:46:14 UTC (rev 8559) @@ -93,7 +93,8 @@ tricontour_doc = """ :func:`~matplotlib.pyplot.tricontour` and :func:`~matplotlib.pyplot.tricontourf` draw contour lines and - filled contours, respectively. Except as noted, function + filled contours, respectively, on an unstructured triangular + grid. Except as noted, function signatures and return values are the same for both versions. The triangulation can be specified in one of two ways; either:: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ds...@us...> - 2010-07-20 14:01:02
|
Revision: 8566 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8566&view=rev Author: dsdale Date: 2010-07-20 14:00:55 +0000 (Tue, 20 Jul 2010) Log Message: ----------- Return Qt4's default cursor when leaving the canvas Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-07-17 07:08:43 UTC (rev 8565) +++ branches/v1_0_maint/CHANGELOG 2010-07-20 14:00:55 UTC (rev 8566) @@ -1,3 +1,5 @@ +2010-07-20 Return Qt4's default cursor when leaving the canvas - DSD + 2010-07-06 Tagging for mpl 1.0 at r8502 Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py 2010-07-17 07:08:43 UTC (rev 8565) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_qt4.py 2010-07-20 14:00:55 UTC (rev 8566) @@ -150,6 +150,7 @@ FigureCanvasBase.enter_notify_event(self, event) def leaveEvent(self, event): + QtGui.QApplication.restoreOverrideCursor() FigureCanvasBase.leave_notify_event(self, event) def mousePressEvent( self, event ): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-07-27 17:26:57
|
Revision: 8583 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8583&view=rev Author: mdboom Date: 2010-07-27 17:26:50 +0000 (Tue, 27 Jul 2010) Log Message: ----------- [3034778] line width arguments don't work in pcolormesh Also, support clipping paths on images in SVG backend. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/backend_bases.py branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py branches/v1_0_maint/lib/matplotlib/collections.py branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg branches/v1_0_maint/lib/matplotlib/tests/test_axes.py branches/v1_0_maint/lib/matplotlib/tests/test_image.py branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py branches/v1_0_maint/src/_backend_agg.cpp Added Paths: ----------- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/pcolormesh.svg Modified: branches/v1_0_maint/lib/matplotlib/backend_bases.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backend_bases.py 2010-07-27 16:01:47 UTC (rev 8582) +++ branches/v1_0_maint/lib/matplotlib/backend_bases.py 2010-07-27 17:26:50 UTC (rev 8583) @@ -208,10 +208,10 @@ if showedges: edgecolors = np.array([[0.0, 0.0, 0.0, 1.0]], np.float_) - linewidths = np.array([1.0], np.float_) + linewidths = np.array([gc.get_linewidth()], np.float_) else: edgecolors = facecolors - linewidths = np.array([0.0], np.float_) + linewidths = np.array([gc.get_linewidth()], np.float_) return self.draw_path_collection( gc, master_transform, paths, [], offsets, offsetTrans, facecolors, Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py 2010-07-27 16:01:47 UTC (rev 8582) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py 2010-07-27 17:26:50 UTC (rev 8583) @@ -389,7 +389,12 @@ write('</g>\n') def draw_image(self, gc, x, y, im): - # MGDTODO: Support clippath here + clipid = self._get_gc_clip_svg(gc) + if clipid is None: + clippath = '' + else: + clippath = 'clip-path="url(#%s)"' % clipid + trans = [1,0,0,1,0,0] transstr = '' if rcParams['svg.image_noscale']: @@ -410,7 +415,9 @@ self._svgwriter.write('<a xlink:href="%s">' % url) self._svgwriter.write ( '<image x="%f" y="%f" width="%f" height="%f" ' - '%s xlink:href="'%(x/trans[0], (self.height-y)/trans[3]-h, w, h, transstr) + '%s %s xlink:href="' % ( + x/trans[0], (self.height-y)/trans[3]-h, w, h, + transstr, clippath) ) if rcParams['svg.image_inline']: Modified: branches/v1_0_maint/lib/matplotlib/collections.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/collections.py 2010-07-27 16:01:47 UTC (rev 8582) +++ branches/v1_0_maint/lib/matplotlib/collections.py 2010-07-27 17:26:50 UTC (rev 8583) @@ -1228,6 +1228,7 @@ gc = renderer.new_gc() self._set_gc_clip(gc) + gc.set_linewidth(self.get_linewidth()[0]) if self._shading == 'gouraud': triangles, colors = self.convert_mesh_to_triangles( Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg 2010-07-27 16:01:47 UTC (rev 8582) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg 2010-07-27 17:26:50 UTC (rev 8583) @@ -18,994 +18,1000 @@ <path style="fill: #ffffff; opacity: 1.000000" d="M122.400000 388.800000L468.000000 388.800000L468.000000 43.200000 L122.400000 43.200000L122.400000 388.800000"/> </g> -<image x="122.400000" y="41.800000" width="347.000000" height="347.000000" xlink:href="data:image/png;base64, +<defs> + <clipPath id="p3268b4c49a7b373f0e4e01e239475b1d"> +<rect x="122.400000" y="43.200000" width="345.600000" height="345.600000"/> + </clipPath> +</defs><image x="122.400000" y="41.800000" width="347.000000" height="347.000000" clip-path="url(#p3268b4c49a7b373f0e4e01e239475b1d)" xlink:href="data:image/png;base64, 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... [truncated message content] |
From: <md...@us...> - 2010-07-28 18:33:17
|
Revision: 8585 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8585&view=rev Author: mdboom Date: 2010-07-28 18:33:11 +0000 (Wed, 28 Jul 2010) Log Message: ----------- Fix problems displaying images with zero (logical) width. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/image.py branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg branches/v1_0_maint/src/_image.cpp Modified: branches/v1_0_maint/lib/matplotlib/image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/image.py 2010-07-27 17:28:58 UTC (rev 8584) +++ branches/v1_0_maint/lib/matplotlib/image.py 2010-07-28 18:33:11 UTC (rev 8585) @@ -147,8 +147,14 @@ dyintv = ymax-ymin # the viewport scale factor - sx = dxintv/viewlim.width - sy = dyintv/viewlim.height + if viewlim.width == 0.0 and dxintv == 0.0: + sx = 1.0 + else: + sx = dxintv/viewlim.width + if viewlim.height == 0.0 and dyintv == 0.0: + sy = 1.0 + else: + sy = dyintv/viewlim.height numrows, numcols = A.shape[:2] if sx > 2: x0 = (viewlim.x0-xmin)/dxintv * numcols @@ -576,9 +582,17 @@ im.set_resample(self._resample) # the viewport translation - tx = (xmin-transformed_viewLim.x0)/dxintv * numcols - ty = (ymin-transformed_viewLim.y0)/dyintv * numrows + if dxintv == 0.0: + tx = 0.0 + else: + tx = (xmin-transformed_viewLim.x0)/dxintv * numcols + if dyintv == 0.0: + ty = 0.0 + else: + ty = (ymin-transformed_viewLim.y0)/dyintv * numrows + im.apply_translation(tx, ty) + l, b, r, t = self.axes.bbox.extents widthDisplay = (round(r*magnification) + 0.5) - (round(l*magnification) - 0.5) heightDisplay = (round(t*magnification) + 0.5) - (round(b*magnification) - 0.5) @@ -586,7 +600,7 @@ # resize viewport to display rx = widthDisplay / numcols - ry = heightDisplay / numrows + ry = heightDisplay / numrows im.apply_scaling(rx*sx, ry*sy) im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), norm=self._filternorm, radius=self._filterrad) Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg 2010-07-27 17:28:58 UTC (rev 8584) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_image/image_clip.svg 2010-07-28 18:33:11 UTC (rev 8585) @@ -25,7 +25,19 @@ C122.400000 261.827096 140.607298 305.783402 173.011948 338.188052 C205.416598 370.592702 249.372904 388.800000 295.200000 388.800000z"/> </g> -<image x="122.400000" y="41.800000" width="347.000000" height="347.000000" xlink:href="data:image/png;base64, +<defs> + <clipPath id="p904278a4c1c81ab8b13ccb57b319fa38"> +<path d="M295.200000 388.800000 +C341.027096 388.800000 384.983402 370.592702 417.388052 338.188052 +C449.792702 305.783402 468.000000 261.827096 468.000000 216.000000 +C468.000000 170.172904 449.792702 126.216598 417.388052 93.811948 +C384.983402 61.407298 341.027096 43.200000 295.200000 43.200000 +C249.372904 43.200000 205.416598 61.407298 173.011948 93.811948 +C140.607298 126.216598 122.400000 170.172904 122.400000 216.000000 +C122.400000 261.827096 140.607298 305.783402 173.011948 338.188052 +C205.416598 370.592702 249.372904 388.800000 295.200000 388.800000z"/> + </clipPath> +</defs><image x="122.400000" y="41.800000" width="347.000000" height="347.000000" clip-path="url(#p904278a4c1c81ab8b13ccb57b319fa38)" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAVsAAAFbCAYAAAB7zy3tAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJztfeGS4zzLLNp67vvc+XJ+WECDkJ2ZjTJvfdNdtRtbQggpcbuNZc8Q+X8qxPsxhsiwzyHy54v7 Q64ygbq6/6++v9LXru+dr+/sC2z/edh/1fd35uex73+Y++98z9/9HXz1u5DLLXEGf346AIIgiN8A @@ -608,7 +620,7 @@ </g> <g id="ytick8"> <g id="text19"> -<g style="fill: #000000; opacity: 1.000000" transform="translate(118.332060,125.327188)scale(0.120000)"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(118.332060,125.327187)scale(0.120000)"> <use xlink:href="#c_3dcfa38a02242cb63ec6726c6e70be7a"/> <use xlink:href="#c_7a2040fe3b94fcd41d0a72c84e93b115" x="63.623047"/> <use xlink:href="#c_40880da00a2fb346f185ce8104650367" x="127.246094"/> Modified: branches/v1_0_maint/src/_image.cpp =================================================================== --- branches/v1_0_maint/src/_image.cpp 2010-07-27 17:28:58 UTC (rev 8584) +++ branches/v1_0_maint/src/_image.cpp 2010-07-28 18:33:11 UTC (rev 8585) @@ -392,7 +392,6 @@ // the image path agg::path_storage path; - agg::int8u *bufferPad = NULL; agg::rendering_buffer rbufPad; double x0, y0, x1, y1; @@ -541,9 +540,7 @@ } - delete [] bufferPad; return Py::Object(); - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2010-08-14 21:22:04
|
Revision: 8628 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8628&view=rev Author: efiring Date: 2010-08-14 21:21:58 +0000 (Sat, 14 Aug 2010) Log Message: ----------- fix bugs: patch alpha handling, bar color kwarg interpretation This changeset is somewhat intrusive, with side-effects of moving most patch color handling out of the draw method, and of changing rgb2hex to allow rgba. This simplifies backend_svg slightly. Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/lib/matplotlib/axes.py branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py branches/v1_0_maint/lib/matplotlib/colors.py branches/v1_0_maint/lib/matplotlib/patches.py Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-08-13 18:23:33 UTC (rev 8627) +++ branches/v1_0_maint/CHANGELOG 2010-08-14 21:21:58 UTC (rev 8628) @@ -1,3 +1,5 @@ +2010-08-14 Fix bug in patch alpha handling, and in bar color kwarg - EF + 2010-07-20 Return Qt4's default cursor when leaving the canvas - DSD 2010-07-06 Tagging for mpl 1.0 at r8502 Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2010-08-13 18:23:33 UTC (rev 8627) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2010-08-14 21:21:58 UTC (rev 8628) @@ -4579,6 +4579,8 @@ color = [None] * nbars else: color = list(mcolors.colorConverter.to_rgba_array(color)) + if len(color) == 0: # until to_rgba_array is changed + color = [[0,0,0,0]] if len(color) < nbars: color *= nbars @@ -4586,6 +4588,8 @@ edgecolor = [None] * nbars else: edgecolor = list(mcolors.colorConverter.to_rgba_array(edgecolor)) + if len(edgecolor) == 0: # until to_rgba_array is changed + edgecolor = [[0,0,0,0]] if len(edgecolor) < nbars: edgecolor *= nbars Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py 2010-08-13 18:23:33 UTC (rev 8627) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_svg.py 2010-08-14 21:21:58 UTC (rev 8628) @@ -118,7 +118,7 @@ '<rect x="0" y="0" width="%d" height="%d" fill="%s"/>' % (HATCH_SIZE+1, HATCH_SIZE+1, fill)) path = '<path d="%s" fill="%s" stroke="%s" stroke-width="1.0"/>' % ( - path_data, rgb2hex(gc.get_rgb()[:3]), rgb2hex(gc.get_rgb()[:3])) + path_data, rgb2hex(gc.get_rgb()), rgb2hex(gc.get_rgb())) self._svgwriter.write(path) self._svgwriter.write('\n </pattern>\n</defs>') self._hatchd[dictkey] = id @@ -135,7 +135,7 @@ if rgbFace is None: fill = 'none' else: - fill = rgb2hex(rgbFace[:3]) + fill = rgb2hex(rgbFace) offset, seq = gc.get_dashes() if seq is None: @@ -149,7 +149,7 @@ return 'fill: %s; stroke: %s; stroke-width: %f; ' \ 'stroke-linejoin: %s; stroke-linecap: %s; %s opacity: %f' % ( fill, - rgb2hex(gc.get_rgb()[:3]), + rgb2hex(gc.get_rgb()), linewidth, gc.get_joinstyle(), _capstyle_d[gc.get_capstyle()], @@ -469,7 +469,7 @@ glyph_map=self._glyph_map text2path = self._text2path - color = rgb2hex(gc.get_rgb()[:3]) + color = rgb2hex(gc.get_rgb()) fontsize = prop.get_size_in_points() write = self._svgwriter.write @@ -592,7 +592,7 @@ y -= font.get_descent() / 64.0 fontsize = prop.get_size_in_points() - color = rgb2hex(gc.get_rgb()[:3]) + color = rgb2hex(gc.get_rgb()) write = self._svgwriter.write if rcParams['svg.embed_char_paths']: @@ -730,7 +730,7 @@ self.mathtext_parser.parse(s, 72, prop) svg_glyphs = svg_elements.svg_glyphs svg_rects = svg_elements.svg_rects - color = rgb2hex(gc.get_rgb()[:3]) + color = rgb2hex(gc.get_rgb()) write = self._svgwriter.write style = "fill: %s" % color Modified: branches/v1_0_maint/lib/matplotlib/colors.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/colors.py 2010-08-13 18:23:33 UTC (rev 8627) +++ branches/v1_0_maint/lib/matplotlib/colors.py 2010-08-14 21:21:58 UTC (rev 8628) @@ -217,8 +217,8 @@ def rgb2hex(rgb): - 'Given a len 3 rgb tuple of 0-1 floats, return the hex string' - return '#%02x%02x%02x' % tuple([round(val*255) for val in rgb]) + 'Given an rgb or rgba sequence of 0-1 floats, return the hex string' + return '#%02x%02x%02x' % tuple([round(val*255) for val in rgb[:3]]) hexColorPattern = re.compile("\A#[a-fA-F0-9]{6}\Z") Modified: branches/v1_0_maint/lib/matplotlib/patches.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/patches.py 2010-08-13 18:23:33 UTC (rev 8627) +++ branches/v1_0_maint/lib/matplotlib/patches.py 2010-08-14 21:21:58 UTC (rev 8628) @@ -55,6 +55,7 @@ def __init__(self, edgecolor=None, facecolor=None, + color=None, linewidth=None, linestyle=None, antialiased = None, @@ -74,20 +75,22 @@ if linestyle is None: linestyle = "solid" if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] - if 'color' in kwargs: + self._fill = True # needed for set_facecolor call + if color is not None: if (edgecolor is not None or facecolor is not None): import warnings warnings.warn("Setting the 'color' property will override" "the edgecolor or facecolor properties. ") - - self.set_edgecolor(edgecolor) - self.set_facecolor(facecolor) + self.set_color(color) + else: + self.set_edgecolor(edgecolor) + self.set_facecolor(facecolor) self.set_linewidth(linewidth) self.set_linestyle(linestyle) self.set_antialiased(antialiased) self.set_hatch(hatch) - self.fill = fill + self.set_fill(fill) self._combined_transform = transforms.IdentityTransform() self.set_path_effects(path_effects) @@ -98,7 +101,7 @@ """ Return a copy of the vertices used in this patch - If the patch contains Bézier curves, the curves will be + If the patch contains Bezier curves, the curves will be interpolated by line segments. To access the curves as curves, use :meth:`get_path`. """ @@ -223,7 +226,7 @@ ACCEPTS: mpl color spec, or None for default, or 'none' for no color """ if color is None: color = mpl.rcParams['patch.edgecolor'] - self._edgecolor = color + self._edgecolor = colors.colorConverter.to_rgba(color, self._alpha) def set_ec(self, color): """alias for set_edgecolor""" @@ -236,7 +239,12 @@ ACCEPTS: mpl color spec, or None for default, or 'none' for no color """ if color is None: color = mpl.rcParams['patch.facecolor'] - self._facecolor = color + self._original_facecolor = color # save: otherwise changing _fill + # may lose alpha information + self._facecolor = colors.colorConverter.to_rgba(color, self._alpha) + if not self._fill: + self._facecolor = list(self._facecolor) + self._facecolor[3] = 0 def set_fc(self, color): """alias for set_facecolor""" @@ -256,7 +264,22 @@ self.set_facecolor(c) self.set_edgecolor(c) + def set_alpha(self, alpha): + """ + Set the alpha tranparency of the patch. + ACCEPTS: float or None + """ + if alpha is not None: + try: + float(alpha) + except TypeError: + raise TypeError('alpha must be a float or None') + artist.Artist.set_alpha(self, alpha) + self.set_facecolor(self._original_facecolor) # using self._fill and self._alpha + self._edgecolor = colors.colorConverter.to_rgba( + self._edgecolor[:3], self._alpha) + def set_linewidth(self, w): """ Set the patch linewidth in points @@ -289,11 +312,12 @@ ACCEPTS: [True | False] """ - self.fill = b + self._fill = b + self.set_facecolor(self._original_facecolor) def get_fill(self): 'return whether fill is set' - return self.fill + return self._fill def set_hatch(self, hatch): """ @@ -345,29 +369,25 @@ renderer.open_group('patch', self.get_gid()) gc = renderer.new_gc() - if cbook.is_string_like(self._edgecolor) and self._edgecolor.lower()=='none': - gc.set_linewidth(0) - else: - gc.set_foreground(self._edgecolor) - gc.set_linewidth(self._linewidth) - gc.set_linestyle(self._linestyle) + gc.set_alpha(self._edgecolor[3]) + gc.set_foreground(self._edgecolor, isRGB=True) + lw = self._linewidth + if self._edgecolor[3] == 0: + lw = 0 + gc.set_linewidth(lw) + gc.set_linestyle(self._linestyle) + gc.set_antialiased(self._antialiased) self._set_gc_clip(gc) gc.set_capstyle('projecting') gc.set_url(self._url) gc.set_snap(self.get_snap()) - if (not self.fill or self._facecolor is None or - (cbook.is_string_like(self._facecolor) and self._facecolor.lower()=='none')): - rgbFace = None - gc.set_alpha(1.0) - else: - r, g, b, a = colors.colorConverter.to_rgba(self._facecolor, self._alpha) - rgbFace = (r, g, b) - gc.set_alpha(a) + rgbFace = self._facecolor + if rgbFace[3] == 0: + rgbFace = None # (some?) renderers expect this as no-fill signal - if self._hatch: gc.set_hatch(self._hatch ) @@ -3823,7 +3843,7 @@ ) #if not fillable: - # self.fill = False + # self._fill = False return _path, fillable @@ -3831,32 +3851,28 @@ def draw(self, renderer): if not self.get_visible(): return - #renderer.open_group('patch') + + renderer.open_group('patch', self.get_gid()) gc = renderer.new_gc() + gc.set_alpha(self._edgecolor[3]) + gc.set_foreground(self._edgecolor, isRGB=True) - if cbook.is_string_like(self._edgecolor) and self._edgecolor.lower()=='none': - gc.set_linewidth(0) - else: - gc.set_foreground(self._edgecolor) - gc.set_linewidth(self._linewidth) - gc.set_linestyle(self._linestyle) + lw = self._linewidth + if self._edgecolor[3] == 0: + lw = 0 + gc.set_linewidth(lw) + gc.set_linestyle(self._linestyle) gc.set_antialiased(self._antialiased) self._set_gc_clip(gc) gc.set_capstyle('round') gc.set_snap(self.get_snap()) - if (not self.fill or self._facecolor is None or - (cbook.is_string_like(self._facecolor) and self._facecolor.lower()=='none')): - rgbFace = None - gc.set_alpha(1.0) - else: - r, g, b, a = colors.colorConverter.to_rgba(self._facecolor, self._alpha) - rgbFace = (r, g, b) - gc.set_alpha(a) + rgbFace = self._facecolor + if rgbFace[3] == 0: + rgbFace = None # (some?) renderers expect this as no-fill signal - if self._hatch: gc.set_hatch(self._hatch ) @@ -3870,7 +3886,6 @@ affine = transforms.IdentityTransform() - renderer.open_group('patch', self.get_gid()) if self.get_path_effects(): for path_effect in self.get_path_effects(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-08-16 15:06:22
|
Revision: 8634 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8634&view=rev Author: mdboom Date: 2010-08-16 15:06:16 +0000 (Mon, 16 Aug 2010) Log Message: ----------- Handle NaN's correctly in path analysis routines. Fixes a bug where the best location for a legend was not calculated correctly when the line contains NaNs. - MGD Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/src/_path.cpp Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-08-16 08:12:28 UTC (rev 8633) +++ branches/v1_0_maint/CHANGELOG 2010-08-16 15:06:16 UTC (rev 8634) @@ -1,3 +1,7 @@ +2010-08-16 Handle NaN's correctly in path analysis routines. Fixes a + bug where the best location for a legend was not calculated + correctly when the line contains NaNs. - MGD + 2010-08-14 Fix bug in patch alpha handling, and in bar color kwarg - EF 2010-07-20 Return Qt4's default cursor when leaving the canvas - DSD Modified: branches/v1_0_maint/src/_path.cpp =================================================================== --- branches/v1_0_maint/src/_path.cpp 2010-08-16 08:12:28 UTC (rev 8633) +++ branches/v1_0_maint/src/_path.cpp 2010-08-16 15:06:16 UTC (rev 8634) @@ -224,7 +224,8 @@ const agg::trans_affine& trans) { typedef agg::conv_transform<PathIterator> transformed_path_t; - typedef agg::conv_curve<transformed_path_t> curve_t; + typedef PathNanRemover<transformed_path_t> no_nans_t; + typedef agg::conv_curve<no_nans_t> curve_t; if (path.total_vertices() < 3) { @@ -232,7 +233,8 @@ } transformed_path_t trans_path(path, trans); - curve_t curved_path(trans_path); + no_nans_t no_nans_path(trans_path, true, path.has_curves()); + curve_t curved_path(no_nans_path); return point_in_path_impl(x, y, curved_path); } @@ -241,11 +243,13 @@ const agg::trans_affine& trans) { typedef agg::conv_transform<PathIterator> transformed_path_t; - typedef agg::conv_curve<transformed_path_t> curve_t; + typedef PathNanRemover<transformed_path_t> no_nans_t; + typedef agg::conv_curve<no_nans_t> curve_t; typedef agg::conv_stroke<curve_t> stroke_t; transformed_path_t trans_path(path, trans); - curve_t curved_path(trans_path); + no_nans_t nan_removed_path(trans_path, true, path.has_curves()); + curve_t curved_path(nan_removed_path); stroke_t stroked_path(curved_path); stroked_path.width(r * 2.0); return point_in_path_impl(x, y, stroked_path); @@ -673,13 +677,15 @@ PathIterator& b, const agg::trans_affine& btrans) { typedef agg::conv_transform<PathIterator> transformed_path_t; - typedef agg::conv_curve<transformed_path_t> curve_t; + typedef PathNanRemover<transformed_path_t> no_nans_t; + typedef agg::conv_curve<no_nans_t> curve_t; if (a.total_vertices() < 3) return false; transformed_path_t b_path_trans(b, btrans); - curve_t b_curved(b_path_trans); + no_nans_t b_no_nans(b_path_trans, true, b.has_curves()); + curve_t b_curved(b_no_nans); double x, y; b_curved.rewind(0); @@ -1169,16 +1175,20 @@ bool path_intersects_path(PathIterator& p1, PathIterator& p2) { - typedef agg::conv_curve<PathIterator> curve_t; + typedef PathNanRemover<PathIterator> no_nans_t; + typedef agg::conv_curve<no_nans_t> curve_t; if (p1.total_vertices() < 2 || p2.total_vertices() < 2) { return false; } - curve_t c1(p1); - curve_t c2(p2); + no_nans_t n1(p1, true, p1.has_curves()); + no_nans_t n2(p2, true, p2.has_curves()); + curve_t c1(n1); + curve_t c2(n2); + double x11, y11, x12, y12; double x21, y21, x22, y22; @@ -1211,6 +1221,7 @@ PathIterator p1(args[0]); PathIterator p2(args[1]); bool filled = false; + if (args.size() == 3) { filled = args[2].isTrue(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2010-08-21 17:49:59
|
Revision: 8652 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8652&view=rev Author: efiring Date: 2010-08-21 17:49:53 +0000 (Sat, 21 Aug 2010) Log Message: ----------- Axis.set_view_interval: when updating, respect original orientation Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/lib/matplotlib/axis.py Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-08-18 17:36:51 UTC (rev 8651) +++ branches/v1_0_maint/CHANGELOG 2010-08-21 17:49:53 UTC (rev 8652) @@ -1,3 +1,11 @@ +2010-08-21 Change Axis.set_view_interval() so that when updating an + existing interval, it respects the orientation of that + interval, and can enlarge but not reduce the interval. + This fixes a bug in which Axis.set_ticks would + change the view limits of an inverted axis. Whether + set_ticks should be affecting the viewLim at all remains + an open question. - EF + 2010-08-16 Handle NaN's correctly in path analysis routines. Fixes a bug where the best location for a legend was not calculated correctly when the line contains NaNs. - MGD Modified: branches/v1_0_maint/lib/matplotlib/axis.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axis.py 2010-08-18 17:36:51 UTC (rev 8651) +++ branches/v1_0_maint/lib/matplotlib/axis.py 2010-08-21 17:49:53 UTC (rev 8652) @@ -1696,11 +1696,21 @@ return self.axes.viewLim.intervalx def set_view_interval(self, vmin, vmax, ignore=False): + """ + If *ignore* is *False*, the order of vmin, vmax + does not matter; the original axis orientation will + be preserved. + """ if ignore: self.axes.viewLim.intervalx = vmin, vmax else: Vmin, Vmax = self.get_view_interval() - self.axes.viewLim.intervalx = min(vmin, Vmin), max(vmax, Vmax) + if Vmin < Vmax: + self.axes.viewLim.intervalx = (min(vmin, vmax, Vmin), + max(vmin, vmax, Vmax)) + else: + self.axes.viewLim.intervalx = (max(vmin, vmax, Vmin), + min(vmin, vmax, Vmax)) def get_minpos(self): return self.axes.dataLim.minposx @@ -1947,11 +1957,21 @@ return self.axes.viewLim.intervaly def set_view_interval(self, vmin, vmax, ignore=False): + """ + If *ignore* is *False*, the order of vmin, vmax + does not matter; the original axis orientation will + be preserved. + """ if ignore: self.axes.viewLim.intervaly = vmin, vmax else: Vmin, Vmax = self.get_view_interval() - self.axes.viewLim.intervaly = min(vmin, Vmin), max(vmax, Vmax) + if Vmin < Vmax: + self.axes.viewLim.intervaly = (min(vmin, vmax, Vmin), + max(vmin, vmax, Vmax)) + else: + self.axes.viewLim.intervaly = (max(vmin, vmax, Vmin), + min(vmin, vmax, Vmax)) def get_minpos(self): return self.axes.dataLim.minposy This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-09-08 14:32:27
|
Revision: 8690 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8690&view=rev Author: mdboom Date: 2010-09-08 14:32:17 +0000 (Wed, 08 Sep 2010) Log Message: ----------- [3058804] part of a line is not drawn Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py branches/v1_0_maint/src/path_converters.h Added Paths: ----------- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.pdf =================================================================== (Binary files differ) Property changes on: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.pdf ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.png =================================================================== (Binary files differ) Property changes on: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg (rev 0) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/para_equal_perp.svg 2010-09-08 14:32:17 UTC (rev 8690) @@ -0,0 +1,296 @@ +<?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="M220.800000 158.400000L369.600000 158.400000L518.400000 43.200000 +L369.600000 158.400000L220.800000 273.600000L72.000000 388.800000 +L220.800000 273.600000L369.600000 273.600000"/> +</g> +<g id="line2d2"> +<defs><path id="m87f81da4bcf58d853202912065521dc1" d="M0.000000 3.000000C0.795609 3.000000 1.558740 2.683901 2.121320 2.121320 +C2.683901 1.558740 3.000000 0.795609 3.000000 0.000000 +C3.000000 -0.795609 2.683901 -1.558740 2.121320 -2.121320 +C1.558740 -2.683901 0.795609 -3.000000 0.000000 -3.000000 +C-0.795609 -3.000000 -1.558740 -2.683901 -2.121320 -2.121320 +C-2.683901 -1.558740 -3.000000 -0.795609 -3.000000 0.000000 +C-3.000000 0.795609 -2.683901 1.558740 -2.121320 2.121320 +C-1.558740 2.683901 -0.795609 3.000000 0.000000 3.000000z"/></defs> +<g clip-path="url(#p50431ccdcb28178602d99d9270004dde)"><use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="220.800000" y="158.400000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="369.600000" y="158.400000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="518.400000" y="43.200000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="369.600000" y="158.400000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="220.800000" y="273.600000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="72.000000" y="388.800000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="220.800000" y="273.600000"/> +<use style="fill: #ff0000; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m87f81da4bcf58d853202912065521dc1" x="369.600000" y="273.600000"/> +</g></g> +<g id="matplotlib.axis1"> +<g id="xtick1"> +<g id="line2d3"> +<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="line2d4"> +<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="line2d5"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="146.400000" y="388.800000"/> +</g></g> +<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="#m9281cae24120827b11d5ea8a7ad3e96b" x="146.400000" 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(137.775000,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="line2d7"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="220.800000" y="388.800000"/> +</g></g> +<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="#m9281cae24120827b11d5ea8a7ad3e96b" x="220.800000" 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(212.307812,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="line2d9"> +<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="line2d10"> +<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="text4"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(286.832812,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="line2d11"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="369.600000" y="388.800000"/> +</g></g> +<g id="line2d12"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m9281cae24120827b11d5ea8a7ad3e96b" x="369.600000" 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(360.889062,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 id="xtick6"> +<g id="line2d13"> +<g ><use style="fill: none; stroke: #000000; stroke-width: 0.500000; stroke-linejoin: round; stroke-linecap: butt; opacity: 1.000000" xlink:href="#m30e32995789d870ad79a2e54c91cf9c6" x="444.000000" y="388.800000"/> +</g></g> +<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="#m9281cae24120827b11d5ea8a7ad3e96b" x="444.000000" y="43.200000"/> +</g></g> +<g id="text6"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(435.414062,401.706250)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="xtick7"> +<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="#m30e32995789d870ad79a2e54c91cf9c6" x="518.400000" y="388.800000"/> +</g></g> +<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="#m9281cae24120827b11d5ea8a7ad3e96b" x="518.400000" y="43.200000"/> +</g></g> +<g id="text7"> +<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(509.712500,401.706250)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="matplotlib.axis2"> +<g id="ytick1"> +<g id="line2d17"> +<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="line2d18"> +<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="text8"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.500000,393.167188)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="ytick2"> +<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="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="331.200000"/> +</g></g> +<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="#m20b58b2501143cb5e0a5e8f1ef6f1643" x="518.400000" y="331.200000"/> +</g></g> +<g id="text9"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.750000,335.567188)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="ytick3"> +<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="#m3400efa6b1638b3fea9e19e898273957" x="72.000000" y="273.600000"/> +</g></g> +<g id="line2d22"> +<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="273.600000"/> +</g></g> +<g id="text10"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(51.015625,277.967188)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="ytick4"> +<g id="line2d23"> +<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="line2d24"> +<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="text11"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(51.265625,220.289062)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="ytick5"> +<g id="line2d25"> +<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="158.400000"/> +</g></g> +<g id="line2d26"> +<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="158.400000"/> +</g></g> +<g id="text12"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.578125,162.767187)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="ytick6"> +<g id="line2d27"> +<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="100.800000"/> +</g></g> +<g id="line2d28"> +<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="100.800000"/> +</g></g> +<g id="text13"> +<g style="fill: #000000; opacity: 1.000000" transform="translate(50.828125,105.167188)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="ytick7"> +<g id="line2d29"> +<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="line2d30"> +<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="text14"> +<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> Modified: branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py 2010-09-08 13:48:29 UTC (rev 8689) +++ branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py 2010-09-08 14:32:17 UTC (rev 8690) @@ -73,6 +73,8 @@ path = transform.transform_path(path) simplified = list(path.iter_segments(simplify=(800, 600))) + print len(simplified) + assert len(simplified) == 3884 def test_sine_plus_noise(): @@ -90,6 +92,8 @@ path = transform.transform_path(path) simplified = list(path.iter_segments(simplify=(800, 600))) + print len(simplified) + assert len(simplified) == 876 @image_comparison(baseline_images=['simplify_curve']) @@ -135,6 +139,8 @@ path = transform.transform_path(path) simplified = list(path.iter_segments(simplify=(800, 600))) + print len(simplified) + assert len(simplified) == 17 def test_start_with_moveto(): @@ -204,6 +210,17 @@ ax.set_xlim(5, 9) fig.savefig('clipper_edge') +@image_comparison(baseline_images=['para_equal_perp']) +def test_para_equal_perp(): + x = np.array([0, 1, 2, 1, 0, -1, 0, 1]) + y = np.array([1, 1, 2, 1, 0, -1, 0, 0]) + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(x + 1, y + 1) + ax.plot(x + 1, y + 1, 'ro') + fig.savefig('para_equal_perp') + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) Modified: branches/v1_0_maint/src/path_converters.h =================================================================== --- branches/v1_0_maint/src/path_converters.h 2010-09-08 13:48:29 UTC (rev 8689) +++ branches/v1_0_maint/src/path_converters.h 2010-09-08 14:32:17 UTC (rev 8690) @@ -682,24 +682,30 @@ min of our final line) */ double paradNorm2 = paradx * paradx + parady * parady; - m_lastMax = false; - if (totdot >= 0.0) - { - if (paradNorm2 > m_dnorm2Max) + if (perpdNorm2 == paradNorm2) { + _push(&m_lastx, &m_lasty); + _push(x, y); + break; + } else { + m_lastMax = false; + if (totdot >= 0.0) { - m_lastMax = true; - m_dnorm2Max = paradNorm2; - m_nextX = *x; - m_nextY = *y; + if (paradNorm2 > m_dnorm2Max) + { + m_lastMax = true; + m_dnorm2Max = paradNorm2; + m_nextX = *x; + m_nextY = *y; + } } - } - else - { - if (paradNorm2 < m_dnorm2Min) + else { - m_dnorm2Min = paradNorm2; - m_nextX = *x; - m_nextY = *y; + if (paradNorm2 < m_dnorm2Min) + { + m_dnorm2Min = paradNorm2; + m_nextX = *x; + m_nextY = *y; + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-09-08 15:51:28
|
Revision: 8691 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8691&view=rev Author: mdboom Date: 2010-09-08 15:51:18 +0000 (Wed, 08 Sep 2010) Log Message: ----------- Another pass at fixing simplification. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.png branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py branches/v1_0_maint/src/path_converters.h Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.png =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg 2010-09-08 14:32:17 UTC (rev 8690) +++ branches/v1_0_maint/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg 2010-09-08 15:51:18 UTC (rev 8691) @@ -11,12 +11,12 @@ <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.000000L0.000000 432.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.200000L72.000000 388.800000"/> +L72.000000 43.200000z"/> </g> <g id="line2d1"> <defs> @@ -25,9 +25,10 @@ </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.800000L76.132389 388.704243L76.151520 388.455734 L76.157897 388.474541L76.170651 262.490246L76.177029 70.552590 -L76.272686 388.786908L76.629806 388.799881L221.059337 388.800000 -L485.704389 388.713691L485.729897 388.401770L485.736274 386.681411 -L485.755406 70.552590L485.844686 388.786149L486.182674 388.799863 +L76.183406 112.959876L76.183406 112.959876L76.298194 388.793604 +L77.114469 388.799987L485.704389 388.713691L485.729897 388.401770 +L485.736274 386.681411L485.755406 70.552590L485.768160 379.474263 +L485.768160 379.474263L485.882949 388.795086L487.018080 388.799995 L489.926057 388.800000L489.926057 388.800000"/> </g> <g id="matplotlib.axis1"> Modified: branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py 2010-09-08 14:32:17 UTC (rev 8690) +++ branches/v1_0_maint/lib/matplotlib/tests/test_simplification.py 2010-09-08 15:51:18 UTC (rev 8691) @@ -141,7 +141,7 @@ print len(simplified) - assert len(simplified) == 17 + assert len(simplified) == 20 def test_start_with_moveto(): # Should be entirely clipped away to a single MOVETO @@ -212,8 +212,8 @@ @image_comparison(baseline_images=['para_equal_perp']) def test_para_equal_perp(): - x = np.array([0, 1, 2, 1, 0, -1, 0, 1]) - y = np.array([1, 1, 2, 1, 0, -1, 0, 0]) + x = np.array([0, 1, 2, 1, 0, -1, 0, 1] + [1] * 128) + y = np.array([1, 1, 2, 1, 0, -1, 0, 0] + [0] * 128) fig = plt.figure() ax = fig.add_subplot(111) Modified: branches/v1_0_maint/src/path_converters.h =================================================================== --- branches/v1_0_maint/src/path_converters.h 2010-09-08 14:32:17 UTC (rev 8690) +++ branches/v1_0_maint/src/path_converters.h 2010-09-08 15:51:18 UTC (rev 8691) @@ -520,7 +520,7 @@ m_moveto(true), m_after_moveto(false), m_lastx(0.0), m_lasty(0.0), m_clipped(false), m_origdx(0.0), m_origdy(0.0), - m_origdNorm2(0.0), m_dnorm2Max(0.0), m_dnorm2Min(0.0), + m_origdNorm2(0.0), m_dnorm2Max(0.0), m_lastMax(false), m_nextX(0.0), m_nextY(0.0), m_lastWrittenX(0.0), m_lastWrittenY(0.0) { @@ -637,7 +637,6 @@ //set all the variables to reflect this new orig vector m_dnorm2Max = m_origdNorm2; - m_dnorm2Min = 0.0; m_lastMax = true; m_nextX = m_lastWrittenX = m_lastx = *x; @@ -677,36 +676,25 @@ /* check if the current vector is parallel or anti-parallel to the orig vector. If it is parallel, test if it is the longest of the vectors - we are merging in that direction. If anti-p, test - if it is the longest in the opposite direction (the - min of our final line) */ + we are merging in that direction. */ double paradNorm2 = paradx * paradx + parady * parady; - if (perpdNorm2 == paradNorm2) { + m_lastMax = false; + if (totdot > 0.0) + { + if (paradNorm2 > m_dnorm2Max) + { + m_lastMax = true; + m_dnorm2Max = paradNorm2; + m_nextX = *x; + m_nextY = *y; + } + } + else + { _push(&m_lastx, &m_lasty); _push(x, y); break; - } else { - m_lastMax = false; - if (totdot >= 0.0) - { - if (paradNorm2 > m_dnorm2Max) - { - m_lastMax = true; - m_dnorm2Max = paradNorm2; - m_nextX = *x; - m_nextY = *y; - } - } - else - { - if (paradNorm2 < m_dnorm2Min) - { - m_dnorm2Min = paradNorm2; - m_nextX = *x; - m_nextY = *y; - } - } } m_lastx = *x; @@ -770,7 +758,6 @@ double m_origdy; double m_origdNorm2; double m_dnorm2Max; - double m_dnorm2Min; bool m_lastMax; double m_nextX; double m_nextY; @@ -805,7 +792,6 @@ m_origdNorm2 = m_origdx * m_origdx + m_origdy * m_origdy; m_dnorm2Max = m_origdNorm2; - m_dnorm2Min = 0.0; m_lastMax = true; m_lastWrittenX = m_queue[m_queue_write-1].x; m_lastWrittenY = m_queue[m_queue_write-1].y; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2010-09-17 02:46:10
|
Revision: 8706 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8706&view=rev Author: efiring Date: 2010-09-17 02:46:04 +0000 (Fri, 17 Sep 2010) Log Message: ----------- include Python.h first in extension code; patch by Jason Grout. This cleans up the preprocessor directives and allows compilation on Solaris. A preprocessor directive is added to keep png.h from failing on Linux because Python.h has caused setjmp.h to be included. Modified Paths: -------------- branches/v1_0_maint/CXX/WrapPython.h branches/v1_0_maint/src/_backend_agg.cpp branches/v1_0_maint/src/_image.cpp branches/v1_0_maint/src/_png.cpp Modified: branches/v1_0_maint/CXX/WrapPython.h =================================================================== --- branches/v1_0_maint/CXX/WrapPython.h 2010-09-16 16:49:27 UTC (rev 8705) +++ branches/v1_0_maint/CXX/WrapPython.h 2010-09-17 02:46:04 UTC (rev 8706) @@ -38,26 +38,12 @@ #ifndef __PyCXX_wrap_python_hxx__ #define __PyCXX_wrap_python_hxx__ +/* Python API mandates Python.h is included *first* */ +#include "Python.h" + // On some platforms we have to include time.h to get select defined #if !defined(__WIN32__) && !defined(WIN32) && !defined(_WIN32) && !defined(_WIN64) #include <sys/time.h> #endif -// Prevent multiple conflicting definitions of swab from stdlib.h and unistd.h -#if defined(__sun) || defined(sun) -#if defined(_XPG4) -#undef _XPG4 #endif -#if defined(_XPG3) -#undef _XPG3 -#endif -#endif - -// Python.h will redefine these and generate warning in the process -#undef _XOPEN_SOURCE -#undef _POSIX_C_SOURCE - -// pull in python definitions -#include <Python.h> - -#endif Modified: branches/v1_0_maint/src/_backend_agg.cpp =================================================================== --- branches/v1_0_maint/src/_backend_agg.cpp 2010-09-16 16:49:27 UTC (rev 8705) +++ branches/v1_0_maint/src/_backend_agg.cpp 2010-09-17 02:46:04 UTC (rev 8706) @@ -1,12 +1,12 @@ /* A rewrite of _backend_agg using PyCXX to handle ref counting, etc.. */ + +/* Python API mandates Python.h is included *first* */ +#include "Python.h" + +#define PNG_SKIP_SETJMP_CHECK #include <png.h> -// To remove a gcc warning -#ifdef _POSIX_C_SOURCE -#undef _POSIX_C_SOURCE -#endif - #include "ft2font.h" #include "_image.h" #include "_backend_agg.h" Modified: branches/v1_0_maint/src/_image.cpp =================================================================== --- branches/v1_0_maint/src/_image.cpp 2010-09-16 16:49:27 UTC (rev 8705) +++ branches/v1_0_maint/src/_image.cpp 2010-09-17 02:46:04 UTC (rev 8706) @@ -1,8 +1,4 @@ -// To remove a gcc warning -#ifdef _POSIX_C_SOURCE -#undef _POSIX_C_SOURCE -#endif - +/* Python API mandates Python.h is included *first* */ #include "Python.h" #include <string> Modified: branches/v1_0_maint/src/_png.cpp =================================================================== --- branches/v1_0_maint/src/_png.cpp 2010-09-16 16:49:27 UTC (rev 8705) +++ branches/v1_0_maint/src/_png.cpp 2010-09-17 02:46:04 UTC (rev 8706) @@ -1,10 +1,9 @@ +/* Python API mandates Python.h is included *first* */ +#include "Python.h" + +#define PNG_SKIP_SETJMP_CHECK #include <png.h> -// To remove a gcc warning -#ifdef _POSIX_C_SOURCE -#undef _POSIX_C_SOURCE -#endif - // TODO: Un CXX-ify this module #include "CXX/Extensions.hxx" #include "numpy/arrayobject.h" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-09-21 20:18:54
|
Revision: 8714 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8714&view=rev Author: mdboom Date: 2010-09-21 20:18:48 +0000 (Tue, 21 Sep 2010) Log Message: ----------- Bug # Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/tri/_tri.cpp branches/v1_0_maint/src/mplutils.h Modified: branches/v1_0_maint/lib/matplotlib/tri/_tri.cpp =================================================================== --- branches/v1_0_maint/lib/matplotlib/tri/_tri.cpp 2010-09-21 20:16:28 UTC (rev 8713) +++ branches/v1_0_maint/lib/matplotlib/tri/_tri.cpp 2010-09-21 20:18:48 UTC (rev 8714) @@ -559,10 +559,10 @@ // Clear _boundaries_visited. for (BoundariesVisited::iterator it = _boundaries_visited.begin(); it != _boundaries_visited.end(); ++it) - fill(it->begin(), it->end(), false); + std::fill(it->begin(), it->end(), false); // Clear _boundaries_used. - fill(_boundaries_used.begin(), _boundaries_used.end(), false); + std::fill(_boundaries_used.begin(), _boundaries_used.end(), false); } } Modified: branches/v1_0_maint/src/mplutils.h =================================================================== --- branches/v1_0_maint/src/mplutils.h 2010-09-21 20:16:28 UTC (rev 8713) +++ branches/v1_0_maint/src/mplutils.h 2010-09-21 20:18:48 UTC (rev 8714) @@ -1,4 +1,4 @@ -/* mplutils.h -- +/* mplutils.h -- * * $Header$ * $Log$ @@ -20,7 +20,7 @@ void _VERBOSE(const std::string&); -#undef CLAMP +#undef CLAMP #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) #undef MAX @@ -45,4 +45,27 @@ friend std::ostream &operator <<(std::ostream &, const Printf &); }; +#if defined(_MSC_VER) && (_MSC_VER == 1400) + +/* Required by libpng and zlib */ +#pragma comment(lib, "bufferoverflowU") + +/* std::max and std::min are missing in Windows Server 2003 R2 + Platform SDK compiler. See matplotlib bug #3067191 */ +namespace std { + + template <class T> inline T max(const T& a, const T& b) + { + return (a > b) ? a : b; + } + + template <class T> inline T min(const T& a, const T& b) + { + return (a < b) ? a : b; + } + +} + #endif + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ef...@us...> - 2010-09-27 18:51:12
|
Revision: 8722 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8722&view=rev Author: efiring Date: 2010-09-27 18:51:05 +0000 (Mon, 27 Sep 2010) Log Message: ----------- Clarify docstrings for autoscale_view and relim. Modified Paths: -------------- branches/v1_0_maint/doc/pyplots/tex_demo.png branches/v1_0_maint/lib/matplotlib/axes.py Modified: branches/v1_0_maint/doc/pyplots/tex_demo.png =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/axes.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/axes.py 2010-09-27 01:51:50 UTC (rev 8721) +++ branches/v1_0_maint/lib/matplotlib/axes.py 2010-09-27 18:51:05 UTC (rev 8722) @@ -1491,7 +1491,12 @@ return tab def relim(self): - 'recompute the data limits based on current artists' + """ + Recompute the data limits based on current artists. + + At present, :class:`~matplotlib.collections.Collection` + instances are not supported. + """ # Collections are deliberately not supported (yet); see # the TODO note in artists.py. self.dataLim.ignore(True) @@ -1760,10 +1765,16 @@ def autoscale_view(self, tight=None, scalex=True, scaley=True): """ - autoscale the view limits using the data limits. You can + Autoscale the view limits using the data limits. You can selectively autoscale only a single axis, eg, the xaxis by setting *scaley* to *False*. The autoscaling preserves any axis direction reversal that has already been done. + + The data limits are not updated automatically when artist + data are changed after the artist has been added to an + Axes instance. In that case, use + :meth:`matplotlib.axes.Axes.relim` + prior to calling autoscale_view. """ if tight is not None: self._tight = bool(tight) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2010-10-22 16:17:32
|
Revision: 8760 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8760&view=rev Author: mdboom Date: 2010-10-22 16:17:26 +0000 (Fri, 22 Oct 2010) Log Message: ----------- Fix problems with funnily encoded fonts in PS backend. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/backends/backend_ps.py branches/v1_0_maint/ttconv/pprdrv_tt.cpp Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_ps.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_ps.py 2010-10-22 15:01:38 UTC (rev 8759) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_ps.py 2010-10-22 16:17:26 UTC (rev 8760) @@ -610,8 +610,6 @@ draw a Text instance """ # local to avoid repeated attribute lookups - - write = self._pswriter.write if debugPS: write("% text\n") @@ -622,71 +620,9 @@ elif ismath: return self.draw_mathtext(gc, x, y, s, prop, angle) - elif isinstance(s, unicode): - return self.draw_unicode(gc, x, y, s, prop, angle) - elif rcParams['ps.useafm']: - font = self._get_font_afm(prop) - - l,b,w,h = font.get_str_bbox(s) - - fontsize = prop.get_size_in_points() - l *= 0.001*fontsize - b *= 0.001*fontsize - w *= 0.001*fontsize - h *= 0.001*fontsize - - if angle==90: l,b = -b, l # todo generalize for arb rotations - - pos = _nums_to_str(x-l, y-b) - thetext = '(%s)' % s - fontname = font.get_fontname() - fontsize = prop.get_size_in_points() - rotate = '%1.1f rotate' % angle - setcolor = '%1.3f %1.3f %1.3f setrgbcolor' % gc.get_rgb()[:3] - #h = 0 - ps = """\ -gsave -/%(fontname)s findfont -%(fontsize)s scalefont -setfont -%(pos)s moveto -%(rotate)s -%(thetext)s -%(setcolor)s -show -grestore - """ % locals() - self._draw_ps(ps, gc, None) - - else: - font = self._get_font_ttf(prop) - font.set_text(s, 0, flags=LOAD_NO_HINTING) - self.track_characters(font, s) - self.set_color(*gc.get_rgb()) - self.set_font(font.get_sfnt()[(1,0,0,6)], prop.get_size_in_points()) - write("%s m\n"%_nums_to_str(x,y)) - if angle: - write("gsave\n") - write("%s rotate\n"%_num_to_str(angle)) - descent = font.get_descent() / 64.0 - if descent: - write("0 %s rmoveto\n"%_num_to_str(descent)) - write("(%s) show\n"%quote_ps_string(s)) - if angle: - write("grestore\n") - def new_gc(self): - return GraphicsContextPS() - - def draw_unicode(self, gc, x, y, s, prop, angle): - """draw a unicode string. ps doesn't have unicode support, so - we have to do this the hard way - """ - if rcParams['ps.useafm']: - self.set_color(*gc.get_rgb()) - font = self._get_font_afm(prop) fontname = font.get_fontname() fontsize = prop.get_size_in_points() @@ -772,6 +708,9 @@ """ % locals() self._pswriter.write(ps) + def new_gc(self): + return GraphicsContextPS() + def draw_mathtext(self, gc, x, y, s, prop, angle): """ @@ -1125,7 +1064,6 @@ if is_opentype_cff_font(font_filename): raise RuntimeError("OpenType CFF fonts can not be saved using the internal Postscript backend at this time.\nConsider using the Cairo backend.") else: - fonttype = rcParams['ps.fonttype'] convert_ttf_to_ps(font_filename, fh, fonttype, glyph_ids) print >>fh, "end" print >>fh, "%%EndProlog" Modified: branches/v1_0_maint/ttconv/pprdrv_tt.cpp =================================================================== --- branches/v1_0_maint/ttconv/pprdrv_tt.cpp 2010-10-22 15:01:38 UTC (rev 8759) +++ branches/v1_0_maint/ttconv/pprdrv_tt.cpp 2010-10-22 16:17:26 UTC (rev 8760) @@ -420,21 +420,19 @@ -------------------------------------------------------------*/ void ttfont_encoding(TTStreamWriter& stream, struct TTFONT *font, std::vector<int>& glyph_ids, font_type_enum target_type) { - stream.putline("/Encoding StandardEncoding def"); + if (target_type == PS_TYPE_3) { + stream.printf("/Encoding [ "); - // if (target_type == PS_TYPE_3) { - // stream.printf("/Encoding [ "); + for (std::vector<int>::const_iterator i = glyph_ids.begin(); + i != glyph_ids.end(); ++i) { + const char* name = ttfont_CharStrings_getname(font, *i); + stream.printf("/%s ", name); + } - // for (std::vector<int>::const_iterator i = glyph_ids.begin(); - // i != glyph_ids.end(); ++i) { - // const char* name = ttfont_CharStrings_getname(font, *i); - // stream.printf("/%s ", name); - // } - - // stream.printf("] def\n"); - // } else { - // stream.putline("/Encoding StandardEncoding def"); - // } + stream.printf("] def\n"); + } else { + stream.putline("/Encoding StandardEncoding def"); + } } /* end of ttfont_encoding() */ /*----------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-11-07 08:06:47
|
Revision: 8776 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8776&view=rev Author: jouni Date: 2010-11-07 08:06:41 +0000 (Sun, 07 Nov 2010) Log Message: ----------- Allow bypassing the download mechanism in get_sample_data Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/lib/matplotlib/cbook.py branches/v1_0_maint/lib/matplotlib/rcsetup.py branches/v1_0_maint/matplotlibrc.template Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-11-05 18:52:52 UTC (rev 8775) +++ branches/v1_0_maint/CHANGELOG 2010-11-07 08:06:41 UTC (rev 8776) @@ -1,3 +1,7 @@ +2010-11-07 New rc parameters examples.download and examples.directory + allow bypassing the download mechanism in get_sample_data. + - JKS + 2010-08-21 Change Axis.set_view_interval() so that when updating an existing interval, it respects the orientation of that interval, and can enlarge but not reduce the interval. Modified: branches/v1_0_maint/lib/matplotlib/cbook.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/cbook.py 2010-11-05 18:52:52 UTC (rev 8775) +++ branches/v1_0_maint/lib/matplotlib/cbook.py 2010-11-07 08:06:41 UTC (rev 8776) @@ -649,9 +649,20 @@ svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data and svn add the data file you want to support. This is primarily - intended for use in mpl examples that need custom data + intended for use in mpl examples that need custom data. + + To bypass all downloading, set the rc parameter examples.download to False + and examples.directory to the directory where we should look. """ + if not matplotlib.rcParams['examples.download']: + directory = matplotlib.rcParams['examples.directory'] + f = os.path.join(directory, fname) + if asfileobj: + return open(f, 'rb') + else: + return f + myserver = get_sample_data.myserver if myserver is None: configdir = matplotlib.get_configdir() Modified: branches/v1_0_maint/lib/matplotlib/rcsetup.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/rcsetup.py 2010-11-05 18:52:52 UTC (rev 8775) +++ branches/v1_0_maint/lib/matplotlib/rcsetup.py 2010-11-07 08:06:41 UTC (rev 8776) @@ -566,8 +566,12 @@ 'keymap.grid' : ['g', validate_stringlist], 'keymap.yscale' : ['l', validate_stringlist], 'keymap.xscale' : [['k', 'L'], validate_stringlist], - 'keymap.all_axes' : ['a', validate_stringlist] + 'keymap.all_axes' : ['a', validate_stringlist], + # sample data + 'examples.download' : [True, validate_bool], + 'examples.directory' : ['', str], + } if __name__ == '__main__': Modified: branches/v1_0_maint/matplotlibrc.template =================================================================== --- branches/v1_0_maint/matplotlibrc.template 2010-11-05 18:52:52 UTC (rev 8775) +++ branches/v1_0_maint/matplotlibrc.template 2010-11-07 08:06:41 UTC (rev 8776) @@ -370,3 +370,12 @@ #keymap.xscale : L, k # toggle scaling of x-axes ('log'/'linear') #keymap.all_axes : a # enable all axes +# Control downloading of example data. Various examples download some +# data from the Matplotlib svn repository to avoid distributing extra +# files, but sometimes you want to avoid that. In that case set +# examples.download to False and examples.directory to the directory +# where you have a checkout of +# https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + +#examples.download : True # False to bypass downloading mechanism +#examples.directory : '' # absolute directory to look in if download is false This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2010-11-09 15:23:32
|
Revision: 8785 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8785&view=rev Author: jdh2358 Date: 2010-11-09 15:23:25 +0000 (Tue, 09 Nov 2010) Log Message: ----------- fix a bug in context so plot directive will be forced to run (but not save) figs which are already cached Modified Paths: -------------- branches/v1_0_maint/doc/users/annotations_guide.rst branches/v1_0_maint/doc/users/gridspec.rst branches/v1_0_maint/doc/users/image_tutorial.rst branches/v1_0_maint/doc/users/recipes.rst branches/v1_0_maint/lib/matplotlib/sphinxext/plot_directive.py Removed Paths: ------------- branches/v1_0_maint/examples/units/date_converter.py branches/v1_0_maint/examples/units/date_support.py Modified: branches/v1_0_maint/doc/users/annotations_guide.rst =================================================================== --- branches/v1_0_maint/doc/users/annotations_guide.rst 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/doc/users/annotations_guide.rst 2010-11-09 15:23:25 UTC (rev 8785) @@ -310,6 +310,7 @@ as 2. The callable object should take a single argument of renderer instance. For example, following two commands give identical results :: + an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1, xytext=(30,0), textcoords="offset points") an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1.get_window_extent, @@ -322,7 +323,7 @@ annotate("Test", xy=(0.5, 1), xycoords=("data", "axes fraction")) 0.5 is in data coordinate, and 1 is in normalized axes coordinate. - You may use an atist or transform as with a tuple. For example, + You may use an atist or transform as with a tuple. For example, .. plot:: users/plotting/examples/annotate_simple_coord02.py :include-source: Modified: branches/v1_0_maint/doc/users/gridspec.rst =================================================================== --- branches/v1_0_maint/doc/users/gridspec.rst 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/doc/users/gridspec.rst 2010-11-09 15:23:25 UTC (rev 8785) @@ -1,4 +1,4 @@ -.. _gridspec-guide: +\.. _gridspec-guide: ************************************************ @@ -23,7 +23,7 @@ ==================================== To use subplot2grid, you provide geometry of the grid and the location -of the subplot in the grid. For a simple single-cell subplot, :: +of the subplot in the grid. For a simple single-cell subplot:: ax = plt.subplot2grid((2,2),(0, 0)) Modified: branches/v1_0_maint/doc/users/image_tutorial.rst =================================================================== --- branches/v1_0_maint/doc/users/image_tutorial.rst 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/doc/users/image_tutorial.rst 2010-11-09 15:23:25 UTC (rev 8785) @@ -40,8 +40,7 @@ Importing image data into Numpy arrays =============================================== -Plotting image data is supported by the Python Image Library (`PIL -<http://www.pythonware.com/products/pil/>`_), . Natively, matplotlib +Plotting image data is supported by the Python Image Library (`PIL <http://www.pythonware.com/products/pil/>`_), . Natively, matplotlib only supports PNG images. The commands shown below fall back on PIL if the native read fails. @@ -122,8 +121,7 @@ data. Why 8 bits? Most displays can only render 8 bits per channel worth of color gradation. Why can they only render 8 bits/channel? Because that's about all the human eye can see. More here (from a -photography standpoint): `Luminous Landscape bit depth tutorial -<http://www.luminous-landscape.com/tutorials/bit-depth.shtml>`_. +photography standpoint): `Luminous Landscape bit depth tutorial <http://www.luminous-landscape.com/tutorials/bit-depth.shtml>`_. Each inner list represents a pixel. Here, with an RGB image, there are 3 values. Since it's a black and white image, R, G, and B are all @@ -179,8 +177,7 @@ In [6]: lum_img = img[:,:,0] -This is array slicing. You can read more in the `Numpy tutorial -<http://www.scipy.org/Tentative_NumPy_Tutorial>`_. +This is array slicing. You can read more in the `Numpy tutorial <http://www.scipy.org/Tentative_NumPy_Tutorial>`_. .. sourcecode:: ipython @@ -229,9 +226,7 @@ imgplot = plt.imshow(lum_img) imgplot.set_cmap('spectral') -There are many other colormap schemes available. See the `list and -images of the colormaps -<http://matplotlib.sourceforge.net/examples/pylab_examples/show_colormaps.html>`_. +There are many other colormap schemes available. See the `list and images of the colormaps <http://matplotlib.sourceforge.net/examples/pylab_examples/show_colormaps.html>`_. .. _Color Bars Modified: branches/v1_0_maint/doc/users/recipes.rst =================================================================== --- branches/v1_0_maint/doc/users/recipes.rst 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/doc/users/recipes.rst 2010-11-09 15:23:25 UTC (rev 8785) @@ -56,21 +56,30 @@ everything at once, and turn off x and y sharing for the whole bunch. You can either unpack the axes individually:: - # new style method 1 - fig, (ax1, ax2, ax3, ax4) = plt.subplots(2, 2, sharex=True, sharey=True) + # new style method 1; unpack the axes + fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True, sharey=True) ax1.plot(x) or get them back as a numrows x numcolumns object array which supports numpy indexing:: - # new style method 2 + # new style method 2; use an axes array fig, axs = plt.subplots(2, 2, sharex=True, sharey=True) axs[0,0].plot(x) + Fixing common date annoyances ============================= + +.. plot:: + :nofigs: + :context: + + # clear the state for context use below + plt.close('all') + matplotlib allows you to natively plots python datetime instances, and for the most part does a good job picking tick locations and string formats. There are a couple of things it does not handle so @@ -97,13 +106,15 @@ objects are datetime.date instances, which we can see when we print some samples in the ipython terminal window. -If you plot the data, you will see that the x tick labels are all -squashed together:: +If you plot the data, :: In [67]: plot(r.date, r.close) Out[67]: [<matplotlib.lines.Line2D object at 0x92a6b6c>] +you will see that the x tick labels are all squashed together. + .. plot:: + :context: import matplotlib.cbook as cbook datafile = cbook.get_sample_data('goog.npy') @@ -113,23 +124,22 @@ plt.title('Default date handling can cause overlapping labels') Another annoyance is that if you hover the mouse over a the window and -look in the lower right corner of the matplotlib toolbar at the x and -y coordinates, you see that the x locations are formatted the same way -the tick labels are, eg "Dec 2004". What we'd like is for the -location in the toolbar to have a higher degree of precision, eg -giving us the exact date out mouse is hovering over. To fix the first -problem, we can use method:`matplotlib.figure.Figure.autofmt_xdate()` -and to fix the second problem we can use the ``ax.fmt_xdata`` -attribute which can be set to any function that takes a position and -returns a string. matplotlib has a number of date formatters built -im, so we'll use one of those. +look in the lower right corner of the matplotlib toolbar +(:ref:`navigation-toolbar`) at the x and y coordinates, you see that +the x locations are formatted the same way the tick labels are, eg +"Dec 2004". What we'd like is for the location in the toolbar to have +a higher degree of precision, eg giving us the exact date out mouse is +hovering over. To fix the first problem, we can use +method:`matplotlib.figure.Figure.autofmt_xdate` and to fix the second +problem we can use the ``ax.fmt_xdata`` attribute which can be set to +any function that takes a scalar and returns a string. matplotlib has +a number of date formatters built in, so we'll use one of those. .. plot:: :include-source: + :context: - import matplotlib.cbook as cbook - datafile = cbook.get_sample_data('goog.npy') - r = np.load(datafile).view(np.recarray) + plt.close('all') fig, ax = plt.subplots(1) ax.plot(r.date, r.close) @@ -140,10 +150,10 @@ # toolbar import matplotlib.dates as mdates ax.fmt_xdata = mdates.DateFormatter('%Y-%m-%d') - plt.title('autfmt_xdate fixes the labels') + plt.title('fig.autofmt_xdate fixes the labels') Now when you hover your mouse over the plotted data, you'll see date -format strings like 2004-12-01. +format strings like 2004-12-01 in the toolbar. Fill Between and Alpha ====================== @@ -154,7 +164,7 @@ combine filling with logical ranges, eg to just fill in a curve over some threshold value. -At it's most basic level, ``fill_between`` can be use to enhance a +At its most basic level, ``fill_between`` can be use to enhance a graphs visual appearance. Let's compare two graphs of a financial times with a simple line plot on the left and a filled line on the right. @@ -162,6 +172,9 @@ .. plot:: :include-source: + import matplotlib.pyplot as plt + import numpy as np + import matplotlib.cbook as cbook # load up some sample financial data @@ -180,6 +193,9 @@ ax.grid(True) ax1.set_ylabel('price') + for label in ax2.get_yticklabels(): + label.set_visible(False) + fig.suptitle('Google (GOOG) daily closing price') fig.autofmt_xdate() @@ -193,21 +209,24 @@ Our next example computes two populations of random walkers with a different mean and standard deviation of the normal distributions from -which there steps are drawn. We use shared regions to plot +/- one +which the steps are drawn. We use shared regions to plot +/- one standard deviation of the mean position of the population. Here the alpha channel is useful, not just aesthetic. .. plot:: :include-source: + import matplotlib.pyplot as plt + import numpy as np + Nsteps, Nwalkers = 100, 250 t = np.arange(Nsteps) - # an Nsteps x Nwalkers array of random walk steps + # an (Nsteps x Nwalkers) array of random walk steps S1 = 0.002 + 0.01*np.random.randn(Nsteps, Nwalkers) S2 = 0.004 + 0.02*np.random.randn(Nsteps, Nwalkers) - # an Nsteps x Nwalkers array of random walker positions + # an (Nsteps x Nwalkers) array of random walker positions X1 = S1.cumsum(axis=0) X2 = S2.cumsum(axis=0) @@ -232,16 +251,16 @@ ax.grid() -The where keyword argument is very handy for highlighting certain -regions of the graph. Where takes a boolean mask the same length as -the x, ymin and ymax arguments, and only fills in the region where the -boolean mask is True. In the example below, we take a a single random -walker and compute the analytic mean and standard deviation of the -population positions. The population mean is shown as the black +The ``where`` keyword argument is very handy for highlighting certain +regions of the graph. ``where`` takes a boolean mask the same length +as the x, ymin and ymax arguments, and only fills in the region where +the boolean mask is True. In the example below, we simulate a single +random walker and compute the analytic mean and standard deviation of +the population positions. The population mean is shown as the black dashed line, and the plus/minus one sigma deviation from the mean is showsn as the yellow filled region. We use the where mask -``X>upper_bound`` to find the region where the walker is above the -one sigma boundary, and shade that region blue. +``X>upper_bound`` to find the region where the walker is above the one +sigma boundary, and shade that region blue. .. plot:: :include-source: @@ -258,7 +277,7 @@ S = mu + sigma*np.random.randn(Nsteps) X = S.cumsum() - # the 1 sigma upper and lower population bounds + # the 1 sigma upper and lower analytic population bounds lower_bound = mu*t - sigma*np.sqrt(t) upper_bound = mu*t + sigma*np.sqrt(t) @@ -323,9 +342,9 @@ When decorating axes with text boxes, two useful tricks are to place the text in axes coordinates (see :ref:`transforms_tutorial`), so the text doesn't move around with changes in x or y limits. You can also -use the bbox property of text to surround the text with a -:class:`~matplotlib.patches.Patch` instance -- the boox keyword argument -takes a dictionary with keys that are Patch properties. +use the ``bbox`` property of text to surround the text with a +:class:`~matplotlib.patches.Patch` instance -- the ``bbox`` keyword +argument takes a dictionary with keys that are Patch properties. .. plot:: :include-source: Deleted: branches/v1_0_maint/examples/units/date_converter.py =================================================================== --- branches/v1_0_maint/examples/units/date_converter.py 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/examples/units/date_converter.py 2010-11-09 15:23:25 UTC (rev 8785) @@ -1,20 +0,0 @@ -import date_support # set up the date converters -import datetime -from matplotlib.dates import drange -from pylab import figure, show -import numpy as np - - -xmin = datetime.date(2007,1,1) -xmax = datetime.date.today() -delta = datetime.timedelta(days=1) -xdates = drange(xmin, xmax, delta) - -fig = figure() -fig.subplots_adjust(bottom=0.2) -ax = fig.add_subplot(111) -ax.plot(xdates, np.random.rand(len(xdates)), 'o') -ax.set_xlim(datetime.date(2007,2,1), datetime.date(2007,3,1)) - -fig.autofmt_xdate() -show() Deleted: branches/v1_0_maint/examples/units/date_support.py =================================================================== --- branches/v1_0_maint/examples/units/date_support.py 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/examples/units/date_support.py 2010-11-09 15:23:25 UTC (rev 8785) @@ -1,36 +0,0 @@ -import matplotlib -matplotlib.rcParams['units'] = True -from matplotlib.cbook import iterable, is_numlike -import matplotlib.units as units -import matplotlib.dates as dates -import matplotlib.ticker as ticker -import datetime - -class DateConverter(units.ConversionInterface): - - @staticmethod - def axisinfo(unit, axis): - 'return the unit AxisInfo' - if unit=='date': - majloc = dates.AutoDateLocator() - majfmt = dates.AutoDateFormatter(majloc) - return units.AxisInfo( - majloc = majloc, - majfmt = majfmt, - label='date', - ) - else: return None - - @staticmethod - def convert(value, unit, axis): - if units.ConversionInterface.is_numlike(value): return value - return dates.date2num(value) - - @staticmethod - def default_units(x, axis): - 'return the default unit for x or None' - return 'date' - - -units.registry[datetime.date] = DateConverter() -units.registry[datetime.datetime] = DateConverter() Modified: branches/v1_0_maint/lib/matplotlib/sphinxext/plot_directive.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/sphinxext/plot_directive.py 2010-11-09 07:46:54 UTC (rev 8784) +++ branches/v1_0_maint/lib/matplotlib/sphinxext/plot_directive.py 2010-11-09 15:23:25 UTC (rev 8785) @@ -210,6 +210,7 @@ if plot_code is not None: exec_code = 'import numpy as np; import matplotlib.pyplot as plt\n%s'%plot_code + #print 'CONTEXT', context, plot_context, exec_code if context: exec(exec_code, None, plot_context) else: @@ -279,6 +280,8 @@ basedir, fname = os.path.split(plot_path) basename, ext = os.path.splitext(fname) + + all_exists = True # Look for single-figure output files first @@ -288,7 +291,7 @@ all_exists = False break - if all_exists: + if not context and all_exists: return 1 # Then look for multi-figure output files, assuming @@ -307,7 +310,7 @@ else: break - if i != 0: + if not context and i != 0: return i # We didn't find the files, so build them @@ -321,13 +324,17 @@ warnings.warn(s, PlotWarning) return 0 - num_figs = run_savefig(plot_path, basename, tmpdir, destdir, formats) + if not all_exists: + num_figs = run_savefig(plot_path, basename, tmpdir, destdir, formats) - if '__plot__' in sys.modules: - del sys.modules['__plot__'] + if '__plot__' in sys.modules: + del sys.modules['__plot__'] - return num_figs + return num_figs + else: + return 1 + def _plot_directive(plot_path, basedir, function_name, plot_code, caption, options, state_machine): context = options.has_key('context') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wea...@us...> - 2010-11-12 16:10:34
|
Revision: 8794 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8794&view=rev Author: weathergod Date: 2010-11-12 16:10:21 +0000 (Fri, 12 Nov 2010) Log Message: ----------- Fixed a bug in axis3d.py which caused axis labels to not be centered along the axis as well as correctly calculating the rotation angle needed to keep the axis label parallel to the axis irrespectively of the plot's aspect ratio. Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/lib/mpl_toolkits/mplot3d/axis3d.py Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-11-12 14:59:38 UTC (rev 8793) +++ branches/v1_0_maint/CHANGELOG 2010-11-12 16:10:21 UTC (rev 8794) @@ -1,3 +1,5 @@ +2010-11-12 Fixed the placement and angle of axis labels in 3D plots. - BVR + 2010-11-07 New rc parameters examples.download and examples.directory allow bypassing the download mechanism in get_sample_data. - JKS Modified: branches/v1_0_maint/lib/mpl_toolkits/mplot3d/axis3d.py =================================================================== --- branches/v1_0_maint/lib/mpl_toolkits/mplot3d/axis3d.py 2010-11-12 14:59:38 UTC (rev 8793) +++ branches/v1_0_maint/lib/mpl_toolkits/mplot3d/axis3d.py 2010-11-12 16:10:21 UTC (rev 8794) @@ -91,6 +91,7 @@ self.gridlines = art3d.Line3DCollection([], ) self.axes._set_artist_props(self.gridlines) self.axes._set_artist_props(self.label) + # Need to be able to place the label at the correct location self.label._transform = self.axes.transData self.set_rotate_label(kwargs.get('rotate_label', None)) @@ -209,13 +210,23 @@ xyz0.append(coord) # Draw labels - dy = pep[1][1] - pep[1][0] - dx = pep[0][1] - pep[0][0] + peparray = np.asanyarray(pep) + # The transAxes transform is used because the Text object + # rotates the text relative to the display coordinate system. + # Therefore, if we want the labels to remain parallel to the + # axis regardless of the aspect ratio, we need to convert the + # edge points of the plane to display coordinates and calculate + # an angle from that. + # TODO: Maybe Text objects should handle this themselves? + dx, dy = (self.axes.transAxes.transform(peparray[0:2, 1]) - + self.axes.transAxes.transform(peparray[0:2, 0])) lxyz = 0.5*(edgep1 + edgep2) labeldeltas = 1.3 * deltas - lxyz = move_from_center(lxyz, centers, labeldeltas) + axmask = [True, True, True] + axmask[index] = False + lxyz = move_from_center(lxyz, centers, labeldeltas, axmask) tlx, tly, tlz = proj3d.proj_transform(lxyz[0], lxyz[1], lxyz[2], \ renderer.M) self.label.set_position((tlx, tly)) @@ -223,6 +234,7 @@ angle = art3d.norm_text_angle(math.degrees(math.atan2(dy, dx))) self.label.set_rotation(angle) self.label.set_va('center') + self.label.set_ha('center') self.label.draw(renderer) # Grid points at end of one plane This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wea...@us...> - 2010-11-22 16:05:23
|
Revision: 8808 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8808&view=rev Author: weathergod Date: 2010-11-22 16:05:17 +0000 (Mon, 22 Nov 2010) Log Message: ----------- Fixed a mistake with the Hammer projection in the geo module. Thanks to Matthias Plum for reporting and Tobias Winchen for confirming. Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/lib/matplotlib/projections/geo.py Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2010-11-22 14:01:21 UTC (rev 8807) +++ branches/v1_0_maint/CHANGELOG 2010-11-22 16:05:17 UTC (rev 8808) @@ -1,3 +1,5 @@ +2010-11-22 Fixed error with Hammer projection. - BVR + 2010-11-12 Fixed the placement and angle of axis labels in 3D plots. - BVR 2010-11-07 New rc parameters examples.download and examples.directory Modified: branches/v1_0_maint/lib/matplotlib/projections/geo.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/projections/geo.py 2010-11-22 14:01:21 UTC (rev 8807) +++ branches/v1_0_maint/lib/matplotlib/projections/geo.py 2010-11-22 16:05:17 UTC (rev 8808) @@ -346,7 +346,7 @@ cos_latitude = np.cos(latitude) sqrt2 = np.sqrt(2.0) - alpha = 1.0 + cos_latitude * np.cos(half_long) + alpha = np.sqrt(1.0 + cos_latitude * np.cos(half_long)) x = (2.0 * sqrt2) * (cos_latitude * np.sin(half_long)) / alpha y = (sqrt2 * np.sin(latitude)) / alpha return np.concatenate((x, y), 1) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2011-01-03 20:35:05
|
Revision: 8876 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8876&view=rev Author: jdh2358 Date: 2011-01-03 20:34:57 +0000 (Mon, 03 Jan 2011) Log Message: ----------- update pytz to 2010o Modified Paths: -------------- branches/v1_0_maint/examples/animation/animation_blit_gtk.py branches/v1_0_maint/examples/animation/animation_blit_gtk2.py branches/v1_0_maint/lib/pytz/__init__.py branches/v1_0_maint/lib/pytz/tests/test_tzinfo.py branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Bamako branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Cairo branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Casablanca branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Conakry branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Dar_es_Salaam branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Kampala branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Mogadishu branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Nairobi branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Nouakchott branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Timbuktu branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Catamarca branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Cordoba branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Jujuy branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/La_Rioja branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Mendoza branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Salta branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/San_Juan branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/San_Luis branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Tucuman branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Ushuaia branches/v1_0_maint/lib/pytz/zoneinfo/America/Asuncion branches/v1_0_maint/lib/pytz/zoneinfo/America/Cambridge_Bay branches/v1_0_maint/lib/pytz/zoneinfo/America/Cancun branches/v1_0_maint/lib/pytz/zoneinfo/America/Caracas branches/v1_0_maint/lib/pytz/zoneinfo/America/Catamarca branches/v1_0_maint/lib/pytz/zoneinfo/America/Chicago branches/v1_0_maint/lib/pytz/zoneinfo/America/Chihuahua branches/v1_0_maint/lib/pytz/zoneinfo/America/Cordoba branches/v1_0_maint/lib/pytz/zoneinfo/America/Goose_Bay branches/v1_0_maint/lib/pytz/zoneinfo/America/Hermosillo branches/v1_0_maint/lib/pytz/zoneinfo/America/Indiana/Knox branches/v1_0_maint/lib/pytz/zoneinfo/America/Indiana/Tell_City branches/v1_0_maint/lib/pytz/zoneinfo/America/Iqaluit branches/v1_0_maint/lib/pytz/zoneinfo/America/Jujuy branches/v1_0_maint/lib/pytz/zoneinfo/America/Knox_IN branches/v1_0_maint/lib/pytz/zoneinfo/America/Managua branches/v1_0_maint/lib/pytz/zoneinfo/America/Mazatlan branches/v1_0_maint/lib/pytz/zoneinfo/America/Mendoza branches/v1_0_maint/lib/pytz/zoneinfo/America/Menominee branches/v1_0_maint/lib/pytz/zoneinfo/America/Merida branches/v1_0_maint/lib/pytz/zoneinfo/America/Montevideo branches/v1_0_maint/lib/pytz/zoneinfo/America/Ojinaga branches/v1_0_maint/lib/pytz/zoneinfo/America/Pangnirtung branches/v1_0_maint/lib/pytz/zoneinfo/America/Rankin_Inlet branches/v1_0_maint/lib/pytz/zoneinfo/America/Rosario branches/v1_0_maint/lib/pytz/zoneinfo/America/St_Johns branches/v1_0_maint/lib/pytz/zoneinfo/Antarctica/Casey branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Aqtau branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Colombo branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Dili branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Gaza branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Harbin branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Ho_Chi_Minh branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Hong_Kong branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Irkutsk branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Jayapura branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Jerusalem branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Krasnoyarsk branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Magadan branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Makassar branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Manila branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Omsk branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Phnom_Penh branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Pyongyang branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Riyadh87 branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Riyadh88 branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Riyadh89 branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Saigon branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Seoul branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Taipei branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Tbilisi branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Tehran branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Tel_Aviv branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Ujung_Pandang branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Vientiane branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Vladivostok branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Yakutsk branches/v1_0_maint/lib/pytz/zoneinfo/Atlantic/Stanley branches/v1_0_maint/lib/pytz/zoneinfo/Canada/Newfoundland branches/v1_0_maint/lib/pytz/zoneinfo/Egypt branches/v1_0_maint/lib/pytz/zoneinfo/Europe/Helsinki branches/v1_0_maint/lib/pytz/zoneinfo/Europe/Mariehamn branches/v1_0_maint/lib/pytz/zoneinfo/Europe/Moscow branches/v1_0_maint/lib/pytz/zoneinfo/Hongkong branches/v1_0_maint/lib/pytz/zoneinfo/Iran branches/v1_0_maint/lib/pytz/zoneinfo/Israel branches/v1_0_maint/lib/pytz/zoneinfo/Mexico/BajaSur branches/v1_0_maint/lib/pytz/zoneinfo/Mideast/Riyadh87 branches/v1_0_maint/lib/pytz/zoneinfo/Mideast/Riyadh88 branches/v1_0_maint/lib/pytz/zoneinfo/Mideast/Riyadh89 branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Apia branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Fiji branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Kosrae branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Truk branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Yap branches/v1_0_maint/lib/pytz/zoneinfo/ROC branches/v1_0_maint/lib/pytz/zoneinfo/ROK branches/v1_0_maint/lib/pytz/zoneinfo/US/Central branches/v1_0_maint/lib/pytz/zoneinfo/US/Indiana-Starke branches/v1_0_maint/lib/pytz/zoneinfo/W-SU branches/v1_0_maint/lib/pytz/zoneinfo/localtime branches/v1_0_maint/lib/pytz/zoneinfo/zone.tab branches/v1_0_maint/src/_gtkagg.cpp Modified: branches/v1_0_maint/examples/animation/animation_blit_gtk.py =================================================================== --- branches/v1_0_maint/examples/animation/animation_blit_gtk.py 2011-01-03 19:00:11 UTC (rev 8875) +++ branches/v1_0_maint/examples/animation/animation_blit_gtk.py 2011-01-03 20:34:57 UTC (rev 8876) @@ -29,15 +29,28 @@ # for profiling tstart = time.time() +def on_draw(event): + background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + gobject.idle_add(update_line) + + on_draw.background = background + +on_draw.background = None + +fig.canvas.mpl_connect('draw_event', on_draw) + def update_line(*args): - print 'you are here', update_line.cnt - if update_line.background is None: - update_line.background = canvas.copy_from_bbox(ax.bbox) + if on_draw.background is None: + return True + print 'frame', update_line.cnt + # restore the clean slate background - canvas.restore_region(update_line.background) + canvas.restore_region(on_draw.background) # update the data line.set_ydata(np.sin(x+update_line.cnt/10.0)) + # just draw the animated artist ax.draw_artist(line) @@ -54,15 +67,7 @@ return True update_line.cnt = 0 -update_line.background = None -def start_anim(event): - gobject.idle_add(update_line) - canvas.mpl_disconnect(start_anim.cid) -start_anim.cid = canvas.mpl_connect('draw_event', start_anim) - - - plt.show() Modified: branches/v1_0_maint/examples/animation/animation_blit_gtk2.py =================================================================== --- branches/v1_0_maint/examples/animation/animation_blit_gtk2.py 2011-01-03 19:00:11 UTC (rev 8875) +++ branches/v1_0_maint/examples/animation/animation_blit_gtk2.py 2011-01-03 20:34:57 UTC (rev 8876) @@ -20,9 +20,9 @@ class UpdateLine(object): def get_bg_bbox(self): - + return self.ax.bbox.padded(-3) - + def __init__(self, canvas, ax): self.cnt = 0 self.canvas = canvas @@ -31,8 +31,8 @@ self.prev_time = time.time() self.start_time = self.prev_time self.prev_pixel_offset = 0. - + self.x0 = 0 self.phases = np.random.random_sample((20,)) * np.pi * 2 self.line, = ax.plot([], [], "-", animated=True, lw=2) @@ -70,7 +70,7 @@ # restore the clean slate background self.canvas.restore_region(self.background1) - # restore subregion (x1+dx, y1, x2, y2) of the second bg + # restore subregion (x1+dx, y1, x2, y2) of the second bg # in a offset position (x1-dx, y1) x1, y1, x2, y2 = self.background2.get_extents() self.canvas.restore_region(self.background2, @@ -82,18 +82,18 @@ def on_draw(self, *args): self.save_bg() return False - + def update_line(self, *args): if self.background1 is None: return True - + cur_time = time.time() pixel_offset = int((cur_time - self.start_time)*100.) dx_pixel = pixel_offset - self.prev_pixel_offset self.prev_pixel_offset = pixel_offset dx_data = self.get_dx_data(dx_pixel) #cur_time - self.prev_time) - + x0 = self.x0 self.x0 += dx_data self.prev_time = cur_time @@ -109,7 +109,7 @@ self.line.set_color(self.color_cycle.next()) - # now plot line segment within [x0, x0+dx_data], + # now plot line segment within [x0, x0+dx_data], # Note that we're only plotting a line between [x0, x0+dx_data]. xx = np.array([x0, self.x0]) self.line.set_xdata(xx) Modified: branches/v1_0_maint/lib/pytz/__init__.py =================================================================== --- branches/v1_0_maint/lib/pytz/__init__.py 2011-01-03 19:00:11 UTC (rev 8875) +++ branches/v1_0_maint/lib/pytz/__init__.py 2011-01-03 20:34:57 UTC (rev 8876) @@ -9,7 +9,7 @@ ''' # The Olson database is updated several times a year. -OLSON_VERSION = '2010h' +OLSON_VERSION = '2010o' VERSION = OLSON_VERSION # Version format for a patch release - only one so far. #VERSION = OLSON_VERSION + '.2' @@ -358,7 +358,7 @@ return FixedOffset, (self._minutes, ) def dst(self, dt): - return None + return ZERO def tzname(self, dt): return None @@ -387,12 +387,16 @@ pytz.FixedOffset(-330) >>> one.utcoffset(datetime.datetime.now()) datetime.timedelta(-1, 66600) + >>> one.dst(datetime.datetime.now()) + datetime.timedelta(0) >>> two = FixedOffset(1380) >>> two pytz.FixedOffset(1380) >>> two.utcoffset(datetime.datetime.now()) datetime.timedelta(0, 82800) + >>> two.dst(datetime.datetime.now()) + datetime.timedelta(0) The datetime.timedelta must be between the range of -1 and 1 day, non-inclusive. @@ -530,6 +534,7 @@ 'America/Atikokan', 'America/Atka', 'America/Bahia', + 'America/Bahia_Banderas', 'America/Barbados', 'America/Belem', 'America/Belize', @@ -956,6 +961,7 @@ 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', + 'Pacific/Chuuk', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', @@ -981,6 +987,7 @@ 'Pacific/Pago_Pago', 'Pacific/Palau', 'Pacific/Pitcairn', + 'Pacific/Pohnpei', 'Pacific/Ponape', 'Pacific/Port_Moresby', 'Pacific/Rarotonga', @@ -1095,6 +1102,7 @@ 'America/Asuncion', 'America/Atikokan', 'America/Bahia', + 'America/Bahia_Banderas', 'America/Barbados', 'America/Belem', 'America/Belize', @@ -1155,6 +1163,7 @@ 'America/Maceio', 'America/Managua', 'America/Manaus', + 'America/Marigot', 'America/Martinique', 'America/Matamoros', 'America/Mazatlan', @@ -1195,6 +1204,8 @@ 'America/Santo_Domingo', 'America/Sao_Paulo', 'America/Scoresbysund', + 'America/Shiprock', + 'America/St_Barthelemy', 'America/St_Johns', 'America/St_Kitts', 'America/St_Lucia', @@ -1220,8 +1231,10 @@ 'Antarctica/McMurdo', 'Antarctica/Palmer', 'Antarctica/Rothera', + 'Antarctica/South_Pole', 'Antarctica/Syowa', 'Antarctica/Vostok', + 'Arctic/Longyearbyen', 'Asia/Aden', 'Asia/Almaty', 'Asia/Amman', @@ -1331,6 +1344,7 @@ 'Europe/Athens', 'Europe/Belgrade', 'Europe/Berlin', + 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest', 'Europe/Budapest', @@ -1338,35 +1352,46 @@ 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Gibraltar', + 'Europe/Guernsey', 'Europe/Helsinki', + 'Europe/Isle_of_Man', 'Europe/Istanbul', + 'Europe/Jersey', 'Europe/Kaliningrad', 'Europe/Kiev', 'Europe/Lisbon', + 'Europe/Ljubljana', 'Europe/London', 'Europe/Luxembourg', 'Europe/Madrid', 'Europe/Malta', + 'Europe/Mariehamn', 'Europe/Minsk', 'Europe/Monaco', 'Europe/Moscow', 'Europe/Oslo', 'Europe/Paris', + 'Europe/Podgorica', 'Europe/Prague', 'Europe/Riga', 'Europe/Rome', 'Europe/Samara', + 'Europe/San_Marino', + 'Europe/Sarajevo', 'Europe/Simferopol', + 'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Tirane', 'Europe/Uzhgorod', 'Europe/Vaduz', + 'Europe/Vatican', 'Europe/Vienna', 'Europe/Vilnius', 'Europe/Volgograd', 'Europe/Warsaw', + 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich', 'GMT', @@ -1384,6 +1409,7 @@ 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', + 'Pacific/Chuuk', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', @@ -1409,14 +1435,13 @@ 'Pacific/Pago_Pago', 'Pacific/Palau', 'Pacific/Pitcairn', - 'Pacific/Ponape', + 'Pacific/Pohnpei', 'Pacific/Port_Moresby', 'Pacific/Rarotonga', 'Pacific/Saipan', 'Pacific/Tahiti', 'Pacific/Tarawa', 'Pacific/Tongatapu', - 'Pacific/Truk', 'Pacific/Wake', 'Pacific/Wallis', 'US/Alaska', Modified: branches/v1_0_maint/lib/pytz/tests/test_tzinfo.py =================================================================== --- branches/v1_0_maint/lib/pytz/tests/test_tzinfo.py 2011-01-03 19:00:11 UTC (rev 8875) +++ branches/v1_0_maint/lib/pytz/tests/test_tzinfo.py 2011-01-03 20:34:57 UTC (rev 8876) @@ -16,7 +16,7 @@ # I test for expected version to ensure the correct version of pytz is # actually being tested. -EXPECTED_VERSION='2010h' +EXPECTED_VERSION='2010o' fmt = '%Y-%m-%d %H:%M:%S %Z%z' @@ -44,6 +44,7 @@ dt.hour, dt.minute, dt.second, dt.tzname(), offset) + class BasicTest(unittest.TestCase): def testVersion(self): @@ -643,6 +644,28 @@ '2004-10-31 02:00:00 CET+0100' ) + +class CommonTimezonesTestCase(unittest.TestCase): + def test_bratislava(self): + # Bratislava is the default timezone for Slovakia, but our + # heuristics where not adding it to common_timezones. Ideally, + # common_timezones should be populated from zone.tab at runtime, + # but I'm hesitant to pay the startup cost as loading the list + # on demand whilst remaining backwards compatible seems + # difficult. + self.failUnless('Europe/Bratislava' in pytz.common_timezones) + self.failUnless('Europe/Bratislava' in pytz.common_timezones_set) + + def test_us_eastern(self): + self.failUnless('US/Eastern' in pytz.common_timezones) + self.failUnless('US/Eastern' in pytz.common_timezones_set) + + def test_belfast(self): + # Belfast uses London time. + self.failUnless('Europe/Belfast' in pytz.all_timezones_set) + self.failIf('Europe/Belfast' in pytz.common_timezones) + self.failIf('Europe/Belfast' in pytz.common_timezones_set) + def test_suite(): suite = unittest.TestSuite() suite.addTest(doctest.DocTestSuite('pytz')) @@ -651,6 +674,7 @@ suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_tzinfo)) return suite + if __name__ == '__main__': unittest.main(defaultTest='test_suite') Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Bamako =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Cairo =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Casablanca =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Conakry =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Dar_es_Salaam =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Kampala =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Mogadishu =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Nairobi =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Nouakchott =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Africa/Timbuktu =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Catamarca =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/ComodRivadavia =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Cordoba =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Jujuy =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/La_Rioja =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Mendoza =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Rio_Gallegos =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Salta =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/San_Juan =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/San_Luis =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Tucuman =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Argentina/Ushuaia =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Asuncion =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Cambridge_Bay =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Cancun =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Caracas =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Catamarca =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Chicago =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Chihuahua =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Cordoba =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Goose_Bay =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Hermosillo =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Indiana/Knox =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Indiana/Tell_City =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Iqaluit =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Jujuy =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Knox_IN =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Managua =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Mazatlan =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Mendoza =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Menominee =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Merida =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Montevideo =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Ojinaga =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Pangnirtung =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Rankin_Inlet =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/Rosario =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/America/St_Johns =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Antarctica/Casey =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Aqtau =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Colombo =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Dili =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Gaza =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Harbin =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Ho_Chi_Minh =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Hong_Kong =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Irkutsk =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Jayapura =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Jerusalem =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Krasnoyarsk =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Magadan =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Makassar =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Manila =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Omsk =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Phnom_Penh =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Pyongyang =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Riyadh87 =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Riyadh88 =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Riyadh89 =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Saigon =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Seoul =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Taipei =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Tbilisi =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Tehran =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Tel_Aviv =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Ujung_Pandang =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Vientiane =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Vladivostok =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Asia/Yakutsk =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Atlantic/Stanley =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Canada/Newfoundland =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Egypt =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Europe/Helsinki =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Europe/Mariehamn =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Europe/Moscow =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Hongkong =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Iran =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Israel =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Mexico/BajaSur =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Mideast/Riyadh87 =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Mideast/Riyadh88 =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Mideast/Riyadh89 =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Apia =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Fiji =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Kosrae =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Truk =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/Pacific/Yap =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/ROC =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/ROK =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/US/Central =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/US/Indiana-Starke =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/W-SU =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/localtime =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/pytz/zoneinfo/zone.tab =================================================================== --- branches/v1_0_maint/lib/pytz/zoneinfo/zone.tab 2011-01-03 19:00:11 UTC (rev 8875) +++ branches/v1_0_maint/lib/pytz/zoneinfo/zone.tab 2011-01-03 20:34:57 UTC (rev 8876) @@ -1,5 +1,5 @@ # <pre> -# @(#)zone.tab 8.35 +# @(#)zone.tab 8.38 # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. # @@ -41,7 +41,7 @@ AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula -AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole +AQ -7824+10654 Antarctica/Vostok Vostok Station, Lake Vostok AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I AQ -5430+15857 Antarctica/Macquarie Macquarie Island Station, Macquarie Island @@ -177,8 +177,8 @@ FI +6010+02458 Europe/Helsinki FJ -1808+17825 Pacific/Fiji FK -5142-05751 Atlantic/Stanley -FM +0725+15147 Pacific/Truk Truk (Chuuk) and Yap -FM +0658+15813 Pacific/Ponape Ponape (Pohnpei) +FM +0725+15147 Pacific/Chuuk Chuuk (Truk) and Yap +FM +0658+15813 Pacific/Pohnpei Pohnpei (Ponape) FM +0519+16259 Pacific/Kosrae Kosrae FO +6201-00646 Atlantic/Faroe FR +4852+00220 Europe/Paris @@ -288,6 +288,7 @@ MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora MX +3232-11701 America/Tijuana US Pacific Time - Baja California near US border MX +3018-11452 America/Santa_Isabel Mexican Pacific Time - Baja California away from US border +MX +2048-10515 America/Bahia_Banderas Mexican Central Time - Bahia de Banderas MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia MY +0133+11020 Asia/Kuching Sabah & Sarawak MZ -2558+03235 Africa/Maputo Modified: branches/v1_0_maint/src/_gtkagg.cpp =================================================================== --- branches/v1_0_maint/src/_gtkagg.cpp 2011-01-03 19:00:11 UTC (rev 8875) +++ branches/v1_0_maint/src/_gtkagg.cpp 2011-01-03 20:34:57 UTC (rev 8876) @@ -136,6 +136,7 @@ { init_pygobject(); init_pygtk(); + import_array(); //suppress unused warning by creating in two lines static _gtkagg_module* _gtkagg = NULL; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2011-01-05 13:31:30
|
Revision: 8886 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8886&view=rev Author: mdehoon Date: 2011-01-05 13:31:24 +0000 (Wed, 05 Jan 2011) Log Message: ----------- Replace MacOS.WMAvailable, as the MacOS module is not available with 64-bit Pythons, and deprecated for Python 3. Modified Paths: -------------- branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py branches/v1_0_maint/src/_macosx.m Modified: branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py 2011-01-04 22:43:44 UTC (rev 8885) +++ branches/v1_0_maint/lib/matplotlib/backends/backend_macosx.py 2011-01-05 13:31:24 UTC (rev 8886) @@ -2,7 +2,6 @@ import os import numpy -import MacOS from matplotlib._pylab_helpers import Gcf from matplotlib.backend_bases import RendererBase, GraphicsContextBase,\ @@ -229,7 +228,7 @@ """ Create a new figure manager instance """ - if not MacOS.WMAvailable(): + if not _macosx.verify_main_display(): import warnings warnings.warn("Python is not installed as a framework. The MacOSX backend may not work correctly if Python is not installed as a framework. Please see the Python documentation for more information on installing Python as a framework on Mac OS X") FigureClass = kwargs.pop('FigureClass', Figure) Modified: branches/v1_0_maint/src/_macosx.m =================================================================== --- branches/v1_0_maint/src/_macosx.m 2011-01-04 22:43:44 UTC (rev 8885) +++ branches/v1_0_maint/src/_macosx.m 2011-01-05 13:31:24 UTC (rev 8886) @@ -4399,16 +4399,6 @@ return Py_None; } -static char show__doc__[] = "Show all the figures and enter the main loop.\nThis function does not return until all Matplotlib windows are closed,\nand is normally not needed in interactive sessions."; - -static PyObject* -show(PyObject* self) -{ - if(nwin > 0) [NSApp run]; - Py_INCREF(Py_None); - return Py_None; -} - @implementation Window - (Window*)initWithContentRect:(NSRect)rect styleMask:(unsigned int)mask backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation withManager: (PyObject*)theManager { @@ -5139,11 +5129,32 @@ } @end + +static PyObject* +show(PyObject* self) +{ + if(nwin > 0) [NSApp run]; + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* +verify_main_display(PyObject* self) +{ + CGDirectDisplayID display = CGMainDisplayID(); + if (display == 0) { + PyErr_SetString(PyExc_RuntimeError, "Failed to obtain the display ID of the main display"); + return NULL; + } + Py_INCREF(Py_True); + return Py_True; +} + static struct PyMethodDef methods[] = { {"show", (PyCFunction)show, METH_NOARGS, - show__doc__ + "Show all the figures and enter the main loop.\nThis function does not return until all Matplotlib windows are closed,\nand is normally not needed in interactive sessions." }, {"choose_save_file", (PyCFunction)choose_save_file, @@ -5155,11 +5166,17 @@ METH_VARARGS, "Sets the active cursor." }, + {"verify_main_display", + (PyCFunction)verify_main_display, + METH_NOARGS, + "Verifies if the main display can be found. This function fails if Python is not built as a framework." + }, {NULL, NULL, 0, NULL}/* sentinel */ }; void init_macosx(void) { PyObject *m; + import_array(); if (PyType_Ready(&GraphicsContextType) < 0) return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2011-01-05 15:59:40
|
Revision: 8889 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8889&view=rev Author: jdh2358 Date: 2011-01-05 15:59:33 +0000 (Wed, 05 Jan 2011) Log Message: ----------- fix rc file defaults issue for docs; python 2.4 compliance for formlayout Modified Paths: -------------- branches/v1_0_maint/doc/matplotlibrc branches/v1_0_maint/lib/matplotlib/__init__.py branches/v1_0_maint/lib/matplotlib/backends/qt4_editor/formlayout.py Modified: branches/v1_0_maint/doc/matplotlibrc =================================================================== --- branches/v1_0_maint/doc/matplotlibrc 2011-01-05 15:43:30 UTC (rev 8888) +++ branches/v1_0_maint/doc/matplotlibrc 2011-01-05 15:59:33 UTC (rev 8889) @@ -232,7 +232,7 @@ ### FIGURE # See http://matplotlib.sourceforge.net/matplotlib.figure.html#Figure -figure.figsize : 6, 4 # figure size in inches +figure.figsize : 5.5, 4.5 # figure size in inches #figure.dpi : 80 # figure dots per inch #figure.facecolor : 0.75 # figure facecolor; 0.75 is scalar gray #figure.edgecolor : white # figure edgecolor Modified: branches/v1_0_maint/lib/matplotlib/__init__.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-05 15:43:30 UTC (rev 8888) +++ branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-05 15:59:33 UTC (rev 8889) @@ -762,6 +762,7 @@ # this is the instance used by the matplotlib classes rcParams = rc_params() +rcParamsOrig = rcParams.copy() rcParamsDefault = RcParams([ (key, default) for key, (default, converter) in \ defaultParams.iteritems() ]) @@ -843,11 +844,19 @@ def rcdefaults(): """ - Restore the default rc params - the ones that were created at - matplotlib load time. + Restore the default rc params - these are not the params loaded by + the rc file, but mpl's internal params. See rc_file_defaults for + reloading the default params from the rc file """ rcParams.update(rcParamsDefault) +def rc_file_defaults(): + """ + Restore the default rc params from the original matplotlib rc that + was loaded + """ + rcParams.update(rcParamsOrig) + _use_error_msg = """ This call to matplotlib.use() has no effect because the the backend has already been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot, Modified: branches/v1_0_maint/lib/matplotlib/backends/qt4_editor/formlayout.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/backends/qt4_editor/formlayout.py 2011-01-05 15:43:30 UTC (rev 8888) +++ branches/v1_0_maint/lib/matplotlib/backends/qt4_editor/formlayout.py 2011-01-05 15:59:33 UTC (rev 8889) @@ -272,7 +272,11 @@ field.setCurrentIndex(selindex) elif isinstance(value, bool): field = QCheckBox(self) - field.setCheckState(Qt.Checked if value else Qt.Unchecked) + if value: + field.setCheckState(Qt.Checked) + else: + field.setCheckedState(Qt.Unchecked) + elif isinstance(value, float): field = QLineEdit(repr(value), self) elif isinstance(value, int): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2011-01-05 22:04:53
|
Revision: 8893 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8893&view=rev Author: jdh2358 Date: 2011-01-05 22:04:47 +0000 (Wed, 05 Jan 2011) Log Message: ----------- bumpt the rc version num Modified Paths: -------------- branches/v1_0_maint/doc/pyplots/tex_demo.png branches/v1_0_maint/lib/matplotlib/__init__.py Modified: branches/v1_0_maint/doc/pyplots/tex_demo.png =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/__init__.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-05 18:14:36 UTC (rev 8892) +++ branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-05 22:04:47 UTC (rev 8893) @@ -99,7 +99,7 @@ """ from __future__ import generators -__version__ = '1.0.1rc1' +__version__ = '1.0.1rc2' __revision__ = '$Revision$' __date__ = '$Date$' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2011-01-06 13:50:13
|
Revision: 8897 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8897&view=rev Author: jdh2358 Date: 2011-01-06 13:50:07 +0000 (Thu, 06 Jan 2011) Log Message: ----------- tag 1.0.1 for release Modified Paths: -------------- branches/v1_0_maint/CHANGELOG branches/v1_0_maint/doc/api/gridspec_api.rst branches/v1_0_maint/doc/pyplots/tex_demo.png branches/v1_0_maint/lib/matplotlib/__init__.py Modified: branches/v1_0_maint/CHANGELOG =================================================================== --- branches/v1_0_maint/CHANGELOG 2011-01-06 01:26:35 UTC (rev 8896) +++ branches/v1_0_maint/CHANGELOG 2011-01-06 13:50:07 UTC (rev 8897) @@ -1,3 +1,5 @@ +2011-01-04 Tag 1.0.1 for release at r8896 + 2010-11-22 Fixed error with Hammer projection. - BVR 2010-11-12 Fixed the placement and angle of axis labels in 3D plots. - BVR @@ -3,5 +5,5 @@ 2010-11-07 New rc parameters examples.download and examples.directory - allow bypassing the download mechanism in get_sample_data. + allow bypassing the download mechanism in get_sample_data. - JKS Modified: branches/v1_0_maint/doc/api/gridspec_api.rst =================================================================== --- branches/v1_0_maint/doc/api/gridspec_api.rst 2011-01-06 01:26:35 UTC (rev 8896) +++ branches/v1_0_maint/doc/api/gridspec_api.rst 2011-01-06 13:50:07 UTC (rev 8897) @@ -1,6 +1,6 @@ -************* +******************* matplotlib gridspec -************* +******************* :mod:`matplotlib.gridspec` Modified: branches/v1_0_maint/doc/pyplots/tex_demo.png =================================================================== (Binary files differ) Modified: branches/v1_0_maint/lib/matplotlib/__init__.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-06 01:26:35 UTC (rev 8896) +++ branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-06 13:50:07 UTC (rev 8897) @@ -99,7 +99,7 @@ """ from __future__ import generators -__version__ = '1.0.1rc2' +__version__ = '1.0.1' __revision__ = '$Revision$' __date__ = '$Date$' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jd...@us...> - 2011-01-06 19:42:14
|
Revision: 8899 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8899&view=rev Author: jdh2358 Date: 2011-01-06 19:42:08 +0000 (Thu, 06 Jan 2011) Log Message: ----------- support relative paths in examples.directory Modified Paths: -------------- branches/v1_0_maint/doc/matplotlibrc branches/v1_0_maint/lib/matplotlib/__init__.py Modified: branches/v1_0_maint/doc/matplotlibrc =================================================================== --- branches/v1_0_maint/doc/matplotlibrc 2011-01-06 13:57:51 UTC (rev 8898) +++ branches/v1_0_maint/doc/matplotlibrc 2011-01-06 19:42:08 UTC (rev 8899) @@ -8,6 +8,8 @@ # w/o invoking file downloads for the sampledata (see # matplotlib.cbook.get_sample_data. Unpack # mpl_sampledata-VERSION.tar.gz and point examples.directory to it. +# You can use a relative path for examples.directory and it must be +# relative to this matplotlibrc file #examples.download : False # False to bypass downloading mechanism -#examples.directory : /home/titan/johnh/python/svn/matplotlib.trunk/sample_data/ # directory to look in if download is false +#examples.directory : /your/path/to/sample_data/ # directory to look in if download is false Modified: branches/v1_0_maint/lib/matplotlib/__init__.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-06 13:57:51 UTC (rev 8898) +++ branches/v1_0_maint/lib/matplotlib/__init__.py 2011-01-06 19:42:08 UTC (rev 8899) @@ -762,6 +762,21 @@ # this is the instance used by the matplotlib classes rcParams = rc_params() + +if rcParams['examples.directory']: + # paths that are intended to be relative to matplotlib_fname() + # are allowed for the examples.directory parameter. + # However, we will need to fully qualify the path because + # Sphinx requires absolute paths. + if not os.path.isabs(rcParams['examples.directory']): + _basedir, _fname = os.path.split(matplotlib_fname()) + # Sometimes matplotlib_fname() can return relative paths, + # Also, using realpath() guarentees that Sphinx will use + # the same path that matplotlib sees (in case of weird symlinks). + _basedir = os.path.realpath(_basedir) + _fullpath = os.path.join(_basedir, rcParams['examples.directory']) + rcParams['examples.directory'] = _fullpath + rcParamsOrig = rcParams.copy() rcParamsDefault = RcParams([ (key, default) for key, (default, converter) in \ @@ -770,6 +785,8 @@ rcParams['ps.usedistiller'] = checkdep_ps_distiller(rcParams['ps.usedistiller']) rcParams['text.usetex'] = checkdep_usetex(rcParams['text.usetex']) + + def rc(group, **kwargs): """ Set the current rc params. Group is the grouping for the rc, eg. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <md...@us...> - 2011-02-01 16:03:01
|
Revision: 8939 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8939&view=rev Author: mdboom Date: 2011-02-01 16:02:54 +0000 (Tue, 01 Feb 2011) Log Message: ----------- [3167200] Use from PIL import Image Modified Paths: -------------- branches/v1_0_maint/examples/pylab_examples/image_demo3.py branches/v1_0_maint/examples/pylab_examples/to_numeric.py branches/v1_0_maint/examples/user_interfaces/histogram_demo_canvasagg.py branches/v1_0_maint/lib/matplotlib/image.py Modified: branches/v1_0_maint/examples/pylab_examples/image_demo3.py =================================================================== --- branches/v1_0_maint/examples/pylab_examples/image_demo3.py 2011-02-01 04:15:20 UTC (rev 8938) +++ branches/v1_0_maint/examples/pylab_examples/image_demo3.py 2011-02-01 16:02:54 UTC (rev 8939) @@ -1,7 +1,7 @@ #!/usr/bin/env python from pylab import * try: - import Image + from PIL import Image except ImportError, exc: raise SystemExit("PIL must be installed to run this example") Modified: branches/v1_0_maint/examples/pylab_examples/to_numeric.py =================================================================== --- branches/v1_0_maint/examples/pylab_examples/to_numeric.py 2011-02-01 04:15:20 UTC (rev 8938) +++ branches/v1_0_maint/examples/pylab_examples/to_numeric.py 2011-02-01 16:02:54 UTC (rev 8939) @@ -8,7 +8,7 @@ from pylab import * from matplotlib.backends.backend_agg import FigureCanvasAgg try: - import Image + from PIL import Image except ImportError, exc: raise SystemExit("PIL must be installed to run this example") Modified: branches/v1_0_maint/examples/user_interfaces/histogram_demo_canvasagg.py =================================================================== --- branches/v1_0_maint/examples/user_interfaces/histogram_demo_canvasagg.py 2011-02-01 04:15:20 UTC (rev 8938) +++ branches/v1_0_maint/examples/user_interfaces/histogram_demo_canvasagg.py 2011-02-01 16:02:54 UTC (rev 8939) @@ -54,7 +54,7 @@ if 0: # pass off to PIL - import Image + from PIL import Image im = Image.fromstring( "RGB", (w,h), s) im.show() Modified: branches/v1_0_maint/lib/matplotlib/image.py =================================================================== --- branches/v1_0_maint/lib/matplotlib/image.py 2011-02-01 04:15:20 UTC (rev 8938) +++ branches/v1_0_maint/lib/matplotlib/image.py 2011-02-01 16:02:54 UTC (rev 8939) @@ -1157,7 +1157,7 @@ def pilread(): 'try to load the image with PIL or return None' - try: import Image + try: from PIL import Image except ImportError: return None image = Image.open( fname ) return pil_to_array(image) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |