Mercurial > hg > octave-lyh
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) |