annotate scripts/plot/contourf.m @ 7331:3ed85de5922c

[project @ 2007-12-21 17:40:20 by jwe]
author jwe
date Fri, 21 Dec 2007 17:41:35 +0000
parents 9af6f0a214ee
children 8bf1bcb0ad8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
1 ## Copyright (C) 2007 Kai Habel
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
2 ## Copyright (C) 2003 Shai Ayal
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
3 ##
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
4 ## This file is part of Octave.
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
5 ##
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
7 ## under the terms of the GNU General Public License as published by
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
8 ## the Free Software Foundation; either version 3 of the License, or (at
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
9 ## your option) any later version.
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
10 ##
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
14 ## General Public License for more details.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
15 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
7164
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
2b5e6c0a9df9 [project @ 2007-11-12 22:04:42 by jwe]
jwe
parents: 7042
diff changeset
18 ## <http://www.gnu.org/licenses/>.
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
19
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
20 ## -*- texinfo -*-
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
21 ## @deftypefn {Function File} {[@var{c}, @var{h}] =} contourf (@var{x}, @var{y}, @var{z}, @var{lvl})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
22 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{x}, @var{y}, @var{z}, @var{n})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
23 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{x}, @var{y}, @var{z})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
24 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{z}, @var{n})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
25 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{z}, @var{lvl})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
26 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{z})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
27 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@var{ax}, @dots{})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
28 ## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contourf (@dots{}, @var{"property"}, @var{val})
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
29 ## Compute and plot filled contours of the matrix @var{z}.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
30 ## Parameters @var{x}, @var{y} and @var{n} or @var{lvl} are optional.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
31 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
32 ## The return value @var{c} is a 2xn matrix containing the contour lines
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
33 ## as described in the help to the contourc function.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
34 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
35 ## The return value @var{h} is handle-vector to the patch objects creating
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
36 ## the filled contours.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
37 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
38 ## If @var{x} and @var{y} are ommited they are taken as the row/column
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
39 ## index of @var{z}. @var{n} is a scalar denoting the number of lines
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
40 ## to compute. Alternatively @var{lvl} is a vector containing the
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
41 ## contour levels. If only one value (e.g. lvl0) is wanted, set
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
42 ## @var{lvl} to [lvl0, lvl0]. If both @var{n} or @var{lvl} are omitted
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
43 ## a default value of 10 contour level is assumed.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
44 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
45 ## If provided, the filled contours are added to the axes object
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
46 ## @var{ax} instead of the current axis.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
47 ##
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
48 ## The following example plots filled contours of the @code{peaks}
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
49 ## function.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
50 ## @example
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
51 ## [x, y, z] = peaks (50);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
52 ## contourf (x, y, z, -7:9)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
53 ## @end example
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
54 ## @seealso{contour, contourc, patch}
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
55 ## @end deftypefn
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
56
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
57 ## Author: Kai Habel <kai.habel@gmx.de>
7327
9af6f0a214ee [project @ 2007-12-19 21:39:02 by jwe]
jwe
parents: 7245
diff changeset
58 ## Author: Shai Ayal <shaiay@users.sourceforge.net>
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
59
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
60 function varargout = contourf (varargin)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
61
7215
dd88d61d443f [project @ 2007-11-29 16:44:45 by jwe]
jwe
parents: 7164
diff changeset
62 [ax, varargin] = __plt_get_axis_arg__ ("contourf", varargin{:});
7216
5389a52df87b [project @ 2007-11-29 19:07:29 by jwe]
jwe
parents: 7215
diff changeset
63
7215
dd88d61d443f [project @ 2007-11-29 16:44:45 by jwe]
jwe
parents: 7164
diff changeset
64 [X, Y, Z, lvl, patch_props] = parse_args (varargin);
7216
5389a52df87b [project @ 2007-11-29 19:07:29 by jwe]
jwe
parents: 7215
diff changeset
65
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
66 [nr, nc] = size (Z);
7216
5389a52df87b [project @ 2007-11-29 19:07:29 by jwe]
jwe
parents: 7215
diff changeset
67
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
68 [minx, maxx] = deal (min (X(:)), max (X(:)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
69 [miny, maxy] = deal (min (Y(:)), max (Y(:)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
70
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
71 if (diff (lvl) < 10*eps)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
72 lvl_eps = 1e-6;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
73 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
74 lvl_eps = min (diff (lvl)) / 1000.0;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
75 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
76
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
77 X0 = prepad(X, nc+1, 2 * X(1, 1) - X(1, 2), 2);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
78 X0 = postpad(X0, nc+2, 2 * X(1, nc) - X(1, nc - 1), 2);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
79 X0 = [X0(1, :); X0; X0(1, :)];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
80 Y0 = prepad(Y, nr+1, 2 * Y(1, 1) - Y(2, 1), 1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
81 Y0 = postpad(Y0, nr+2, 2 * Y(nr, 1) - Y(nr - 1, 1));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
82 Y0 = [Y0(:, 1), Y0, Y0(:, 1)];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
83
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
84 Z0 = -Inf(nr+2, nc+2);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
85 Z0(2:nr+1, 2:nc+1) = Z;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
86 [c, lev] = contourc (X0, Y0, Z0, lvl);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
87 cmap = colormap ();
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
88
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
89 levx = linspace (min (lev), max (lev), size (cmap, 1));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
90
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
91 newplot ();
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
92
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
93 ## Decode contourc output format.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
94 i1 = 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
95 ncont = 0;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
96 while (i1 < columns (c))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
97 ncont++;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
98 cont_lev(ncont) = c(1, i1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
99 cont_len(ncont) = c(2, i1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
100 cont_idx(ncont) = i1+1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
101
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
102 ii = i1+1:i1+cont_len(ncont);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
103 cur_cont = c(:, ii);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
104 c(:, ii);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
105 startidx = ii(1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
106 stopidx = ii(end);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
107 cont_area(ncont) = polyarea (c(1, ii), c(2, ii));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
108 i1 += c(2, i1) + 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
109 endwhile
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
110
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
111 ## Handle for each level the case where we have (a) hole(s) in a patch.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
112 ## Those are to be filled with the color of level below or with the
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
113 ## background colour.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
114 for k = 1:numel (lev)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
115 lvl_idx = find (abs (cont_lev - lev(k)) < lvl_eps);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
116 len = numel (lvl_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
117 if (len > 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
118 ## mark = logical(zeros(size(lvl_idx)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
119 mark = false (size (lvl_idx));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
120 a = 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
121 while (a < len)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
122 # take 1st patch
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
123 b = a + 1;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
124 pa_idx = lvl_idx(a);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
125 # get pointer to contour start, and contour length
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
126 curr_ct_idx = cont_idx(pa_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
127 curr_ct_len = cont_len(pa_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
128 # get contour
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
129 curr_ct = c(:, curr_ct_idx:curr_ct_idx+curr_ct_len-1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
130 b_vec = (a+1):len;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
131 next_ct_pt_vec = c(:, cont_idx(lvl_idx(b_vec)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
132 in = inpolygon (next_ct_pt_vec(1,:), next_ct_pt_vec(2,:),
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
133 curr_ct(1, :), curr_ct(2, :));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
134 mark(b_vec(in)) = !mark(b_vec(in));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
135 a++;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
136 endwhile
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
137 if (numel (mark) > 0)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
138 ## All marked contours describe a hole in a larger contour of
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
139 ## the same level and must be filled with colour of level below.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
140 ma_idx = lvl_idx(mark);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
141 if (k > 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
142 ## Find color of level below.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
143 tmp = find(abs(cont_lev - lev(k - 1)) < lvl_eps);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
144 lvl_bel_idx = tmp(1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
145 ## Set color of patches found.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
146 cont_lev(ma_idx) = cont_lev(lvl_bel_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
147 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
148 ## Set lowest level contour to NaN.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
149 cont_lev(ma_idx) = NaN;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
150 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
151 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
152 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
153 endfor
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
154
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
155 ## The algorithm can create patches with the size of the plotting
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
156 ## area, we would like to draw only the patch with the highest level.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
157 del_idx = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
158 max_idx = find (cont_area == max (cont_area));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
159 if (numel (max_idx) > 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
160 # delete double entries
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
161 del_idx = max_idx(1:end-1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
162 cont_area(del_idx) = cont_lev(del_idx) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
163 cont_len(del_idx) = cont_idx(del_idx) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
164 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
165
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
166 ## Now we have everything together and can start plotting the patches
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
167 ## beginning with largest area.
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
168 [tmp, svec] = sort (cont_area);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
169 len = ncont - numel (del_idx);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
170 h = zeros (1, len);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
171 for n = len:-1:1
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
172 idx = svec(n);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
173 ii = cont_idx(idx):cont_idx(idx) + cont_len(idx) - 2;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
174 h(n) = patch (c(1, ii), c(2, ii), cont_lev(idx), patch_props{:});
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
175 endfor
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
176
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
177 if (min (lev) == max (lev))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
178 set (gca (), "clim", [min(lev)-1, max(lev)+1]);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
179 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
180 set (gca(), "clim", [min(lev), max(lev)]);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
181 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
182
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
183 if (nargout > 0)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
184 varargout{2} = h;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
185 varargout{1} = c;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
186 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
187
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
188 endfunction
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
189
7215
dd88d61d443f [project @ 2007-11-29 16:44:45 by jwe]
jwe
parents: 7164
diff changeset
190 function [X, Y, Z, lvl, patch_props] = parse_args (arg)
7042
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
191
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
192 patch_props = {};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
193 nolvl = false;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
194
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
195 for n = 1:numel (arg)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
196 if (ischar (arg{n}))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
197 patch_props = arg(n:end);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
198 arg(n:end) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
199 break;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
200 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
201 endfor
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
202
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
203 if (mod (numel (patch_props), 2) != 0)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
204 error ("patch: property value is missing");
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
205 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
206
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
207 if (numel (arg) < 3)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
208 Z = arg{1};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
209 [X, Y] = meshgrid (1:columns (Z), 1:rows (Z));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
210 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
211
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
212 if (numel (arg) == 1)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
213 nolvl = true;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
214 arg(1) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
215 elseif (numel (arg) == 2)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
216 lvl = arg{2};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
217 arg(1:2) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
218 elseif (numel (arg) == 3)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
219 arg{1:3};
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
220 [X, Y, Z] = deal (arg{1:3});
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
221 arg(1:3) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
222 nolvl = true;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
223 elseif (numel (arg) == 4)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
224 [X, Y, Z, lvl] = deal (arg{1:4});
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
225 arg(1:4) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
226 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
227
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
228 if (any (size (X) != size (Y)))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
229 error ("patch: X and Y must be of same size")
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
230 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
231
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
232 if (isvector (X) || isvector (Y))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
233 [X, Y] = meshgrid (X, Y);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
234 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
235
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
236 Z_no_inf = Z(!isinf (Z));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
237 [minz, maxz] = deal (min (Z_no_inf(:)), max (Z_no_inf(:)));
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
238 Z(isnan (Z)) = -Inf;
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
239
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
240 if (nolvl)
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
241 lvl = linspace (minz, maxz, 12);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
242 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
243
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
244 if (isscalar (lvl))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
245 lvl = linspace (minz, maxz, lvl + 2)(1:end-1);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
246 else
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
247 idx1 = find(lvl < minz);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
248 idx2 = find(lvl > maxz);
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
249 lvl(idx1(1:end-1)) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
250 lvl(idx2) = [];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
251 if (isempty (lvl))
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
252 lvl = [minz, minz];
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
253 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
254 endif
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
255
e54cc03d53f6 [project @ 2007-10-19 20:43:32 by jwe]
jwe
parents:
diff changeset
256 endfunction
7245
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7216
diff changeset
257
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7216
diff changeset
258 %!demo
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7216
diff changeset
259 %! [x, y, z] = peaks (50);
d65670971cbc [project @ 2007-12-04 03:03:54 by jwe]
jwe
parents: 7216
diff changeset
260 %! contourf (x, y, z, -7:9)
7327
9af6f0a214ee [project @ 2007-12-19 21:39:02 by jwe]
jwe
parents: 7245
diff changeset
261
9af6f0a214ee [project @ 2007-12-19 21:39:02 by jwe]
jwe
parents: 7245
diff changeset
262 %!demo
7331
3ed85de5922c [project @ 2007-12-21 17:40:20 by jwe]
jwe
parents: 7327
diff changeset
263 %! [theta, r] = meshgrid (linspace (0, 2*pi, 64), linspace(0,1,64));
3ed85de5922c [project @ 2007-12-21 17:40:20 by jwe]
jwe
parents: 7327
diff changeset
264 %! [X, Y] = pol2cart (theta, r);
3ed85de5922c [project @ 2007-12-21 17:40:20 by jwe]
jwe
parents: 7327
diff changeset
265 %! Z = sin(2*theta).*(1-r);
3ed85de5922c [project @ 2007-12-21 17:40:20 by jwe]
jwe
parents: 7327
diff changeset
266 %! contourf(X, Y, abs(Z), 10)