Mercurial > hg > octave-nkf
annotate scripts/plot/hist.m @ 17188:b90915ba489d
refreshdata.m: Recode for 17% faster performance.
* scripts/plot/refreshdata.m: Remove one for loop. Use strfind instead of
regexp.
author | Rik <rik@octave.org> |
---|---|
date | Tue, 06 Aug 2013 12:46:31 -0700 |
parents | 1e2641277b2a |
children | be7e8b91c6b1 |
rev | line source |
---|---|
14138
72c96de7a403
maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents:
11587
diff
changeset
|
1 ## Copyright (C) 1994-2012 John W. Eaton |
2313 | 2 ## |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7016 | 7 ## the Free Software Foundation; either version 3 of the License, or (at |
8 ## your option) any later version. | |
2313 | 9 ## |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
724 | 18 |
3368 | 19 ## -*- texinfo -*- |
11563
3c6e8aaa9555
Grammarcheck m-files before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
20 ## @deftypefn {Function File} {} hist (@var{y}) |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
21 ## @deftypefnx {Function File} {} hist (@var{y}, @var{x}) |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
22 ## @deftypefnx {Function File} {} hist (@var{y}, @var{nbins}) |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
23 ## @deftypefnx {Function File} {} hist (@var{y}, @var{x}, @var{norm}) |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
24 ## @deftypefnx {Function File} {} hist (@dots{}, @var{prop}, @var{val}, @dots{}) |
17162
1e2641277b2a
hist.m: Correct typo in Texinfo docstring in cset b491ef539071.
Rik <rik@octave.org>
parents:
17158
diff
changeset
|
25 ## @deftypefnx {Function File} {} hist (@var{hax}, @dots{}) |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
26 ## @deftypefnx {Function File} {[@var{nn}, @var{xx}] =} hist (@dots{}) |
2311 | 27 ## Produce histogram counts or plots. |
3426 | 28 ## |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11575
diff
changeset
|
29 ## With one vector input argument, @var{y}, plot a histogram of the values |
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11575
diff
changeset
|
30 ## with 10 bins. The range of the histogram bins is determined by the |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
31 ## range of the data. With one matrix input argument, @var{y}, plot a |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
32 ## histogram where each bin contains a bar per input column. |
3426 | 33 ## |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
34 ## Given a second vector argument, @var{x}, use that as the centers of |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11575
diff
changeset
|
35 ## the bins, with the width of the bins determined from the adjacent |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
36 ## values in the vector. |
3426 | 37 ## |
11575
d6619410e79c
Spellcheck documentation before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11563
diff
changeset
|
38 ## If scalar, the second argument, @var{nbins}, defines the number of bins. |
3426 | 39 ## |
11575
d6619410e79c
Spellcheck documentation before 3.4 release.
Rik <octave@nomad.inbox5.com>
parents:
11563
diff
changeset
|
40 ## If a third argument is provided, the histogram is normalized such that |
3597 | 41 ## the sum of the bars is equal to @var{norm}. |
42 ## | |
2311 | 43 ## Extreme values are lumped in the first and last bins. |
3426 | 44 ## |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
45 ## The histogram's appearance may be modified by specifying property/value |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
46 ## pairs. For example the face and edge color may be modified. |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
47 ## |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
48 ## @example |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
49 ## @group |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
50 ## hist (randn (1, 100), 25, "facecolor", "r", "edgecolor", "b"); |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
51 ## @end group |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
52 ## @end example |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
53 ## |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
54 ## @noindent |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
55 ## The histogram's colors also depend upon the current colormap. |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
56 ## |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
57 ## @example |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
58 ## @group |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
59 ## hist (rand (10, 3)); |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
60 ## colormap (summer ()); |
11351
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
61 ## @end group |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
62 ## @end example |
bff585d759cf
improved the help text in hist.m
Doug Stewart <doug.dastew@gmail.com>
parents:
10549
diff
changeset
|
63 ## |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
64 ## If the first argument @var{hax} is an axes handle, then plot into this axis, |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
65 ## rather than the current axes returned by @code{gca}. |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
66 ## |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
67 ## With two output arguments, produce the values @var{nn} and @var{xx} such |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
68 ## that @code{bar (@var{xx}, @var{nn})} will plot the histogram. |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
69 ## |
17122
eaab03308c0b
doc: Rewrite docstrings for most plot functions.
Rik <rik@octave.org>
parents:
14872
diff
changeset
|
70 ## @seealso{histc, bar, pie, rose} |
3368 | 71 ## @end deftypefn |
724 | 72 |
2314 | 73 ## Author: jwe |
74 | |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
75 function [nn, xx] = hist (varargin) |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
76 |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
77 [hax, varargin, nargin] = __plt_get_axis_arg__ ("hist", varargin{:}); |
724 | 78 |
7112 | 79 if (nargin < 1) |
6046 | 80 print_usage (); |
724 | 81 endif |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
82 |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
83 y = varargin{1}; |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
84 varargin = varargin(2:end); |
2325 | 85 |
5443 | 86 arg_is_vector = isvector (y); |
5065 | 87 |
88 if (rows (y) == 1) | |
4880 | 89 y = y(:); |
90 endif | |
91 | |
92 if (isreal (y)) | |
7112 | 93 max_val = max (y(:)); |
94 min_val = min (y(:)); | |
724 | 95 else |
8427
26b899d309f6
help and error string corrected in hist.m.
Francesco Potortì <pot@gnu.org>
parents:
7566
diff
changeset
|
96 error ("hist: first argument must be real valued"); |
724 | 97 endif |
98 | |
7112 | 99 iarg = 1; |
100 if (nargin == 1 || ischar (varargin{iarg})) | |
724 | 101 n = 10; |
4880 | 102 x = [0.5:n]'/n; |
14868
5d3a684236b0
maint: Use Octave coding conventions for cuddling parentheses in scripts directory
Rik <octave@nomad.inbox5.com>
parents:
14613
diff
changeset
|
103 x = x * (max_val - min_val) + ones (size (x)) * min_val; |
3597 | 104 else |
105 ## nargin is either 2 or 3 | |
7208 | 106 x = varargin{iarg++}; |
4030 | 107 if (isscalar (x)) |
724 | 108 n = x; |
109 if (n <= 0) | |
110 error ("hist: number of bins must be positive"); | |
111 endif | |
4880 | 112 x = [0.5:n]'/n; |
7191 | 113 x = x * (max_val - min_val) + ones (size (x)) * min_val; |
4880 | 114 elseif (isreal (x)) |
115 if (isvector (x)) | |
10549 | 116 x = x(:); |
4880 | 117 endif |
724 | 118 tmp = sort (x); |
119 if (any (tmp != x)) | |
904 | 120 warning ("hist: bin values not sorted on input"); |
724 | 121 x = tmp; |
122 endif | |
123 else | |
124 error ("hist: second argument must be a scalar or a vector"); | |
125 endif | |
126 endif | |
127 | |
7189 | 128 ## Avoid issues with integer types for x and y |
129 x = double (x); | |
130 y = double (y); | |
131 | |
4880 | 132 cutoff = (x(1:end-1,:) + x(2:end,:)) / 2; |
133 n = rows (x); | |
7566
b3acdf1c41a5
hist: avoid temps; allow matrix args when number of bins > 30
John W. Eaton <jwe@octave.org>
parents:
7208
diff
changeset
|
134 y_nc = columns (y); |
4880 | 135 if (n < 30 && columns (x) == 1) |
4407 | 136 ## The following algorithm works fastest for n less than about 30. |
7566
b3acdf1c41a5
hist: avoid temps; allow matrix args when number of bins > 30
John W. Eaton <jwe@octave.org>
parents:
7208
diff
changeset
|
137 chist = zeros (n+1, y_nc); |
4407 | 138 for i = 1:n-1 |
4880 | 139 chist(i+1,:) = sum (y <= cutoff(i)); |
4407 | 140 endfor |
5746 | 141 chist(n+1,:) = sum (! isnan (y)); |
4407 | 142 else |
143 ## The following algorithm works fastest for n greater than about 30. | |
144 ## Put cutoff elements between boundaries, integrate over all | |
145 ## elements, keep totals at boundaries. | |
7566
b3acdf1c41a5
hist: avoid temps; allow matrix args when number of bins > 30
John W. Eaton <jwe@octave.org>
parents:
7208
diff
changeset
|
146 [s, idx] = sort ([y; repmat(cutoff, 1, y_nc)]); |
4880 | 147 len = rows (y); |
148 chist = cumsum (idx <= len); | |
7566
b3acdf1c41a5
hist: avoid temps; allow matrix args when number of bins > 30
John W. Eaton <jwe@octave.org>
parents:
7208
diff
changeset
|
149 chist = [(zeros (1, y_nc)); |
10549 | 150 (reshape (chist(idx > len), rows (cutoff), y_nc)); |
151 (chist(end,:) - sum (isnan (y)))]; | |
4407 | 152 endif |
153 | |
4880 | 154 freq = diff (chist); |
724 | 155 |
7191 | 156 if (nargin > 2 && ! ischar (varargin{iarg})) |
3597 | 157 ## Normalise the histogram. |
7112 | 158 norm = varargin{iarg++}; |
14613
e7c8e31f8e5d
hist.m: Add test to check for correct NaN normalising
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14612
diff
changeset
|
159 freq = freq / sum(! isnan (y)) * norm; |
3597 | 160 endif |
161 | |
6586 | 162 if (nargout > 0) |
5065 | 163 if (arg_is_vector) |
4880 | 164 nn = freq'; |
165 xx = x'; | |
166 else | |
167 nn = freq; | |
168 xx = x; | |
169 endif | |
736 | 170 else |
17158
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
171 if (isempty (hax)) |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
172 hax = gca (); |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
173 endif |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
174 if (columns (freq) != 1) |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
175 bar (hax, x, freq, 0.8, varargin{iarg:end}); |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
176 else |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
177 bar (hax, x, freq, 1.0, varargin{iarg:end}); |
b491ef539071
hist.m: Accept an axis handle as first input (bug #38508).
Rik <rik@octave.org>
parents:
17122
diff
changeset
|
178 endif |
724 | 179 endif |
180 | |
181 endfunction | |
4811 | 182 |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
183 |
4811 | 184 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
185 %! [nn,xx] = hist ([1:4], 3); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
186 %! assert (xx, [1.5,2.5,3.5]); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
187 %! assert (nn, [2,1,1]); |
4880 | 188 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
189 %! [nn,xx] = hist ([1:4]', 3); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
190 %! assert (xx, [1.5,2.5,3.5]); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
191 %! assert (nn, [2,1,1]); |
4880 | 192 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
193 %! [nn,xx] = hist ([1 1 1 NaN NaN NaN 2 2 3],[1 2 3]); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
194 %! assert (xx, [1,2,3]); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
195 %! assert (nn, [3,2,1]); |
5746 | 196 %!test |
14613
e7c8e31f8e5d
hist.m: Add test to check for correct NaN normalising
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14612
diff
changeset
|
197 %! [nn,xx] = hist ([1 1 1 NaN NaN NaN 2 2 3],[1 2 3], 6); |
e7c8e31f8e5d
hist.m: Add test to check for correct NaN normalising
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14612
diff
changeset
|
198 %! assert (xx, [1,2,3]); |
e7c8e31f8e5d
hist.m: Add test to check for correct NaN normalising
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14612
diff
changeset
|
199 %! assert (nn, [3,2,1]); |
e7c8e31f8e5d
hist.m: Add test to check for correct NaN normalising
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14612
diff
changeset
|
200 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
201 %! [nn,xx] = hist ([[1:4]', [1:4]'], 3); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
202 %! assert (xx, [1.5;2.5;3.5]); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
203 %! assert (nn, [[2,1,1]',[2,1,1]']); |
4880 | 204 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
205 %! for n = [10, 30, 100, 1000] |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
206 %! assert (sum (hist ([1:n], n)), n); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
207 %! assert (sum (hist ([1:n], [2:n-1])), n); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
208 %! assert (sum (hist ([1:n], [1:n])), n); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
209 %! assert (sum (hist ([1:n], 29)), n); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
210 %! assert (sum (hist ([1:n], 30)), n); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
211 %! endfor |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
212 %!assert (hist (1,1), 1) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
213 %!assert (size (hist (randn (750,240), 200)), [200,240]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
214 |