source: trunk/python/plotter2.py@ 2837

Last change on this file since 2837 was 2830, checked in by WataruKawasaki, 11 years ago

New Development: Yes

JIRA Issue: Yes (CAS-3620)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes: Yes

Module(s): sd

Description: a new simple plotter based on PGPLOT. the module name is sd.plotter2. only available on casapy (unavailable in the standalone ASAP)


File size: 25.6 KB
Line 
1from os.path import expanduser, expandvars
2from asap._asap import Plotter2
3
4class plotter2:
5 def __init__(self):
6 self._plotter = Plotter2()
7
8 def set_output(self, filename=None, dev=None):
9 """\
10 set output filename and/or output device.
11 when only filename given, filename is splitted with '.' then
12 the last part (filename extension) will be used as output device.
13 Parameters:
14 filename: output file name (default is '')
15 device: output device. default is 'xwindow'. 'png', 'ps'
16 and 'vps'(PostScript in portrait shape) are
17 available also.
18
19 Example:
20 set_output() -- display in X Window (default)
21 set_output('foo.png') -- generate foo.png in PNG format.
22 set_output('bar.ps', 'vps') -- generate bar.ps in portrait shape.
23 """
24 if filename is None:
25 filename = ''
26 dev = 'xwindow'
27 else:
28 filename = filename.strip()
29 if filename == '':
30 dev = 'xwindow'
31 else:
32 if (dev is None) or (dev.strip() == ''):
33 fnamelem = filename.lower().split('.')
34 dev = fnamelem[len(fnamelem)-1].strip()
35 if dev == 'ps': dev = 'cps'
36
37 self._plotter.set_filename(expanduser(expandvars(filename)))
38 self._plotter.set_device(dev.strip())
39
40 def set_vp(self, xmin, xmax, ymin, ymax, id=None):
41 """\
42 change the position/shape of viewport in which data are to be plotted.
43 positions should be given in window coordinate (0<={x,y}<=1), but,
44 unlike the usual definition of window coordinates, with the origin at
45 the bottom left corner.
46 when you create plotter2 instance, it already has a single viewport
47 with xmin=ymin=0.1 and xmax=ymax=0.9 (id=0). in case you don't want to
48 change the size/position of the viewport, you never need to run this
49 function.
50 if you want to have two or more viewports, run set_vp() first to
51 move/resize the first viewport, then you will be able to add a new
52 viewport by executing set_vp without id (the id of the new viewport
53 is returned in this case). the location and shape of any viewport
54 can be modified later by specifying its viewport id.
55
56 Parameters:
57 xmin: the x position of the left side.
58 xmax: the x position of the rightt side.
59 ymin: the y position of the top of viewport.
60 ymax: the y position of the bottom of viewport.
61 id: viewport id
62 """
63 if id is None:
64 if self._plotter.get_hasdefaultvp():
65 self._plotter.set_viewport(xmin, xmax, ymin, ymax, 0)
66 else:
67 return self._plotter.add_viewport(xmin, xmax, ymin, ymax)
68 else:
69 self._plotter.set_viewport(xmin, xmax, ymin, ymax, id)
70
71 def show_vp(self, vpid=None):
72 """\
73 show viewport specified with its id.
74
75 Parameter:
76 vpid: viewport id. when unset, operation is applied to
77 the viewport with the largest id.
78 """
79 if vpid is None: vpid = -1
80 self._plotter.show_viewport(vpid)
81
82 def hide_vp(self, vpid=None):
83 """\
84 hide viewport specified with its id.
85
86 Parameter:
87 vpid: viewport id. when unset, operation is applied to
88 the viewport with the largest id.
89 """
90 if vpid is None: vpid = -1
91 self._plotter.hide_viewport(vpid)
92
93 def set_range(self, xmin, xmax, ymin, ymax, vpid=None):
94 """\
95 set 2D range of area to be displayed in a viewport.
96 by default, the display range is set automatically.
97
98 Parameter:
99 xmin: the minimum of x range.
100 xmax: the maximum of x range.
101 ymin: the minimum of y range.
102 ymax: the maximum of y range.
103 vpid: viewport id. when unset, operation is applied to
104 the viewport with the largest id.
105 """
106 if vpid is None: vpid = -1
107 self._plotter.set_range(xmin, xmax, ymin, ymax, vpid)
108
109 def set_xrange(self, xmin, xmax, vpid=None):
110 """\
111 set x range of area to be displayed in a viewport.
112 by default, the display range is set automatically.
113
114 Parameter:
115 xmin: the minimum of x range.
116 xmax: the maximum of x range.
117 vpid: viewport id. when unset, operation is applied to
118 the viewport with the largest id.
119 """
120 if vpid is None: vpid = -1
121 self._plotter.set_range_x(xmin, xmax, vpid)
122
123 def set_yrange(self, ymin, ymax, vpid=None):
124 """\
125 set y range of area to be displayed in a viewport.
126 by default, the display range is set automatically.
127
128 Parameter:
129 ymin: the minimum of y range.
130 ymax: the maximum of y range.
131 vpid: viewport id. when unset, operation is applied to
132 the viewport with the largest id.
133 """
134 if vpid is None: vpid = -1
135 self._plotter.set_range_y(ymin, ymax, vpid)
136
137 def get_xrange(self, vpid=None):
138 """\
139 returns x range of display area of the specified viewport in
140 a shape of (xmin, xmax).
141
142 Parameter:
143 vpid: viewport id. when unset, operation is applied to
144 the viewport with the largest id.
145 """
146 if vpid is None: vpid = -1
147 return self._plotter.get_range_x(vpid)
148
149 def get_yrange(self, vpid=None):
150 """\
151 returns y range of display area of the specified viewport in
152 a shape of (ymin, ymax).
153
154 Parameter:
155 vpid: viewport id. when unset, operation is applied to
156 the viewport with the largest id.
157 """
158 if vpid is None: vpid = -1
159 return self._plotter.get_range_y(vpid)
160
161 def set_autorange(self, vpid=None):
162 """\
163 set 2D range of display area of the specified viewport to be
164 automatic depending on the given data.
165 the x range will be the exact range of the x values of data,
166 whereas y range has a margin of 10% of the range of y values of data.
167
168 Parameter:
169 vpid: viewport id. when unset, operation is applied to
170 the viewport with the largest id.
171 """
172 if vpid is None: vpid = -1
173 self._plotter.set_autorange(vpid)
174
175 def set_xautorange(self, vpid=None):
176 """\
177 set x range of display area of the specified viewport to be
178 automatic depending on the given data.
179 the x range will be the exact range of the x values of data,
180
181 Parameter:
182 vpid: viewport id. when unset, operation is applied to
183 the viewport with the largest id.
184 """
185 if vpid is None: vpid = -1
186 self._plotter.set_autorange_x(vpid)
187
188 def set_yautorange(self, vpid=None):
189 """\
190 set y range of display area of the specified viewport to be
191 automatic depending on the given data.
192 the y range has a margin of 10% of the range of y values of data.
193
194 Parameter:
195 vpid: viewport id. when unset, operation is applied to
196 the viewport with the largest id.
197 """
198 if vpid is None: vpid = -1
199 self._plotter.set_autorange_y(vpid)
200
201 def set_fontsize(self, size, vpid=None):
202 """\
203 set the font size that is used for number labels etc.
204
205 Parameter:
206 size: font size (default is 1)
207 vpid: viewport id. when unset, operation is applied to
208 the viewport with the largest id.
209 """
210 if vpid is None: vpid = -1
211 self._plotter.set_fontsize(size, vpid)
212
213 def set_xtics(self, interval_major, num_minor=None, vpid=None):
214 """\
215 set the interval of ticks along x axis.
216
217 Parameter:
218 interval_major: interval of major ticks
219 num_minor: major tick interval / minor tick interval.
220 default is 5.
221 vpid: viewport id. when unset, operation is
222 applied to the viewport with the largest id.
223 """
224 if vpid is None: vpid = -1
225 if num_minor is None: num_minor = 5
226 self._plotter.set_tics_x(interval_major, num_minor, vpid)
227
228 def set_ytics(self, interval_major, num_minor=None, vpid=None):
229 """\
230 set the interval of ticks along y axis.
231
232 Parameter:
233 interval_major: interval of major ticks
234 num_minor: major tick interval / minor tick interval.
235 default is 5.
236 vpid: viewport id. when unset, operation is
237 applied to the viewport with the largest id.
238 """
239 if vpid is None: vpid = -1
240 if num_minor is None: num_minor = 5
241 self._plotter.set_tics_y(interval_major, num_minor, vpid)
242
243 def set_xautotics(self, vpid=None):
244 """\
245 set the interval of ticks and number labels along x axis
246 given automatically.
247
248 Parameter:
249 vpid: viewport id. when unset, operation is applied to
250 the viewport with the largest id.
251 """
252 if vpid is None: vpid = -1
253 self._plotter.set_autotics_x(vpid)
254
255 def set_yautotics(self, vpid=None):
256 """\
257 set the interval of ticks and number labels along y axis
258 given automatically.
259
260 Parameter:
261 vpid: viewport id. when unset, operation is applied to
262 the viewport with the largest id.
263 """
264 if vpid is None: vpid = -1
265 self._plotter.set_autotics_y(vpid)
266
267 def set_xnuminterval(self, interval, vpid=None):
268 """\
269 set the interval of number labels along x axis.
270
271 Parameter:
272 interval: interval of number labels
273 vpid: viewport id. when unset, operation is
274 applied to the viewport with the largest id.
275 """
276 if vpid is None: vpid = -1
277 self._plotter.set_ninterval_x(interval, vpid)
278
279 def set_ynuminterval(self, interval, vpid=None):
280 """\
281 set the interval of number labels along y axis.
282
283 Parameter:
284 interval: interval of number labels
285 vpid: viewport id. when unset, operation is
286 applied to the viewport with the largest id.
287 """
288 if vpid is None: vpid = -1
289 self._plotter.set_ninterval_y(interval, vpid)
290
291 def set_xnumlocation(self, location=None, vpid=None):
292 """\
293 set the location of number labels along x axis.
294
295 Parameters:
296 location: 'l' (left side) or 'r' (right side). default is 'l'.
297 vpid: viewport id. when unset, operation is
298 applied to the viewport with the largest id.
299 """
300 if vpid is None: vpid = -1
301 if location is None: location = "l"
302 self._plotter.set_nlocation_x(location.lower(), vpid)
303
304 def set_ynumlocation(self, location=None, vpid=None):
305 """\
306 set the location of number labels along y axis.
307
308 Parameters:
309 location: 'b' (bottom) or 't' (top). default is 'b'.
310 vpid: viewport id. when unset, operation is
311 applied to the viewport with the largest id.
312 """
313 if vpid is None: vpid = -1
314 if location is None: location = "b"
315 self._plotter.set_nlocation_y(location.lower(), vpid)
316
317 def set_data(self, xdata, ydata, vpid=None, dataid=None):
318 """\
319 append or change dataset to be plotted.
320
321 Parameters:
322 xdata: a list of x positions of the input data.
323 ydata: a list of y positions of the input data.
324 vpid: viewport id. when not given, the last viewport
325 will be the target.
326 dataid: dataset id. a integer starting from 0. when dataid
327 is given, the corresponding dataset of the specified
328 viewport is replaced by the given xdata and ydata.
329 when not given, a new dataset of xdata and ydata is
330 appended.
331 """
332 if dataid is None:
333 if vpid is None: vpid = -1
334 dataid = -1
335
336 self._plotter.set_data(xdata, ydata, vpid, dataid)
337
338 def set_line(self, color, width=None, style=None, vpid=None, dataid=None):
339 """\
340 change line attributes.
341
342 Parameters:
343 color: line color specified by color name. available colors
344 can be listed via list_colornames().
345 width: line width. default is 1.
346 style: line style. available styles can be listed via
347 list_linestyles().
348 vpid: viewport id. when not given, the last viewport
349 will be the target.
350 dataid: dataset id. when not given, the last dataset used.
351 """
352 if width is None: width = 1
353 if style is None: style = "solid"
354 if vpid is None: vpid = -1
355 if dataid is None: dataid = -1
356
357 coloridx = self.get_colorindex(color)
358 styleidx = self.get_linestyleindex(style)
359 self._plotter.set_line(coloridx, width, styleidx, vpid, dataid)
360
361 def show_line(self, vpid=None, dataid=None):
362 """\
363 show line connecting the specified dataset.
364
365 Parameters:
366 vpid: viewport id. when not given, the last viewport
367 will be the target.
368 dataid: dataset id. when not given, the last dataset used.
369 """
370 if dataid is None:
371 if vpid is None: vpid = -1
372 dataid = -1
373
374 self._plotter.show_line(vpid, dataid)
375
376 def hide_line(self, vpid=None, dataid=None):
377 """\
378 hide line connecting the specified dataset.
379
380 Parameters:
381 vpid: viewport id. when not given, the last viewport
382 will be the target.
383 dataid: dataset id. when not given, the last dataset used.
384 """
385 if dataid is None:
386 if vpid is None: vpid = -1
387 dataid = -1
388
389 self._plotter.hide_line(vpid, dataid)
390
391 def set_point(self, type, size, color, vpid=None, dataid=None):
392 """\
393 change marker attributes for the specified dataset.
394
395 Parameters:
396 type: type of marker symbol. see PGPLOT manual for detail.
397 size: marker size.
398 color: color of marker. see output of list_colornames().
399 vpid: viewport id. when not given, the last viewport
400 will be the target.
401 dataid: dataset id. when not given, the last dataset used.
402 """
403 if dataid is None:
404 if vpid is None: vpid = -1
405 dataid = -1
406 coloridx = self.get_colorindex(color)
407 self._plotter.set_point(type, size, coloridx, vpid, dataid)
408
409 def show_point(self, vpid=None, dataid=None):
410 """\
411 show markers for the specified dataset.
412
413 Parameters:
414 vpid: viewport id. when not given, the last viewport
415 will be the target.
416 dataid: dataset id. when not given, the last dataset used.
417 """
418 if dataid is None:
419 if vpid is None: vpid = -1
420 dataid = -1
421
422 self._plotter.show_point(vpid, dataid)
423
424 def hide_point(self, vpid=None, dataid=None):
425 """\
426 hide markers for the specified dataset.
427
428 Parameters:
429 vpid: viewport id. when not given, the last viewport
430 will be the target.
431 dataid: dataset id. when not given, the last dataset used.
432 """
433 if dataid is None:
434 if vpid is None: vpid = -1
435 dataid = -1
436
437 self._plotter.hide_point(vpid, dataid)
438
439 def set_xmask(self, xmin, xmax, color=None, fstyle=None, width=None, hsep=None, vpid=None):
440 """\
441 add a rectangle which spans full y range.
442
443 Parameters:
444 xmin: the smaller end of mask region
445 xmax: the larger end of mask region
446 color: color of mask region. see output of list_colornames().
447 default is "lightgray".
448 fstyle: fill style. see output of list_fillstyles().
449 default is "solid".
450 width: width of outline of mask region. default is 1.
451 hsep: spacing of hatched lines. default is 1.0
452 vpid: viewport id. when not given, the last viewport
453 will be the target.
454 """
455 if color is None: color = "lightgray"
456 if fstyle is None: fstyle = "solid"
457 if width is None: width = 1
458 if hsep is None: hsep = 1.0
459 if vpid is None: vpid = -1
460 coloridx = self.get_colorindex(color)
461 fstyleidx = self.get_fillstyleindex(fstyle)
462 self._plotter.set_mask_x(xmin, xmax, coloridx, fstyleidx, width, hsep, vpid)
463
464 def set_xlabel(self, label, style=None, size=None, posx=None, posy=None, vpid=None):
465 """\
466 set label string along x axis. when the position of label is
467 specified explicitly by posx and posy, the label appears so
468 that its center placed on the specified position.
469
470 Parameters:
471 label: label string.
472 style: font style. "normal", "roman", "italic" and "script"
473 are available. default is "normal".
474 size: font size. default is 1.1 (10% larger than that
475 of number labels)
476 posx: x position of label string in window coordinate.
477 default is the center of x axis.
478 posy: y position of label string.
479 vpid: viewport id. when not given, the last viewport
480 will be the target.
481 """
482 if style is None: style = ""
483 if size is None: size = 1.1
484 if posx is None: posx = -1.0
485 if posy is None: posy = -1.0
486 if vpid is None: vpid = -1
487
488 self._plotter.set_label_x(label, posx, posy, size, style, 1, 0, vpid)
489
490 def set_ylabel(self, label, style=None, size=None, posx=None, posy=None, vpid=None):
491 """\
492 set label string along y axis. when the position of label is
493 specified explicitly by posx and posy, the label appears so
494 that its center placed on the specified position.
495
496 Parameters:
497 label: label string.
498 style: font style. "normal", "roman", "italic" and "script"
499 are available. default is "normal".
500 size: font size. default is 1.1 (10% larger than that
501 of number labels)
502 posx: x position of label string in window coordinate.
503 posy: y position of label string.
504 default is the center of y axis.
505 vpid: viewport id. when not given, the last viewport
506 will be the target.
507 """
508 if style is None: style = ""
509 if size is None: size = 1.1
510 if posx is None: posx = -1.0
511 if posy is None: posy = -1.0
512 if vpid is None: vpid = -1
513
514 self._plotter.set_label_y(label, posx, posy, size, style, 1, 0, vpid)
515
516 def set_title(self, title, style=None, size=None, posx=None, posy=None, vpid=None):
517 """\
518 set title string over the top of the specified viewport.
519 when the position of title is specified explicitly by posx
520 and posy, the title appears so that its center placed on
521 the specified position.
522
523 Parameters:
524 title: title string.
525 style: font style. "normal", "roman", "italic" and "script"
526 are available. default is "normal".
527 size: font size. default is 1.5 (50% larger than that
528 of number titles)
529 posx: x position of title string in window coordinate.
530 posy: y position of title string.
531 default is the center of y axis.
532 vpid: viewport id. when not given, the last viewport
533 will be the target.
534 """
535 if style is None: style = ""
536 if size is None: size = 1.5
537 if posx is None: posx = -1.0
538 if posy is None: posy = -1.0
539 if vpid is None: vpid = -1
540
541 self._plotter.set_title(title, posx, posy, size, style, 1, 0, vpid)
542
543 def set_vpbgcolor(self, bgcolor, vpid=None):
544 """\
545 change the background color of the specified viewport.
546 default is transparent.
547
548 Parameters:
549 bgcolor: background color. see output of list_colornames().
550 default is "" (transparent).
551 vpid: viewport id. when not given, the last viewport
552 will be the target.
553 """
554 if vpid is None: vpid = -1
555
556 if bgcolor.strip() == "":
557 coloridx = -1
558 else:
559 coloridx = self.get_colorindex(bgcolor)
560
561 self._plotter.set_vpbgcolor(coloridx, vpid)
562
563 def plot(self):
564 """\
565 execute actual plotting.
566 """
567 self._plotter.plot()
568
569 def save(self, filename):
570 """\
571 save the figure in a file with specified name.
572 the filename and device previously set by set_output() is
573 not affected by this command.
574
575 Parameters:
576 filename: output file name.
577 """
578 prev_filename = self._plotter.get_filename()
579 prev_dev = self._plotter.get_device()
580
581 self.set_output(filename)
582 self.plot()
583
584 self.set_output(prev_filename, prev_dev)
585
586 def get_vinfo(self):
587 self._plotter.get_vinfo()
588
589 def get_colorindex(self, colorname):
590 """\
591 (for internal use)
592 convert the given color name into color index used in PGPLOT.
593 """
594 name = colorname.strip().lower()
595
596 if name == "white": idx = 0 # our definition of bgcolor
597 if name == "black": idx = 1 # our definition of fgcolor
598 if name == "red": idx = 2
599 if name == "green": idx = 3
600 if name == "blue": idx = 4
601 if name == "cyan": idx = 5
602 if name == "magenta": idx = 6
603 if name == "yellow": idx = 7
604 if name == "orange": idx = 8
605 if name == "yellowgreen": idx = 9
606 if name == "emerald": idx = 10
607 if name == "skyblue": idx = 11
608 if name == "purple": idx = 12
609 if name == "pink": idx = 13
610 if name == "gray": idx = 14
611 if name == "lightgray": idx = 15
612
613 return idx
614
615 def list_colornames(self):
616 """\
617 list the available color names.
618 """
619 print "plotter2: default color list ----"
620 print " (0) white (background)"
621 print " (1) black (foreground)"
622 print " (2) red"
623 print " (3) green"
624 print " (4) blue"
625 print " (5) cyan"
626 print " (6) magenta"
627 print " (7) yellow"
628 print " (8) orange"
629 print " (9) yellowgreen"
630 print " (10) emerald"
631 print " (11) skyblue"
632 print " (12) purple"
633 print " (13) pink"
634 print " (14) gray"
635 print " (15) lightgray"
636 print "---------------------------------"
637
638 def get_linestyleindex(self, fstyle):
639 """\
640 (for internal use)
641 convert the given line style into style index used in PGPLOT.
642 """
643 style = fstyle.strip().lower()
644 if style == "solid": idx = 1
645 if style == "outline": idx = 2
646 if style == "hatched": idx = 3
647 if style == "crosshatched": idx = 4
648
649 return idx
650
651 def list_linestyles(self):
652 """\
653 list the available line styles.
654 """
655 print "plotter2: fill style list ----"
656 print " (1) solid"
657 print " (2) dashed"
658 print " (3) dash-dotted"
659 print " (4) dotted"
660 print " (5) dash-dot-dot-dotted"
661 print "------------------------------"
662
663 def get_fillstyleindex(self, fstyle):
664 """\
665 (for internal use)
666 convert the given fill style into style index used in PGPLOT.
667 """
668 style = fstyle.strip().lower()
669 if style == "solid": idx = 1
670 if style == "outline": idx = 2
671 if style == "hatched": idx = 3
672 if style == "crosshatched": idx = 4
673
674 return idx
675
676 def list_fillstyles(self):
677 """\
678 list the available fill styles.
679 """
680 print "plotter2: fill style list ----"
681 print " (1) solid"
682 print " (2) outline"
683 print " (3) hatched"
684 print " (4) crosshatched"
685 print "------------------------------"
686
687"""
688 def set_annotation(self, label, posx=None, posy=None, angle=None, fjust=None, size=None, style=None, color=None, bgcolor=None, vpid=None):
689 if posx is None: posx = -1.0
690 if posy is None: posy = -1.0
691 if angle is None: angle = 0.0
692 if fjust is None: fjust = 0.5
693 if size is None: size = 2.0
694 if style is None: style = ""
695 if color is None: color = 1 #default foreground colour (b)
696 if bgcolor is None: bgcolor = 0 #default backgound colour (w)
697 if vpid is None: vpid = -1
698
699 coloridx = self.get_colorindex(color)
700 bgcoloridx = self.get_colorindex(bgcolor)
701 self._plotter.set_annotation(label, posx, posy, angle, fjust, size, style, coloridx, bgcoloridx, vpid)
702"""
Note: See TracBrowser for help on using the repository browser.