comparison scripts/plot/private/__scatter__.m @ 10135:4516a0c97ced

Handle linestyleorder. Remove @ markers. Treat edgecolor, markeredgecolor and markerfacecolor correctly in scatter.
author David Bateman <dbateman@free.fr>
date Wed, 20 Jan 2010 02:52:22 +0100
parents 614ad9e7a17b
children 8e58c402ebb2
comparison
equal deleted inserted replaced
10134:be13fa20656a 10135:4516a0c97ced
50 firstnonnumeric = i; 50 firstnonnumeric = i;
51 break; 51 break;
52 endif 52 endif
53 endfor 53 endfor
54 54
55 if (istart < nargin && firstnonnumeric > istart) 55 if (istart <= nargin)
56 s = varargin{istart}; 56 s = varargin{istart};
57 if (isempty (s)) 57 if (isempty (s))
58 s = 6; 58 s = 6;
59 endif 59 endif
60 else 60 else
65 c = varargin{istart + 1}; 65 c = varargin{istart + 1};
66 if (isvector (c)) 66 if (isvector (c))
67 if (columns (c) != 3) 67 if (columns (c) != 3)
68 c = c(:); 68 c = c(:);
69 endif 69 endif
70 elseif (isempty (c))
71 c = __next_line_color__();
72 endif 70 endif
73 elseif (firstnonnumeric == istart + 1 && ischar (varargin{istart + 1})) 71 elseif (firstnonnumeric == istart + 1 && ischar (varargin{istart + 1}))
74 c = varargin{istart + 1}; 72 c = varargin{istart + 1};
75 firstnonnumeric++; 73 firstnonnumeric++;
76 else 74 else
77 c = __next_line_color__(); 75 c = [];
78 endif 76 endif
79 77
80 newargs = {}; 78 newargs = {};
81 filled = false; 79 filled = false;
82 have_marker = false; 80 have_marker = false;
91 if (valid) 89 if (valid)
92 have_marker = true; 90 have_marker = true;
93 marker = linespec.marker; 91 marker = linespec.marker;
94 if (strncmp (marker, "none", 4)) 92 if (strncmp (marker, "none", 4))
95 marker = "o"; 93 marker = "o";
94 elseif (isempty (marker))
95 [dummy, marker] = __next_line_style__ ();
96 endif 96 endif
97 else 97 else
98 error ("%s: invalid linespec", fcn); 98 error ("%s: invalid linespec", fcn);
99 endif 99 endif
100 else 100 else
103 newargs{end+1} = varagin{iarg++}; 103 newargs{end+1} = varagin{iarg++};
104 endif 104 endif
105 endif 105 endif
106 endwhile 106 endwhile
107 107
108 if (isempty (c))
109 c = __next_line_color__();
110 endif
111
108 hg = hggroup (); 112 hg = hggroup ();
109 newargs = __add_datasource__ (fcn, hg, {"x", "y", "z", "c", "size"}, 113 newargs = __add_datasource__ (fcn, hg, {"x", "y", "z", "c", "size"},
110 newargs{:}); 114 newargs{:});
111 115
112 addproperty ("xdata", hg, "data", x); 116 addproperty ("xdata", hg, "data", x);
113 addproperty ("ydata", hg, "data", y); 117 addproperty ("ydata", hg, "data", y);
114 addproperty ("zdata", hg, "data", z); 118 addproperty ("zdata", hg, "data", z);
115 addproperty ("cdata", hg, "data", c); 119 if (ischar (c))
120 addproperty ("cdata", hg, "data", __color_str_rgb__ (c));
121 else
122 addproperty ("cdata", hg, "data", c);
123 endif
116 addproperty ("sizedata", hg, "data", s); 124 addproperty ("sizedata", hg, "data", s);
117 addlistener (hg, "xdata", @update_data); 125 addlistener (hg, "xdata", @update_data);
118 addlistener (hg, "ydata", @update_data); 126 addlistener (hg, "ydata", @update_data);
119 addlistener (hg, "zdata", @update_data); 127 addlistener (hg, "zdata", @update_data);
120 addlistener (hg, "cdata", @update_data); 128 addlistener (hg, "cdata", @update_data);
126 134
127 if (numel (s) == 1) 135 if (numel (s) == 1)
128 s = repmat (s, numel(x), 1); 136 s = repmat (s, numel(x), 1);
129 endif 137 endif
130 138
131 if (ischar (c)) 139 if (ischar (c) || rows(c) == 1)
132 for i = 1 : numel (x) 140 for i = 1 : numel (x)
133 h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:),
134 "faces", 1, "vertices", [x(i), y(i), z(i,:)],
135 "facecolor", "none", "edgecolor", c, "marker", marker,
136 "markersize", s(i), "linestyle", "none");
137 if (filled) 141 if (filled)
138 set(h, "markerfacecolor", c); 142 h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:),
143 "faces", 1, "vertices", [x(i), y(i), z(i,:)],
144 "facecolor", "none", "edgecolor", "none",
145 "marker", marker, "markersize", s(i),
146 "markeredgecolor", none, "markerfacecolor", c,
147 "linestyle", "none");
148 else
149 h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:),
150 "faces", 1, "vertices", [x(i), y(i), z(i,:)],
151 "facecolor", "none", "edgecolor", "none",
152 "marker", marker, "markersize", s(i),
153 "markeredgecolor", c, "markerfacecolor", "none",
154 "linestyle", "none");
139 endif 155 endif
140 endfor 156 endfor
141 else 157 else
142 if (rows (c) == 1)
143 c = repmat (c, numel (x), 1);
144 endif
145
146 for i = 1 : numel (x) 158 for i = 1 : numel (x)
147 h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:),
148 "faces", 1, "vertices", [x(i), y(i), z(i,:)],
149 "facecolor", "none", "edgecolor", "flat",
150 "cdata", c(i,:),
151 "marker", marker, "markersize", s(i),
152 "linestyle", "none");
153 if (filled) 159 if (filled)
154 set(h, "markerfacecolor", "flat"); 160 h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:),
161 "faces", 1, "vertices", [x(i), y(i), z(i,:)],
162 "facecolor", "none", "edgecolor", "none",
163 "marker", marker, "markersize", s(i),
164 "markeredgecolor", "none",
165 "markerfacecolor", "flat",
166 "cdata", c(i,:), "linestyle", "none");
167 else
168 h = __go_patch__ (hg, "xdata", x(i), "ydata", y(i), "zdata", z(i,:),
169 "faces", 1, "vertices", [x(i), y(i), z(i,:)],
170 "facecolor", "none", "edgecolor", "none",
171 "marker", marker, "markersize", s(i),
172 "markeredgecolor", "flat",
173 "markerfacecolor", "none",
174 "cdata", c(i,:), "linestyle", "none");
175
155 endif 176 endif
156 endfor 177 endfor
157 endif 178 endif
158 179
159 else 180 else
161 ## For larger numbers of points, we split the points by common color. 182 ## For larger numbers of points, we split the points by common color.
162 183
163 vert = [x, y, z]; 184 vert = [x, y, z];
164 185
165 if (ischar (c) || rows (c) == 1) 186 if (ischar (c) || rows (c) == 1)
166 h = render_size_color (hg, vert, s, c, marker, filled); 187 h = render_size_color (hg, vert, s, c, marker, filled, false);
167 else 188 else
168 [cc, idx] = unique_idx (c, "rows"); 189 [cc, idx] = unique_idx (c, "rows");
169 if (isscalar (s)) 190 if (isscalar (s))
170 for i = 1:rows (x) 191 for i = 1:rows (x)
171 h = render_size_color (hg, vert(idx{i},:), s, cc(i,:), marker, filled); 192 h = render_size_color (hg, vert(idx{i},:), s, cc(i,:),
193 marker, filled, true);
172 endfor 194 endfor
173 else 195 else
174 for i = 1:rows (x) 196 for i = 1:rows (x)
175 h = render_size_color (hg, vert(idx{i},:), s(idx{i}), cc(i,:), marker, filled); 197 h = render_size_color (hg, vert(idx{i},:), s(idx{i}), cc(i,:),
198 marker, filled, true);
176 endfor 199 endfor
177 endif 200 endif
178 endif 201 endif
179 202
180 endif 203 endif
181 204
182 if (! ischar (c)) 205 if (! ischar (c) && rows (c) > 1)
183 ax = get (hg, "parent"); 206 ax = get (hg, "parent");
184 clim = get (ax, "clim"); 207 clim = get (ax, "clim");
185 if (min(c(:)) < clim(1)) 208 if (min(c(:)) < clim(1))
186 clim(1) = min(c(:)); 209 clim(1) = min(c(:));
187 set (ax, "clim", clim); 210 set (ax, "clim", clim);
188 endif 211 endif
189 if (max(c(:)) > clim(2)) 212 if (max(c(:)) > clim(2))
190 set (ax, "clim", [clim(1), max(c(:))]); 213 set (ax, "clim", [clim(1), max(c(:))]);
191 endif 214 endif
192 endif 215 endif
193 216
194 addproperty ("linewidth", hg, "patchlinewidth", 0.5); 217 addproperty ("linewidth", hg, "patchlinewidth", 0.5);
195 addproperty ("marker", hg, "patchmarker", marker); 218 addproperty ("marker", hg, "patchmarker", marker);
196 if (numel (x) > 0) 219 if (filled)
220 addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", "none");
221 if (ischar (c) || rows (c) == 1)
222 addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", c);
223 else
224 addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", "flat");
225 endif
226 else
197 addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", "none"); 227 addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", "none");
198 addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", "none"); 228 if (ischar (c) || rows (c) == 1)
199 else 229 addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", c);
200 addproperty ("markerfacecolor", hg, "patchmarkerfacecolor", 230 else
201 get (h, "markerfacecolor")); 231 addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", "flat");
202 addproperty ("markeredgecolor", hg, "patchmarkeredgecolor", 232 endif
203 get (h, "color"));
204 endif 233 endif
205 addlistener (hg, "linewidth", @update_props); 234 addlistener (hg, "linewidth", @update_props);
206 addlistener (hg, "marker", @update_props); 235 addlistener (hg, "marker", @update_props);
207 addlistener (hg, "markerfacecolor", @update_props); 236 addlistener (hg, "markerfacecolor", @update_props);
208 addlistener (hg, "markeredgecolor", @update_props); 237 addlistener (hg, "markeredgecolor", @update_props);
233 else 262 else
234 idx = mat2cell (idx, 1, diff ([0, jdx])); 263 idx = mat2cell (idx, 1, diff ([0, jdx]));
235 endif 264 endif
236 endfunction 265 endfunction
237 266
238 function h = render_size_color(hg, vert, s, c, marker, filled) 267 function h = render_size_color(hg, vert, s, c, marker, filled, isflat)
239 if (isscalar (s)) 268 if (isscalar (s))
240 x = vert(:,1); 269 x = vert(:,1);
241 y = vert(:,2); 270 y = vert(:,2);
242 z = vert(:,3:end); 271 z = vert(:,3:end);
243 if (ischar (c)) 272 if (ischar (c) || !isflat)
244 h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z,
245 "faces", 1, "vertices", vert,
246 "facecolor", "none", "edgecolor", c, "marker", marker,
247 "markersize", s, "linestyle", "none");
248 if (filled) 273 if (filled)
249 set(h, "markerfacecolor", c); 274 h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z,
250 endif 275 "faces", 1, "vertices", vert,
251 else 276 "facecolor", "none", "edgecolor", "none",
252 h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z, 277 "marker", marker,
253 "faces", 1, "vertices", vert, 278 "markeredgecolor", "none",
254 "facecolor", "none", "edgecolor", "flat", 279 "markerfacecolor", c,
255 "cdata", c, 280 "markersize", s, "linestyle", "none");
256 "marker", marker, "markersize", s, 281 else
257 "linestyle", "none"); 282 h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z,
283 "faces", 1, "vertices", vert,
284 "facecolor", "none", "edgecolor", "none",
285 "marker", marker,
286 "markeredgecolor", c,
287 "markerfacecolor", "none",
288 "markersize", s, "linestyle", "none");
289 endif
290 else
258 if (filled) 291 if (filled)
259 set(h, "markerfacecolor", "flat"); 292 h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z,
293 "faces", 1, "vertices", vert,
294 "facecolor", "none", "edgecolor", "none",
295 "marker", marker, "markersize", s,
296 "markeredgecolor", "none",
297 "markerfacecolor", "flat",
298 "cdata", c, "linestyle", "none");
299 else
300 h = __go_patch__ (hg, "xdata", x, "ydata", y, "zdata", z,
301 "faces", 1, "vertices", vert,
302 "facecolor", "none", "edgecolor", "none",
303 "marker", marker, "markersize", s,
304 "markeredgecolor", "flat",
305 "markerfacecolor", "none",
306 "cdata", c, "linestyle", "none");
260 endif 307 endif
261 endif 308 endif
262 else 309 else
263 ## FIXME: round the size to one decimal place. It's not quite right, though. 310 ## FIXME: round the size to one decimal place. It's not quite right, though.
264 [ss, idx] = unique_idx (ceil (s*10) / 10); 311 [ss, idx] = unique_idx (ceil (s*10) / 10);
265 for i = 1:rows (ss) 312 for i = 1:rows (ss)
266 h = render_size_color (hg, vert(idx{i},:), ss(i), c, marker, filled); 313 h = render_size_color (hg, vert(idx{i},:), ss(i), c,
314 marker, filled, isflat);
267 endfor 315 endfor
268 endif 316 endif
269 endfunction 317 endfunction
270 318
271 function update_props (h, d) 319 function update_props (h, d)