File: hold.m

package info (click to toggle)
octave 9.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 144,300 kB
  • sloc: cpp: 332,784; ansic: 77,239; fortran: 20,963; objc: 9,396; sh: 8,213; yacc: 4,925; lex: 4,389; perl: 1,544; java: 1,366; awk: 1,259; makefile: 648; xml: 189
file content (201 lines) | stat: -rw-r--r-- 5,389 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
########################################################################
##
## Copyright (C) 2005-2024 The Octave Project Developers
##
## See the file COPYRIGHT.md in the top-level directory of this
## distribution or <https://octave.org/copyright/>.
##
## This file is part of Octave.
##
## Octave is free software: you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## Octave is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Octave; see the file COPYING.  If not, see
## <https://www.gnu.org/licenses/>.
##
########################################################################

## -*- texinfo -*-
## @deftypefn  {} {} hold
## @deftypefnx {} {} hold on
## @deftypefnx {} {} hold off
## @deftypefnx {} {} hold (@var{hax}, @dots{})
## Toggle or set the @qcode{"hold"} state of the plotting engine which
## determines whether new graphic objects are added to the plot or replace
## the existing objects.
##
## @table @code
## @item hold on
## Retain plot data and settings so that subsequent plot commands are displayed
## on a single graph.  Line color and line style are advanced for each new plot
## added.
##
## @item hold all (deprecated)
## Equivalent to @code{hold on}.
##
## @item hold off
## Restore default graphics settings which clear the graph and reset axes
## properties before each new plot command.  (default).
##
## @item hold
## Toggle the current hold state.
## @end table
##
## When given the additional argument @var{hax}, the hold state is modified
## for this axes rather than the current axes returned by @code{gca}.
##
## To query the current hold state use the @code{ishold} function.
## @seealso{ishold, cla, clf, newplot}
## @end deftypefn

function hold (varargin)

  have_axes_arg = false;
  if (nargin > 0 && isscalar (varargin{1}) && isaxes (varargin{1}))
    have_axes_arg = true;
    hax = varargin{1};
    varargin(1) = [];
    nargs = numel (varargin);
    hfig = ancestor (hax, "figure");
  elseif (nargin > 0 && numel (varargin{1}) > 1 && ishghandle (varargin{1}))
    print_usage ();
  else
    hax = gca ();
    hfig = gcf ();
    nargs = numel (varargin);
  endif

  hold_all = false;
  if (nargs == 0)
    turn_hold_off = ishold (hax);
    state_str = ifelse (turn_hold_off, "off", "on");
    axes_str = ifelse (have_axes_arg, "specified", "current");
    printf ("hold is now %s for %s axes\n", state_str, axes_str);
  elseif (nargs == 1)
    state = lower (varargin{1});
    switch (state)
      case "off"
        turn_hold_off = true;
      case "all"
        turn_hold_off = false;
        hold_all = true;
      case "on"
        turn_hold_off = false;
      otherwise
        error ("hold: invalid hold STATE");
    endswitch
  else
    print_usage ();
  endif

  if (turn_hold_off)
    set (hax, "nextplot", "replace");
  else
    set (hax, "nextplot", "add");
    set (hfig, "nextplot", "add");
  endif

endfunction


%!demo
%! clf;
%! t = linspace (0, 2*pi, 100);
%! plot (t, sin (t));
%! hold on;
%! plot (t, cos (t));
%! title ({"hold on", "2 plots shown on same graph"});
%! hold off;

%!demo
%! clf;
%! A = rand (100);
%! [X, Y] = find (A > 0.95);
%! imshow (A);
%! hold on;
%! plot (X, Y, "o");
%! hold off;
%! title ("hold with image and plot");

%!demo
%! clf;
%! colormap ("default");
%! hold on;
%! imagesc (1 ./ hilb (4));
%! plot (1:4, "-s");
%! title ("hold with image and plot");
%! hold off;

%!demo
%! clf;
%! colormap ("default");
%! hold on;
%! imagesc (1 ./ hilb (2));
%! imagesc (1 ./ hilb (4));
%! title ({"hold with two images", "only second image is visible"});
%! hold off;

%!demo
%! clf;
%! colormap ("default");
%! hold on;
%! plot (1:4, "-s");
%! imagesc (1 ./ hilb (4));
%! title ({"hold with plot and image", "only image is visible"});
%! hold off;

%!demo
%! clf;
%! colormap ("default");
%! t = linspace (-3, 3, 50);
%! [x, y] = meshgrid (t, t);
%! z = peaks (x, y);
%! contourf (x, y, z, 10);
%! hold on;
%! plot (x(:), y(:), "^");
%! patch ([-1.0 1.0 1.0 -1.0 -1.0], [-1.0 -1.0 1.0 1.0 -1.0], "red");
%! xlim ([-2.0 2.0]);
%! ylim ([-2.0 2.0]);
%! colorbar ("SouthOutside");
%! title ("hold with line, surface, and patch objects");

## hold on test
%!test
%! hf = figure ("visible", "off");
%! unwind_protect
%!   p = plot ([0 1]);
%!   assert (! ishold);
%!   hold on;
%!   assert (ishold);
%!   p1 = fill ([0 1 1], [0 0 1], "black");
%!   p2 = fill ([0 1 0], [0 1 1], "red");
%!   assert (length (get (hf, "children")), 1);
%!   assert (length (get (gca, "children")), 3);
%! unwind_protect_cleanup
%!   close (hf);
%! end_unwind_protect

## hold off test
%!test
%! hf = figure ("visible", "off");
%! unwind_protect
%!   p = plot ([0 1]);
%!   assert (! ishold);
%!   hold on;
%!   assert (ishold);
%!   p1 = fill ([0 1 1], [0 0 1], "black");
%!   hold off;
%!   p2 = fill ([0 1 0], [0 1 1], "red");
%!   assert (length (get (hf, "children")), 1);
%!   assert (length (get (gca, "children")), 1);
%! unwind_protect_cleanup
%!   close (hf);
%! end_unwind_protect