comparison scripts/plot/draw/fplot.m @ 17572:7bb76a22cde1

maint: Split scripts/plot directory into 4 pieces. scripts/gui : user-interface functions scripts/plot/appearance : functions controlling plot appearance scripts/plot/draw : plotting functions which produce graphs scripts/plot/util : low-level plotting functions and utilities. * scripts/gui/guidata.m, scripts/gui/guihandles.m, scripts/gui/module.mk, scripts/gui/private/__file_filter__.m, scripts/gui/private/__fltk_file_filter__.m, scripts/gui/private/__is_function__.m, scripts/gui/private/__uigetdir_fltk__.m, scripts/gui/private/__uigetfile_fltk__.m, scripts/gui/private/__uiobject_split_args__.m, scripts/gui/private/__uiputfile_fltk__.m, scripts/gui/uicontextmenu.m, scripts/gui/uicontrol.m, scripts/gui/uigetdir.m, scripts/gui/uigetfile.m, scripts/gui/uimenu.m, scripts/gui/uipanel.m, scripts/gui/uipushtool.m, scripts/gui/uiputfile.m, scripts/gui/uiresume.m, scripts/gui/uitoggletool.m, scripts/gui/uitoolbar.m, scripts/gui/uiwait.m, scripts/gui/waitbar.m, scripts/gui/waitforbuttonpress.m: Moved from scripts/plot to scripts/gui * scripts/plot/appearance/__clabel__.m, scripts/plot/appearance/__getlegenddata__.m, scripts/plot/appearance/axis.m, scripts/plot/appearance/box.m, scripts/plot/appearance/caxis.m, scripts/plot/appearance/clabel.m, scripts/plot/appearance/daspect.m, scripts/plot/appearance/diffuse.m, scripts/plot/appearance/grid.m, scripts/plot/appearance/gtext.m, scripts/plot/appearance/hidden.m, scripts/plot/appearance/legend.m, scripts/plot/appearance/orient.m, scripts/plot/appearance/pbaspect.m, scripts/plot/appearance/private/__axis_label__.m, scripts/plot/appearance/private/__axis_limits__.m, scripts/plot/appearance/shading.m, scripts/plot/appearance/specular.m, scripts/plot/appearance/text.m, scripts/plot/appearance/title.m, scripts/plot/appearance/view.m, scripts/plot/appearance/whitebg.m, scripts/plot/appearance/xlabel.m, scripts/plot/appearance/xlim.m, scripts/plot/appearance/ylabel.m, scripts/plot/appearance/ylim.m, scripts/plot/appearance/zlabel.m, scripts/plot/appearance/zlim.m: Moved from scripts/plot to subdir appearance. * scripts/plot/draw/area.m, scripts/plot/draw/bar.m, scripts/plot/draw/barh.m, scripts/plot/draw/colorbar.m, scripts/plot/draw/comet.m, scripts/plot/draw/comet3.m, scripts/plot/draw/compass.m, scripts/plot/draw/contour.m, scripts/plot/draw/contour3.m, scripts/plot/draw/contourc.m, scripts/plot/draw/contourf.m, scripts/plot/draw/cylinder.m, scripts/plot/draw/ellipsoid.m, scripts/plot/draw/errorbar.m, scripts/plot/draw/ezcontour.m, scripts/plot/draw/ezcontourf.m, scripts/plot/draw/ezmesh.m, scripts/plot/draw/ezmeshc.m, scripts/plot/draw/ezplot.m, scripts/plot/draw/ezplot3.m, scripts/plot/draw/ezpolar.m, scripts/plot/draw/ezsurf.m, scripts/plot/draw/ezsurfc.m, scripts/plot/draw/feather.m, scripts/plot/draw/fill.m, scripts/plot/draw/fplot.m, scripts/plot/draw/hist.m, scripts/plot/draw/isocolors.m, scripts/plot/draw/isonormals.m, scripts/plot/draw/isosurface.m, scripts/plot/draw/line.m, scripts/plot/draw/loglog.m, scripts/plot/draw/loglogerr.m, scripts/plot/draw/mesh.m, scripts/plot/draw/meshc.m, scripts/plot/draw/meshz.m, scripts/plot/draw/pareto.m, scripts/plot/draw/patch.m, scripts/plot/draw/pcolor.m, scripts/plot/draw/peaks.m, scripts/plot/draw/pie.m, scripts/plot/draw/pie3.m, scripts/plot/draw/plot.m, scripts/plot/draw/plot3.m, scripts/plot/draw/plotmatrix.m, scripts/plot/draw/plotyy.m, scripts/plot/draw/polar.m, scripts/plot/draw/private/__add_datasource__.m, scripts/plot/draw/private/__bar__.m, scripts/plot/draw/private/__contour__.m, scripts/plot/draw/private/__errcomm__.m, scripts/plot/draw/private/__errplot__.m, scripts/plot/draw/private/__ezplot__.m, scripts/plot/draw/private/__interp_cube__.m, scripts/plot/draw/private/__line__.m, scripts/plot/draw/private/__marching_cube__.m, scripts/plot/draw/private/__patch__.m, scripts/plot/draw/private/__pie__.m, scripts/plot/draw/private/__plt__.m, scripts/plot/draw/private/__quiver__.m, scripts/plot/draw/private/__scatter__.m, scripts/plot/draw/private/__stem__.m, scripts/plot/draw/quiver.m, scripts/plot/draw/quiver3.m, scripts/plot/draw/rectangle.m, scripts/plot/draw/ribbon.m, scripts/plot/draw/rose.m, scripts/plot/draw/scatter.m, scripts/plot/draw/scatter3.m, scripts/plot/draw/semilogx.m, scripts/plot/draw/semilogxerr.m, scripts/plot/draw/semilogy.m, scripts/plot/draw/semilogyerr.m, scripts/plot/draw/shrinkfaces.m, scripts/plot/draw/slice.m, scripts/plot/draw/sombrero.m, scripts/plot/draw/sphere.m, scripts/plot/draw/stairs.m, scripts/plot/draw/stem.m, scripts/plot/draw/stem3.m, scripts/plot/draw/stemleaf.m, scripts/plot/draw/surf.m, scripts/plot/draw/surface.m, scripts/plot/draw/surfc.m, scripts/plot/draw/surfl.m, scripts/plot/draw/surfnorm.m, scripts/plot/draw/tetramesh.m, scripts/plot/draw/trimesh.m, scripts/plot/draw/triplot.m, scripts/plot/draw/trisurf.m, scripts/plot/draw/waterfall.m: Moved from plot/ to subdir draw. * scripts/plot/util/__actual_axis_position__.m, scripts/plot/util/__default_plot_options__.m, scripts/plot/util/__gnuplot_drawnow__.m, scripts/plot/util/__next_line_color__.m, scripts/plot/util/__next_line_style__.m, scripts/plot/util/__plt_get_axis_arg__.m, scripts/plot/util/__pltopt__.m, scripts/plot/util/allchild.m, scripts/plot/util/ancestor.m, scripts/plot/util/axes.m, scripts/plot/util/cla.m, scripts/plot/util/clf.m, scripts/plot/util/close.m, scripts/plot/util/closereq.m, scripts/plot/util/colstyle.m, scripts/plot/util/copyobj.m, scripts/plot/util/figure.m, scripts/plot/util/findall.m, scripts/plot/util/findfigs.m, scripts/plot/util/findobj.m, scripts/plot/util/gca.m, scripts/plot/util/gcbf.m, scripts/plot/util/gcbo.m, scripts/plot/util/gcf.m, scripts/plot/util/gco.m, scripts/plot/util/ginput.m, scripts/plot/util/gnuplot_binary.in, scripts/plot/util/graphics_toolkit.m, scripts/plot/util/hdl2struct.m, scripts/plot/util/hggroup.m, scripts/plot/util/hold.m, scripts/plot/util/isaxes.m, scripts/plot/util/isfigure.m, scripts/plot/util/ishghandle.m, scripts/plot/util/ishold.m, scripts/plot/util/isprop.m, scripts/plot/util/linkprop.m, scripts/plot/util/meshgrid.m, scripts/plot/util/ndgrid.m, scripts/plot/util/newplot.m, scripts/plot/util/print.m, scripts/plot/util/printd.m, scripts/plot/util/private/__add_default_menu__.m, scripts/plot/util/private/__fltk_ginput__.m, scripts/plot/util/private/__fltk_print__.m, scripts/plot/util/private/__ghostscript__.m, scripts/plot/util/private/__gnuplot_get_var__.m, scripts/plot/util/private/__gnuplot_ginput__.m, scripts/plot/util/private/__gnuplot_has_feature__.m, scripts/plot/util/private/__gnuplot_has_terminal__.m, scripts/plot/util/private/__gnuplot_open_stream__.m, scripts/plot/util/private/__gnuplot_print__.m, scripts/plot/util/private/__gnuplot_version__.m, scripts/plot/util/private/__go_draw_axes__.m, scripts/plot/util/private/__go_draw_figure__.m, scripts/plot/util/private/__print_parse_opts__.m, scripts/plot/util/private/__tight_eps_bbox__.m, scripts/plot/util/refresh.m, scripts/plot/util/refreshdata.m, scripts/plot/util/saveas.m, scripts/plot/util/shg.m, scripts/plot/util/struct2hdl.m, scripts/plot/util/subplot.m: Moved from plot to subdir util. * etc/HACKING: Updated directory structure info. * scripts/Makefile.am, scripts/plot/appearance/module.mk, scripts/plot/draw/module.mk, scripts/plot/util/module.mk: Added new directories to build system.
author Rik <rik@octave.org>
date Fri, 04 Oct 2013 17:09:08 -0700
parents scripts/plot/fplot.m@bdb237c7507c
children d63878346099
comparison
equal deleted inserted replaced
17571:6e4ea5c8a4bb 17572:7bb76a22cde1
1 ## Copyright (C) 2005-2012 Paul Kienzle
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
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
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
16 ## along with Octave; see the file COPYING. If not, see
17 ## <http://www.gnu.org/licenses/>.
18
19 ## -*- texinfo -*-
20 ## @deftypefn {Function File} {} fplot (@var{fn}, @var{limits})
21 ## @deftypefnx {Function File} {} fplot (@dots{}, @var{tol})
22 ## @deftypefnx {Function File} {} fplot (@dots{}, @var{n})
23 ## @deftypefnx {Function File} {} fplot (@dots{}, @var{fmt})
24 ## @deftypefnx {Function File} {[@var{x}, @var{y}] =} fplot (@dots{})
25 ## Plot a function @var{fn} within the range defined by @var{limits}.
26 ##
27 ## @var{fn} is a function handle, inline function, or string containing the
28 ## name of the function to evaluate.
29 ##
30 ## The limits of the plot are of the form @w{@code{[@var{xlo}, @var{xhi}]}} or
31 ## @w{@code{[@var{xlo}, @var{xhi}, @var{ylo}, @var{yhi}]}}.
32 ##
33 ## The next three arguments are all optional and any number of them may be
34 ## given in any order.
35 ##
36 ## @var{tol} is the relative tolerance to use for the plot and defaults
37 ## to 2e-3 (.2%).
38 ##
39 ## @var{n} is the minimum number of points to use. When @var{n} is specified,
40 ## the maximum stepsize will be @code{@var{xhi} - @var{xlo} / @var{n}}. More
41 ## than @var{n} points may still be used in order to meet the relative
42 ## tolerance requirement.
43 ##
44 ## The @var{fmt} argument specifies the linestyle to be used by the plot
45 ## command.
46 ##
47 ## If the first argument @var{hax} is an axes handle, then plot into this axis,
48 ## rather than the current axes returned by @code{gca}.
49 ##
50 ## With no output arguments the results are immediately plotted. With two
51 ## output arguments the 2-D plot data is returned. The data can subsequently
52 ## be plotted manually with @code{plot (@var{x}, @var{y})}.
53 ##
54 ## Example:
55 ##
56 ## @example
57 ## @group
58 ## fplot (@@cos, [0, 2*pi])
59 ## fplot ("[cos(x), sin(x)]", [0, 2*pi])
60 ## @end group
61 ## @end example
62 ##
63 ## Note: @code{fplot} works best with continuous functions. Functions with
64 ## discontinuities are unlikely to plot well. This restriction may be removed
65 ## in the future.
66 ## @seealso{ezplot, plot}
67 ## @end deftypefn
68
69 ## Author: Paul Kienzle <pkienzle@users.sf.net>
70
71 function [X, Y] = fplot (varargin)
72
73 [hax, varargin, nargin] = __plt_get_axis_arg__ ("fplot", varargin{:});
74
75 if (nargin < 2 || nargin > 5)
76 print_usage ();
77 endif
78
79 fn = varargin{1};
80 limits = varargin{2};
81 varargin = varargin(3:end);
82
83 if (strcmp (typeinfo (fn), "inline function"))
84 fn = vectorize (fn);
85 nam = formula (fn);
86 elseif (isa (fn, "function_handle"))
87 nam = func2str (fn);
88 elseif (all (isalnum (fn)))
89 nam = fn;
90 elseif (ischar (fn))
91 fn = vectorize (inline (fn));
92 nam = formula (fn);
93 else
94 error ("fplot: FN must be a function handle, inline function, or string");
95 endif
96
97 if (iscomplex (limits) || (numel (limits) != 2 && numel (limits) != 4))
98 error ("fplot: LIMITS must be a real vector with 2 or 4 elements");
99 endif
100
101 n = 5;
102 tol = 2e-3;
103 fmt = "";
104 for i = 1:numel (varargin)
105 arg = varargin{i};
106 if (ischar (arg))
107 fmt = arg;
108 elseif (isnumeric (arg) && isscalar (arg) && arg > 0)
109 if (arg == fix (arg))
110 n = arg;
111 else
112 tol = arg;
113 endif
114 else
115 error ("fplot: bad input in position %d", i+2);
116 endif
117 endfor
118
119 if (n != 5)
120 ## n was specified
121 x0 = linspace (limits(1), limits(2), n/2 + 1)';
122 y0 = feval (fn, x0);
123 x = linspace (limits(1), limits(2), n)';
124 y = feval (fn, x);
125 else
126 x0 = linspace (limits(1), limits(2), 5)';
127 y0 = feval (fn, x0);
128 n = 8;
129 x = linspace (limits(1), limits(2), n)';
130 y = feval (fn, x);
131 endif
132
133 if (rows (x0) != rows (y0))
134 ## FN is a constant value function
135 y0 = repmat (y0, size (x0));
136 y = repmat (y, size (x));
137 endif
138
139 err0 = Inf;
140
141 ## FIXME: This algorithm should really use adaptive scaling as the
142 ## the numerical quadrature algorithms do so that extra points are
143 ## used where they are needed and not spread evenly over the entire
144 ## x-range. Try any function with a discontinuity, such as
145 ## fplot (@tan, [-2, 2]) or fplot ("1./x", [-3, 2]), to see the
146 ## problems with the current solution.
147
148 while (n < 2^18) # Something is wrong if we need more than 250K points
149 yi = interp1 (x0, y0, x, "linear");
150 ## relative error calculation using average of [yi,y] as reference
151 ## since neither estimate is known a priori to be better than the other.
152 err = 0.5 * max (abs ((yi - y) ./ (yi + y))(:));
153 if (err < tol || abs (err - err0) < tol/2)
154 ## Either relative tolerance has been met OR
155 ## algorithm has stopped making any reasonable progress per iteration.
156 break;
157 endif
158 x0 = x;
159 y0 = y;
160 err0 = err;
161 n = 2 * (n - 1) + 1;
162 x = linspace (limits(1), limits(2), n)';
163 y = feval (fn, x);
164 endwhile
165
166 if (nargout == 2)
167 X = x;
168 Y = y;
169 else
170 if (isempty (hax))
171 hax = gca ();
172 endif
173 plot (hax, x, y, fmt);
174 axis (hax, limits);
175 if (isvector (y))
176 legend (hax, nam);
177 else
178 for i = 1:columns (y)
179 nams{i} = sprintf ("%s(:,%i)", nam, i);
180 endfor
181 legend (hax, nams{:});
182 endif
183 endif
184
185 endfunction
186
187
188 %!demo
189 %! clf;
190 %! fplot (@cos, [0, 2*pi]);
191 %! title ('fplot() single function');
192
193 %!demo
194 %! clf;
195 %! fplot ('[cos(x), sin(x)]', [0, 2*pi]);
196 %! title ('fplot() multiple functions');
197
198 %!demo
199 %! clf;
200 %! %% sinc function
201 %! fh = @(x) sin (pi*x) ./ (pi*x);
202 %! fplot (fh, [-5, 5]);
203 %! title ('fplot() sinc function');
204
205 %!test
206 %! [x, y] = fplot ("[cos(x), sin(x)]", [0, 2*pi]);
207 %! assert (columns (y) == 2);
208 %! assert (rows (x) == rows (y));
209 %! assert (y, [cos(x), sin(x)], -2e-3);
210
211 %% Test input validation
212 %!error fplot (1)
213 %!error fplot (1,2,3,4,5,6)
214 %!error <FN must be a function handle> fplot (1, [0 1])
215 %!error <LIMITS must be a real vector> fplot (@cos, [i, 2*i])
216 %!error <LIMITS must be a real vector with 2 or 4> fplot (@cos, [1])
217 %!error <LIMITS must be a real vector with 2 or 4> fplot (@cos, [1 2 3])
218 %!error <bad input in position 3> fplot (@cos,[-1,1], {1})
219