[CHANGESET]: Re: scatter - markersize

John W. Eaton jwe at bevo.che.wisc.edu
Wed Mar 19 12:10:09 CDT 2008


On 19-Mar-2008, David Bateman wrote:

| David Bateman wrote:
| > Christoph Keller wrote:
| >   
| >> in my opinion, scatter(X,Y,S) places the scatter-marks constant in size, even
| >> if a "weigth"-vector S is given as an argument of scatter.
| >>
| >> In __scatter__.m I found:
| >>
| >>   h = patch("faces", [1:length(x)].', "vertices", [x, y, z], "facecolor",
| >> 	      "none", "edgecolor", "flat", "cdata", c, "marker", marker, 
| >> 	      "markersize", s, "linestyle", "none");
| >>
| >> where 's' is a scalar rather than a vector. Is this by design or by
| >> accident?
| >>
| >> thank you for your comments, sincerely
| >> Christoph Keller
| >> (octave 3.0.0, Windows XP)
| >>   
| >>     
| >
| > The calculation of "s" in __scatter__.m is
| >
| > <quote>
| >   if (istart < nargin && firstnonnumeric > istart)
| >     s = varargin{istart};
| >     if (isempty (s))
| >       s = 8;
| >     endif
| >   else
| >     s = 8;
| >   endif
| >   ## Note markersize is in points^2 for 2D and points for 3D, and
| >   ## the below is an approximation, that is empircally visually correct.
| >   if (nd == 2)
| >     s = sqrt (s) / 2;
| >   else
| >     s = s / 4;
| >   endif
| > </quote>
| >
| > Therefore if you pass a value for s as a vector, it is passed to patch
| > as a vector.. The code
| >
| >  n = 100; x = randn(n,1); y = randn(n,1); c = sqrt(x.^2 + y.^2);
| > scatter(x, y, 1:100, c)
| >
| > works fine for me under Octave 3.0.0 and gnuplot 4.2.3 that I'm using..
| > However, it appears to be broken under 3.1.x
| >
| > D.
| >
| >   
| Here is a changeset that gets the markersize for scatter plots working
| again in 3.1.x. However.
| 
| n = 100; x = randn(n,1); y = randn(n,1); c = sqrt(x.^2 + y.^2);
| scatter(x, y, 1:100, c)
| 
| won't work in 3.1.x though it works in 3.0.0... The reason is that the
| patch objects now require that the markersize is a scalar value. This is
| compatible with the behavior of the Matlab patch objects. However,
| matlab allows vector markersizes to scatter plots, and does this by
| using an hggroup to form a "scattergroup" which is a group of N patch
| objects each with different marker sizes.
| 
| I see two ways of fixing this issue
| 
| 1) The right way would be to implement a scattergroup and keep the
| markersize as a scalar value in the patch objects. This seems to me to
| be a significant amount of work and I don't want to do something like
| that if Shai or Michael are working in the background on the graphics.
| 
| 2) The hack would be to allow patch markersize to be a matrix and so
| keep the same behavior as Octave 3.0.0, and a visually similar behavior
| to matlab, but with a handle that is incompatible. I'd be happy enough
| to propose a patch for this if people want this to be done, but its not
| the right thing to do..

I applied the patch.

I'd say wait for hggroups.  If that doesn't happen before 3.1, then we
can go for the hack as a temporary solution.

jwe


More information about the Bug-octave mailing list