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

Reply via email to