Hackstein, Francesco's suggestion works for me. col.set_edgecolor( 'none' )
You can also set the linewidth to be 0. col.set_linewidth( 0 ) Colorbars in these cases can be more painful than you might like. You need to make a mappable object and pass that into a figure.colorbar call. Rather than try to explain it in detail, I've just pasted a modified version of my first script that should do what you need. Glad we're getting closer. Ryan ######################## import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Rectangle from matplotlib.collections import PatchCollection n = 100 # Get your xy data points, which are the centers of the rectangles. xy = np.random.rand(n,2) # Set a fixed height height = 0.02 # The variable widths of the rectangles widths = np.random.rand(n)*0.1 # Get a color map and make some colors cmap = plt.cm.hsv colors = np.random.rand(n)*10. # Make a normalized array of colors colors_norm = colors/colors.max() # Here's where you have to make a ScalarMappable with the colormap mappable = plt.cm.ScalarMappable(cmap=cmap) # Give it your non-normalized color data mappable.set_array(colors) rects = [] for p, w in zip(xy, widths): xpos = p[0] - w/2 # The x position will be half the width from the center ypos = p[1] - height/2 # same for the y position, but with height rect = Rectangle( (xpos, ypos), w, height ) # Create a rectangle rects.append(rect) # Add the rectangle patch to our list # Create a collection from the rectangles col = PatchCollection(rects) # set the alpha for all rectangles col.set_alpha(0.3) # Set the colors using the colormap col.set_facecolor( cmap(colors_norm) ) # No lines col.set_linewidth( 0 ) #col.set_edgecolor( 'none' ) # Make a figure and add the collection to the axis. fig = plt.figure() ax = fig.add_subplot(111) ax.add_collection(col) # Add your ScalarMappable to a figure colorbar fig.colorbar(mappable) plt.show() ######################## On 4/26/2013 7:15 AM, Hackstein wrote: > Thanks, Ryan, this is (amost) exactly what I was looking for. Now, I get the > markers and their colors right, but I still have two problems: > The markers have a black edges, that I cannot get rid of. I've tried > > rect = Rectangle(..., ec=None) > > and also > > col.set=edgecolor(None) > > and 'None', respectively, both with no effect whatsoever. > > The second problem is, that I cannot get the colorbar to work. > I tried > > sc = ax.add_collection(col) > plt.colorbar(sc) > > and > > plt.colobar(col) > > both do not work. > Any Ideas how to fix those two issues? > > Thanks, > > -Hackstein > > >> Message: 4 >> Date: Thu, 25 Apr 2013 19:44:23 -0400 >> From: Ryan Nelson <rnelsonc...@gmail.com> >> Subject: Re: [Matplotlib-users] Individual custom markers and colorbar >> To: matplotlib-users@lists.sourceforge.net >> Message-ID: <5179bfd7.7060...@gmail.com> >> Content-Type: text/plain; charset="iso-8859-1" >> >> Hackstein, >> >> Unfortunately, I'm not sure of an 'elegant' way to do what your asking >> with a single call to scatter. Others may know a better way. However, >> you can use rectangle patches and patch collections. (Requires a bit >> more code than scatter but is ultimately more flexible.) >> >> I think the example below does what you need, but with random numbers. >> >> Hope it helps a little. >> >> Ryan >> >> ####################### >> import numpy as np >> import matplotlib.pyplot as plt >> from matplotlib.patches import Rectangle >> from matplotlib.collections import PatchCollection >> >> n = 100 >> >> # Get your xy data points, which are the centers of the rectangles. >> xy = np.random.rand(n,2) >> >> # Set a fixed height >> height = 0.02 >> # The variable widths of the rectangles >> widths = np.random.rand(n)*0.1 >> >> # Get a color map and color values (normalized between 0 and 1) >> cmap = plt.cm.jet >> colors = np.random.rand(n) >> >> rects = [] >> for p, w, c in zip(xy, widths, colors): >> xpos = p[0] - w/2 # The x position will be half the width from the >> center >> ypos = p[1] - height/2 # same for the y position, but with height >> rect = Rectangle( (xpos, ypos), w, height ) # Create a rectangle >> rects.append(rect) # Add the rectangle patch to our list >> >> # Create a collection from the rectangles >> col = PatchCollection(rects) >> # set the alpha for all rectangles >> col.set_alpha(0.3) >> # Set the colors using the colormap >> col.set_facecolor( cmap(colors) ) >> >> # Make a figure and add the collection to the axis. >> ax = plt.subplot(111) >> ax.add_collection(col) >> plt.show() >> >> ############################### >> >> >> On 4/24/2013 5:35 PM, Hackstein wrote: >>> Hi all, >>> >>> I am trying to get a scatter plot using a colormap. Additionally, I >>> need to define every marker for every data point individually -- each >>> being a rectangle with fixed height but varying width as a function of >>> the y-value. X and y being the data coordinates, z being a number to >>> be color coded with the colormap. >>> >>> Ideally, I would like to create a list of width and height values for >>> each data point and tell the scatter plot to use those. >>> >>> So far I got colormapped data with custom markers (simplified): >>> >>> [code] >>> >>> import numpy as np >>> >>> import matplotlib.pyplot as plt >>> >>> from pylab import * >>> >>> x = y = [1,2,3,4,5] >>> >>> z = [2,4,6,8,10] >>> >>> colors = cm.gnuplot2 >>> >>> verts_vec = list(zip([-10.,10.,10.,-10.],[-5.,-5.,5.,5.])) >>> >>> fig = plt.figure(1, figsize=(14.40, 9.00)) >>> >>> ax = fig.add_subplot(1,1,1) >>> >>> sc = ax.scatter(x, y, c=np.asarray(z), marker=None, edgecolor='None', >>> verts=verts_vec, cmap=colors, alpha=1.) >>> >>> plt.colorbar(sc, orientation='horizontal') >>> >>> plt.savefig('test.png', dpi=200) >>> >>> plt.close(1) >>> >>> [/code] >>> >>> But I need to define a marker size for each point, and I also need to >>> do that in axis scale values, not in points. >>> >>> I imagine giving verts a list of N*2 tuples instead of 2 tuples, N >>> being len(x), to define N individual markers. >>> >>> But when doing that I get the error that vertices.ndim==2. >>> >>> A less elegant way would be to plot every data point in an individual >>> scatter plot function, using a for-loop iterating over all data >>> points. Then, however, I see no way to apply a colormap and colorbar. >>> >>> What is the best way to accomplish that then? >>> >>> Thanks, >>> >>> -Hackstein >>> >>> >>> >>> ------------------------------------------------------------------------------ >>> Try New Relic Now & We'll Send You this Cool Shirt >>> New Relic is the only SaaS-based application performance monitoring service >>> that delivers powerful full stack analytics. Optimize and monitor your >>> browser, app, & servers with just a few lines of code. Try New Relic >>> and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr >>> >>> >>> _______________________________________________ >>> Matplotlib-users mailing list >>> Matplotlib-users@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> -------------- next part -------------- >> An HTML attachment was scrubbed... >> >> ------------------------------ >> >> ------------------------------------------------------------------------------ >> Try New Relic Now & We'll Send You this Cool Shirt >> New Relic is the only SaaS-based application performance monitoring service >> that delivers powerful full stack analytics. Optimize and monitor your >> browser, app, & servers with just a few lines of code. Try New Relic >> and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr >> >> ------------------------------ >> >> _______________________________________________ >> Matplotlib-users mailing list >> Matplotlib-users@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >> >> >> End of Matplotlib-users Digest, Vol 83, Issue 23 >> ************************************************ > ------------------------------------------------------------------------------ > Try New Relic Now & We'll Send You this Cool Shirt > New Relic is the only SaaS-based application performance monitoring service > that delivers powerful full stack analytics. Optimize and monitor your > browser, app, & servers with just a few lines of code. Try New Relic > and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr > _______________________________________________ > Matplotlib-users mailing list > Matplotlib-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/matplotlib-users ------------------------------------------------------------------------------ Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only SaaS-based application performance monitoring service that delivers powerful full stack analytics. Optimize and monitor your browser, app, & servers with just a few lines of code. Try New Relic and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users