annotate main/plot/legend.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 97f29109d9b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 ## Copyright (C) 2001 Laurent Mazet
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 ## This program is free software; it is distributed in the hope that it
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 ## will be useful, but WITHOUT ANY WARRANTY; without even the implied
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 ## warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 ## the GNU General Public License for more details.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 ## You should have received a copy of the GNU General Public License
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 ## along with this file; see the file COPYING. If not, write to the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 ## Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 ## 02111-1307, USA.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 ## usage: legend (string1, string2, string3, ..., [pos])
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 ## legend ([string1; string2; string3; ...], [pos])
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 ## legend ("off")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 ## Legend puts a legend on the current plot using the specified strings
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 ## as labels. Legend works on line graphs, bar graphs, etc...
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 ## pos: places the legend in the specified location:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 ## 0 = Don't move the legend box (default)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 ## 1 = Upper right-hand corner
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 ## 2 = Upper left-hand corner
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 ## 3 = Lower left-hand corner
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 ## 4 = Lower right-hand corner
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 ## -1 = To the right of the plot
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 ## off will switch off legends from the plot
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 ##
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 ## REQUIRES: unix piping functionality, grep, sed and awk
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 ## 2001-03-31 Paul Kienzle
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 ## * use tmpnam for temporary file name; unlink to remove
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 function legend (...)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 gset key;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 ## Data type
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 data_type = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 va_start();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 str = "";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 if (nargin > 0)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 str = va_arg();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 ## Test for off
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 if ((isstr(str)) && (strcmp(tolower(deblank(str)),"off")) && (nargin == 1))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 gset nokey;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 replot;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 return;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 ## Test for data type (0 -> list of string, 1 -> array of string)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 if (length(str) != 0) && (isstr(str(1,:))) && (rows(str) != 1)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 data_type = 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 va_start();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 data = va_arg();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 nb_data = rows(data);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 nargin--;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 pos_leg = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 ## Get the original plotting command
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 tmpfilename=tmpnam;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 command=["save \"",tmpfilename,"\"\n"];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 graw(command);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 awk_prog= \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 "BEGIN { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 dq = 0; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 format = \"%s\\n\"; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 } \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 NF != 0 { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 for (i=1;i<=NF;i++) { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 if ($(i) == \"\\\"\") { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 if (dp == 0) { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 dp = 1; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 if ($(i+1) != \"\\\"\") { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 i++; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 printf (\"%s\", $(i)); \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 } \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 format = \" %s\"; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 } else { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 dp = 0; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91 format = \"%s\\n\"; \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 printf (\"\\n\"); \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 } \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 } else { \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 printf (format, $(i)); \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 } \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 } \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 }";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 shell_cmd=["grep \"^pl \" " tmpfilename " | " \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 "sed -e 's/,/ , /g' -e 's/\"/ \" /g'" " | " \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 "awk '" awk_prog "'"];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 plot_cmd = split(system(shell_cmd),"\n");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 if (~length(deblank(plot_cmd(rows(plot_cmd), :))))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 plot_cmd = plot_cmd ([1:rows(plot_cmd)-1],:);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107 unlink(tmpfilename);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109 ## Look for the number of graph
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 nb_graph = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112 i = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113 while (i++ < rows(plot_cmd))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 line = deblank(plot_cmd(i,:));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 if ((strcmp(line, "pl")) || (strcmp(line, ",")))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116 nb_graph++;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118 endwhile;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 ## Change the legend of each graph
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 new_plot = [];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123 if (data_type == 0)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 va_start();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 fig = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127 i = 1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 while (fig < nb_graph)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130 ## Get the legend string
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132 if (((data_type == 0) && (nargin <= 0)) || \
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 ((data_type == 1) && (fig >= nb_data)))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 leg = "\"\"";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 if (data_type == 0)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 leg = va_arg () ;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138 nargin--;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140 leg = data(fig+1,:);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 if (!isstr(leg))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 pos_leg = leg;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144 leg = "\"\"";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145 elseif (length(deblank(leg)) == 0)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146 leg = "\"\"";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 leg=["\"" leg "\""];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152 ## look for the end of the graph command i.e. ","
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154 new_line = [deblank(plot_cmd(i++,:)) " \"" deblank(plot_cmd(i++,:)) "\""];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
155 while ((i <= rows(plot_cmd)) && (!strcmp(deblank(plot_cmd(i,:)), ",")))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
156 if (strcmp(deblank(plot_cmd(i,:)), "t"))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
157 new_line = [new_line " t " leg];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
158 i++;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
159 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
160 new_line = [new_line " " deblank(plot_cmd(i,:))];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
161 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
162 i++;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
163 endwhile;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
164
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
165 if (length(new_plot))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
166 new_plot = [ new_plot new_line];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
167 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
168 new_plot = new_line;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
169 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
170
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
171 fig++;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
172 endwhile;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
173
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
174 ## Create a new ploting command
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
175
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
176 new_plot = [new_plot "\n"];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
177 graw(new_plot);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
178
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
179 ## Check for the last argument if we don't already get it
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
180
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
181 while (nargin-- > 0)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
182 pos_leg = va_arg () ;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
183 if (isstr(pos_leg))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
184 pos_leg = 0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
185 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
186 endwhile;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
187
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
188 ## Change the legend position
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
189
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
190 if ((is_scalar (pos_leg)) && (isreal(pos_leg)))
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
191 switch (pos_leg)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
192 case 1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
193 gset key right top;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
194 case 2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
195 gset key left top;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
196 case 3
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
197 gset key left bottom;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
198 case 4
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
199 gset key right bottom;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
200 case -1
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
201 gset key right top outside;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
202 endswitch;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
203 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
204 warning ("pos must be a scalar");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
205 endif;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
206
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
207 ## Regenerate the plot
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
208
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
209 replot;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
210
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
211 endfunction;