source: trunk/python/plotter2.py @ 2860

Last change on this file since 2860 was 2860, 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: No

Module(s): sd

Description: bugfix in sd.plotter2.get_linestyleindex() and minor clean-up


File size: 25.8 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    def get_colorindex(self, colorname):
591        """\
592        (for internal use)
593        convert the given color name into color index used in PGPLOT.
594        """
595        name = colorname.strip().lower()
596
597        if name == "white":       idx = 0  # our definition of bgcolor
598        if name == "black":       idx = 1  # our definition of fgcolor
599        if name == "red":         idx = 2
600        if name == "green":       idx = 3
601        if name == "blue":        idx = 4
602        if name == "cyan":        idx = 5
603        if name == "magenta":     idx = 6
604        if name == "yellow":      idx = 7
605        if name == "orange":      idx = 8
606        if name == "yellowgreen": idx = 9
607        if name == "emerald":     idx = 10
608        if name == "skyblue":     idx = 11
609        if name == "purple":      idx = 12
610        if name == "pink":        idx = 13
611        if name == "gray":        idx = 14
612        if name == "lightgray":   idx = 15
613
614        return idx
615
616    def list_colornames(self):
617        """\
618        list the available color names.
619        """
620        print "plotter2: default color list ----"
621        print "  (0) white (background)"
622        print "  (1) black (foreground)"
623        print "  (2) red"
624        print "  (3) green"
625        print "  (4) blue"
626        print "  (5) cyan"
627        print "  (6) magenta"
628        print "  (7) yellow"
629        print "  (8) orange"
630        print "  (9) yellowgreen"
631        print " (10) emerald"
632        print " (11) skyblue"
633        print " (12) purple"
634        print " (13) pink"
635        print " (14) gray"
636        print " (15) lightgray"
637        print "---------------------------------"
638
639    def get_linestyleindex(self, fstyle):
640        """\
641        (for internal use)
642        convert the given line style into style index used in PGPLOT.
643        """
644        style = fstyle.strip().lower()
645        if style == "solid":               idx = 1
646        if style == "dashed":              idx = 2
647        if style == "dash-dotted":         idx = 3
648        if style == "dotted":              idx = 4
649        if style == "dash-dot-dot-dotted": idx = 5
650       
651        return idx
652   
653    def list_linestyles(self):
654        """\
655        list the available line styles.
656        """
657        print "plotter2: fill style list ----"
658        print "  (1) solid"
659        print "  (2) dashed"
660        print "  (3) dash-dotted"
661        print "  (4) dotted"
662        print "  (5) dash-dot-dot-dotted"
663        print "------------------------------"
664
665    def get_fillstyleindex(self, fstyle):
666        """\
667        (for internal use)
668        convert the given fill style into style index used in PGPLOT.
669        """
670        style = fstyle.strip().lower()
671        if style == "solid":        idx = 1
672        if style == "outline":      idx = 2
673        if style == "hatched":      idx = 3
674        if style == "crosshatched": idx = 4
675       
676        return idx
677   
678    def list_fillstyles(self):
679        """\
680        list the available fill styles.
681        """
682        print "plotter2: fill style list ----"
683        print "  (1) solid"
684        print "  (2) outline"
685        print "  (3) hatched"
686        print "  (4) crosshatched"
687        print "------------------------------"
688
689"""
690    def set_annotation(self, label, posx=None, posy=None, angle=None, fjust=None, size=None, style=None, color=None, bgcolor=None, vpid=None):
691        if posx    is None: posx    = -1.0
692        if posy    is None: posy    = -1.0
693        if angle   is None: angle   = 0.0
694        if fjust   is None: fjust   = 0.5
695        if size    is None: size    = 2.0
696        if style   is None: style   = ""
697        if color   is None: color   = 1 #default foreground colour (b)
698        if bgcolor is None: bgcolor = 0 #default backgound colour (w)
699        if vpid    is None: vpid    = -1
700       
701        coloridx = self.get_colorindex(color)
702        bgcoloridx = self.get_colorindex(bgcolor)
703        self._plotter.set_annotation(label, posx, posy, angle, fjust, size, style, coloridx, bgcoloridx, vpid)
704"""
Note: See TracBrowser for help on using the repository browser.