source: trunk/python/plotter2.py @ 2877

Last change on this file since 2877 was 2861, checked in by WataruKawasaki, 11 years ago

New Development: No

JIRA Issue: No

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes: Yes

Module(s): sd

Description: (1) bugfix in setting masks

(2) finished implementation of get_vinfo()
(3) change get_*index() to class methods
(4) modify get_*index() to raise exception when invalid value given


File size: 26.3 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 to be displayed in the specified 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 to be displayed in the specified 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 to be displayed in the specified 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 displayed region of the specified viewport
140        as a list 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 displayed region in the specified viewport
152        as a list 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 the 2-Dimensional range of displayed area of the specified
164        viewport to automatically enclose the given data.
165        the x range will be from the minimum up to the maximum value
166        of the given x values, whereas y range has margins of 10% of
167        the y value range both at the top and the bottom sides.
168
169        Parameter:
170            vpid: viewport id. when unset, operation is applied to
171                  the viewport with the largest id.
172        """
173        if vpid is None: vpid = -1
174        self._plotter.set_autorange(vpid)
175
176    def set_xautorange(self, vpid=None):
177        """\
178        set x range of displayed area of the specified viewport to
179        automatically enclose the given data with no margins.
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 displayed area of the specified viewport to
191        automatically enclose the given data with margins of 10% of
192        the y value range both at the top and the bottom sides.
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 of operation.
350            dataid: dataset id. when not given, the last dataset for the
351                    specified viewport is the target.
352        """
353        if width  is None: width  = 1
354        if style  is None: style  = "solid"
355        if vpid   is None: vpid   = -1
356        if dataid is None: dataid = -1
357       
358        coloridx = self.get_colorindex(color)
359        styleidx = self.get_linestyleindex(style)
360        self._plotter.set_line(coloridx, width, styleidx, vpid, dataid)
361
362    def show_line(self, vpid=None, dataid=None):
363        """\
364        show line connecting the specified dataset.
365
366        Parameters:
367            vpid:   viewport id. when not given, the last viewport
368                    will be the target.
369            dataid: dataset id. when not given, the last dataset used.
370        """
371        if dataid is None:
372            if vpid is None: vpid = -1
373            dataid = -1
374
375        self._plotter.show_line(vpid, dataid)
376   
377    def hide_line(self, vpid=None, dataid=None):
378        """\
379        hide line connecting the specified dataset.
380
381        Parameters:
382            vpid:   viewport id. when not given, the last viewport
383                    will be the target.
384            dataid: dataset id. when not given, the last dataset used.
385        """
386        if dataid is None:
387            if vpid is None: vpid = -1
388            dataid = -1
389
390        self._plotter.hide_line(vpid, dataid)
391   
392    def set_point(self, type, size, color, vpid=None, dataid=None):
393        """\
394        change marker attributes for the specified dataset.
395
396        Parameters:
397            type:   type of marker symbol. see PGPLOT manual for detail.
398            size:   marker size.
399            color:  color of marker. see output of list_colornames().
400            vpid:   viewport id. when not given, the last viewport
401                    will be the target.
402            dataid: dataset id. when not given, the last dataset used.
403        """
404        if dataid is None:
405            if vpid is None: vpid = -1
406            dataid = -1
407        coloridx = self.get_colorindex(color)
408        self._plotter.set_point(type, size, coloridx, vpid, dataid)
409
410    def show_point(self, vpid=None, dataid=None):
411        """\
412        show markers for the specified dataset.
413
414        Parameters:
415            vpid:   viewport id. when not given, the last viewport
416                    will be the target.
417            dataid: dataset id. when not given, the last dataset used.
418        """
419        if dataid is None:
420            if vpid is None: vpid = -1
421            dataid = -1
422       
423        self._plotter.show_point(vpid, dataid)
424
425    def hide_point(self, vpid=None, dataid=None):
426        """\
427        hide markers for the specified dataset.
428
429        Parameters:
430            vpid:   viewport id. when not given, the last viewport
431                    will be the target.
432            dataid: dataset id. when not given, the last dataset used.
433        """
434        if dataid is None:
435            if vpid is None: vpid = -1
436            dataid = -1
437       
438        self._plotter.hide_point(vpid, dataid)
439
440    def set_xmask(self, xmin, xmax, color=None, fstyle=None, width=None, hsep=None, vpid=None):
441        """\
442        add a rectangle which spans full y range.
443
444        Parameters:
445            xmin:   the smaller end of mask region
446            xmax:   the larger end of mask region
447            color:  color of mask region. see output of list_colornames().
448                    default is "lightgray".
449            fstyle: fill style. see output of list_fillstyles().
450                    default is "solid".
451            width:  width of outline of mask region. default is 1.
452            hsep:   spacing of hatched lines. default is 1.0
453            vpid:   viewport id. when not given, the last viewport
454                    will be the target.
455        """
456        if color  is None: color  = "lightgray"
457        if fstyle is None: fstyle = "solid"
458        if width  is None: width  = 1
459        if hsep   is None: hsep   = 1.0
460        if vpid   is None: vpid   = -1
461        coloridx = self.get_colorindex(color)
462        fstyleidx = self.get_fillstyleindex(fstyle)
463        self._plotter.set_mask_x(xmin, xmax, coloridx, fstyleidx, width, hsep, vpid)
464
465    def set_xlabel(self, label, style=None, size=None, posx=None, posy=None, vpid=None):
466        """\
467        set label string along x axis. when the position of label is
468        specified explicitly by posx and posy, the label appears so
469        that its center placed on the specified position.
470
471        Parameters:
472            label: label string.
473            style: font style. "normal", "roman", "italic" and "script"
474                   are available. default is "normal".
475            size:  font size. default is 1.1 (10% larger than that
476                   of number labels)
477            posx:  x position of label string in window coordinate.
478                   default is the center of x axis.
479            posy:  y position of label string.
480            vpid:  viewport id. when not given, the last viewport
481                   will be the target.
482        """
483        if style is None: style = ""
484        if size  is None: size  = 1.1
485        if posx  is None: posx  = -1.0
486        if posy  is None: posy  = -1.0
487        if vpid  is None: vpid  = -1
488       
489        self._plotter.set_label_x(label, posx, posy, size, style, 1, 0, vpid)
490   
491    def set_ylabel(self, label, style=None, size=None, posx=None, posy=None, vpid=None):
492        """\
493        set label string along y axis. when the position of label is
494        specified explicitly by posx and posy, the label appears so
495        that its center placed on the specified position.
496
497        Parameters:
498            label: label string.
499            style: font style. "normal", "roman", "italic" and "script"
500                   are available. default is "normal".
501            size:  font size. default is 1.1 (10% larger than that
502                   of number labels)
503            posx:  x position of label string in window coordinate.
504            posy:  y position of label string.
505                   default is the center of y axis.
506            vpid:   viewport id. when not given, the last viewport
507                    will be the target.
508        """
509        if style is None: style = ""
510        if size  is None: size  = 1.1
511        if posx  is None: posx  = -1.0
512        if posy  is None: posy  = -1.0
513        if vpid  is None: vpid  = -1
514       
515        self._plotter.set_label_y(label, posx, posy, size, style, 1, 0, vpid)
516   
517    def set_title(self, title, style=None, size=None, posx=None, posy=None, vpid=None):
518        """\
519        set title string over the top of the specified viewport.
520        when the position of title is specified explicitly by posx
521        and posy, the title appears so that its center placed on
522        the specified position.
523
524        Parameters:
525            title: title string.
526            style: font style. "normal", "roman", "italic" and "script"
527                   are available. default is "normal".
528            size:  font size. default is 1.5 (50% larger than that
529                   of number titles)
530            posx:  x position of title string in window coordinate.
531            posy:  y position of title string.
532                   default is the center of y axis.
533            vpid:   viewport id. when not given, the last viewport
534                    will be the target.
535        """
536        if style is None: style = ""
537        if size  is None: size  = 1.5
538        if posx  is None: posx  = -1.0
539        if posy  is None: posy  = -1.0
540        if vpid  is None: vpid  = -1
541       
542        self._plotter.set_title(title, posx, posy, size, style, 1, 0, vpid)
543
544    def set_vpbgcolor(self, bgcolor, vpid=None):
545        """\
546        change the background color of the specified viewport.
547        default is transparent.
548
549        Parameters:
550            bgcolor: background color. see output of list_colornames().
551                     default is "" (transparent).
552            vpid:    viewport id. when not given, the last viewport
553                     will be the target.
554        """
555        if vpid  is None: vpid  = -1
556
557        if bgcolor.strip() == "":
558            coloridx = -1
559        else:
560            coloridx = self.get_colorindex(bgcolor)
561       
562        self._plotter.set_vpbgcolor(coloridx, vpid)
563   
564    def plot(self):
565        """\
566        execute actual plotting.
567        """
568        self._plotter.plot()
569
570    def save(self, filename):
571        """\
572        save the figure in a file with specified name.
573        the filename and device previously set by set_output() is
574        not affected by this command.
575
576        Parameters:
577            filename: output file name.
578        """
579        prev_filename = self._plotter.get_filename()
580        prev_dev      = self._plotter.get_device()
581
582        self.set_output(filename)
583        self.plot()
584       
585        self.set_output(prev_filename, prev_dev)
586   
587    def get_vinfo(self):
588        self._plotter.get_vinfo()
589
590    @classmethod
591    def get_colorindex(cls, colorname):
592        """\
593        convert the given color name into color index used in PGPLOT.
594        """
595        name = colorname.strip().lower()
596        available_color = True
597
598        if   name == "white":       idx =  0  # our definition of bgcolor
599        elif name == "black":       idx =  1  # our definition of fgcolor
600        elif name == "red":         idx =  2
601        elif name == "green":       idx =  3
602        elif name == "blue":        idx =  4
603        elif name == "cyan":        idx =  5
604        elif name == "magenta":     idx =  6
605        elif name == "yellow":      idx =  7
606        elif name == "orange":      idx =  8
607        elif name == "yellowgreen": idx =  9
608        elif name == "emerald":     idx = 10
609        elif name == "skyblue":     idx = 11
610        elif name == "purple":      idx = 12
611        elif name == "pink":        idx = 13
612        elif name == "gray":        idx = 14
613        elif name == "lightgray":   idx = 15
614        else: available_color = False
615
616        if (available_color):
617            return idx
618        else:
619            raise ValueError("Unavailable colour name.")
620
621    @classmethod
622    def list_colornames(cls):
623        """\
624        list the available color names.
625        """
626        print "plotter2: default color list ----"
627        print "  (0) white (background)"
628        print "  (1) black (foreground)"
629        print "  (2) red"
630        print "  (3) green"
631        print "  (4) blue"
632        print "  (5) cyan"
633        print "  (6) magenta"
634        print "  (7) yellow"
635        print "  (8) orange"
636        print "  (9) yellowgreen"
637        print " (10) emerald"
638        print " (11) skyblue"
639        print " (12) purple"
640        print " (13) pink"
641        print " (14) gray"
642        print " (15) lightgray"
643        print "---------------------------------"
644
645    @classmethod
646    def get_linestyleindex(cls, fstyle):
647        """\
648        convert the given line style into style index used in PGPLOT.
649        """
650        style = fstyle.strip().lower()
651        available_style = True
652       
653        if   style == "solid":               idx = 1
654        elif style == "dashed":              idx = 2
655        elif style == "dash-dotted":         idx = 3
656        elif style == "dotted":              idx = 4
657        elif style == "dash-dot-dot-dotted": idx = 5
658        else: available_style = False
659
660        if (available_style):
661            return idx
662        else:
663            raise ValueError("Unavailable line style.")
664   
665    @classmethod
666    def list_linestyles(cls):
667        """\
668        list the available line styles.
669        """
670        print "plotter2: fill style list ----"
671        print "  (1) solid"
672        print "  (2) dashed"
673        print "  (3) dash-dotted"
674        print "  (4) dotted"
675        print "  (5) dash-dot-dot-dotted"
676        print "------------------------------"
677
678    @classmethod
679    def get_fillstyleindex(cls, fstyle):
680        """\
681        convert the given fill style into style index used in PGPLOT.
682        """
683        style = fstyle.strip().lower()
684        available_style = True
685       
686        if   style == "solid":        idx = 1
687        elif style == "outline":      idx = 2
688        elif style == "hatched":      idx = 3
689        elif style == "crosshatched": idx = 4
690        else: available_style = False
691
692        if (available_style):
693            return idx
694        else:
695            raise ValueError("Unavailable fill style.")
696   
697    @classmethod
698    def list_fillstyles(cls):
699        """\
700        list the available fill styles.
701        """
702        print "plotter2: fill style list ----"
703        print "  (1) solid"
704        print "  (2) outline"
705        print "  (3) hatched"
706        print "  (4) crosshatched"
707        print "------------------------------"
708
709"""
710    def set_annotation(self, label, posx=None, posy=None, angle=None, fjust=None, size=None, style=None, color=None, bgcolor=None, vpid=None):
711        if posx    is None: posx    = -1.0
712        if posy    is None: posy    = -1.0
713        if angle   is None: angle   = 0.0
714        if fjust   is None: fjust   = 0.5
715        if size    is None: size    = 2.0
716        if style   is None: style   = ""
717        if color   is None: color   = 1 #default foreground colour (b)
718        if bgcolor is None: bgcolor = 0 #default backgound colour (w)
719        if vpid    is None: vpid    = -1
720       
721        coloridx = self.get_colorindex(color)
722        bgcoloridx = self.get_colorindex(bgcolor)
723        self._plotter.set_annotation(label, posx, posy, angle, fjust, size, style, coloridx, bgcoloridx, vpid)
724"""
Note: See TracBrowser for help on using the repository browser.