Mercurial > hg > octave-nkf
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 |