From: M. F. <elm...@gm...> - 2008-04-27 19:53:09
|
Dear all, I've been using PyX for some time for my plots, and I am generally very satisfied with the results I get. The only problem I find with PyX is that the interface is perhaps too low level for an ordinary user, although I am aware that one can use an intermediate layer that solves this problem (like, e.g., PyXplot or PyXgraph). I don't know if this criticism makes sense, perhaps the original role of PyX is to provide a well structured framework to create EPS and PDF files (which, I think, PyX perfectly does), rather than to provide a fast, easy-to-use interface for the creation of these files. My question is Is there anything similar to an 'init file' where the user can set some default values for the axes, stylechangers, etc.? Some time ago I asked a similar question and the solution I was given was to define a class like class AxisReg(axis.painter.regular): def __init__(self, labeldist = 0.15 * unit.v_cm, titledist = 0.15 * unit.v_cm, outerticklength = axis.painter.ticklength.short, innerticklength = None, basepathattrs = [style.linewidth.normal], tickattrs = [style.linewidth.normal], labelattrs = [text.size.footnotesize], titleattrs = [text.size.small], **kwargs): axis.painter.regular.__init__(self, labeldist = 0.15 * unit.v_cm, titledist = 0.15 * unit.v_cm, outerticklength = axis.painter.ticklength.short, innerticklength = None, basepathattrs = [style.linewidth.normal], tickattrs = [style.linewidth.normal], labelattrs = [text.size.footnotesize], titleattrs = [text.size.small], **kwargs) class AxisRegLik(axis.painter.regular): def __init__(self, outerticklength = axis.painter.ticklength.short, innerticklength = None, basepathattrs = [style.linewidth.normal], tickattrs = [style.linewidth.normal], labelattrs = None, titleattrs = None, **kwargs): axis.painter.regular.__init__(self, outerticklength = axis.painter.ticklength.Short, innerticklength = None, basepathattrs = [style.linewidth.normal], tickattrs = [style.linewidth.normal], labelattrs = None, titleattrs = None, **kwargs) and then use an instance of this class as a painter of the axis: regular_axis = AxisReg() notext_axis = AxisNoReg() x_ax = axis.linear(title="X", painter = regular_axis, density = x_density, min=x_min, max=x_max) x_ax_lik = axis.linear(painter = no_text_a, min = x_min, max = x_max) y_ax = ... y_ax_lik = .. ... graph.graphxy(x=x_ax, y=y_ax, x2=x_ax_lik, y2=y_ax_lik,...) Ok, it is fine, it can be done, but many of us will agree that this is not an optimal solution. Are there better ways to do this? Thanks a lot for your attention, Mico |
From: André W. <wo...@us...> - 2008-05-15 08:23:32
|
Dear Mico, while we do have a pyxrc facility for some PyX configuration, such configuration options will only contain maschine dependend information. I'm strongly against using a gobal config file for layout adjustments as your PyX scripts would silently become dependend on the local configuration. Instead it is a common practise to use a Python script itself for configuration. In your case I suggest to build you a file containing stuff like from pyx import * class myaxis(graph.axis.lin): def __init__(self, ...): pyx.graph.axis.__init__(self, ...) You can than use PyX by importing your PyX configuration and use mygraph, myaxis, etc. HTH André Am 27.04.2008 um 21:53 schrieb Mico Filós: > Dear all, > > I've been using PyX for some time for my plots, and I am generally > very satisfied with the results I get. > The only problem I find with PyX is that the interface is perhaps too > low level for an ordinary user, although I am aware that one can use > an intermediate layer that solves this problem (like, e.g., PyXplot or > PyXgraph). I don't know if this criticism makes sense, perhaps the > original role of PyX is to provide a well structured framework to > create EPS and PDF files (which, I think, PyX perfectly does), rather > than to provide a fast, easy-to-use interface for the creation of > these files. > > My question is > > Is there anything similar to an 'init file' where the user can set > some default values for the axes, stylechangers, etc.? > > Some time ago I asked a similar question and the solution I was given > was to define a class like > > class AxisReg(axis.painter.regular): > def __init__(self, > labeldist = 0.15 * unit.v_cm, > titledist = 0.15 * unit.v_cm, > outerticklength = axis.painter.ticklength.short, > innerticklength = None, > basepathattrs = [style.linewidth.normal], > tickattrs = [style.linewidth.normal], > labelattrs = [text.size.footnotesize], > titleattrs = [text.size.small], > **kwargs): > axis.painter.regular.__init__(self, > labeldist = 0.15 * unit.v_cm, > titledist = 0.15 * unit.v_cm, > outerticklength = > axis.painter.ticklength.short, > innerticklength = None, > basepathattrs = > [style.linewidth.normal], > tickattrs = > [style.linewidth.normal], > labelattrs = > [text.size.footnotesize], > titleattrs = [text.size.small], > **kwargs) > > class AxisRegLik(axis.painter.regular): > def __init__(self, > outerticklength = axis.painter.ticklength.short, > innerticklength = None, > basepathattrs = [style.linewidth.normal], > tickattrs = [style.linewidth.normal], > labelattrs = None, > titleattrs = None, > **kwargs): > axis.painter.regular.__init__(self, > outerticklength = > axis.painter.ticklength.Short, > innerticklength = None, > basepathattrs = > [style.linewidth.normal], > tickattrs = > [style.linewidth.normal], > labelattrs = None, > titleattrs = None, > **kwargs) > > and then use an instance of this class as a painter of the axis: > > regular_axis = AxisReg() > notext_axis = AxisNoReg() > x_ax = axis.linear(title="X", painter = regular_axis, > density = x_density, min=x_min, max=x_max) > x_ax_lik = axis.linear(painter = no_text_a, min = x_min, max = x_max) > y_ax = ... > y_ax_lik = .. > ... > graph.graphxy(x=x_ax, y=y_ax, x2=x_ax_lik, y2=y_ax_lik,...) > > Ok, it is fine, it can be done, but many of us will agree that this is > not an optimal solution. Are there better ways to do this? > > Thanks a lot for your attention, > > Mico > > ------------------------------------------------------------------------- > This SF.net email is sponsored by the 2008 JavaOne(SM) Conference > Don't miss this year's exciting event. There's still time to save > $100. > Use priority code J8TL2D2. > http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone > _______________________________________________ > PyX-user mailing list > PyX...@li... > https://lists.sourceforge.net/lists/listinfo/pyx-user > -- by _ _ _ Dr. André Wobst, Amselweg 22, 85716 Unterschleißheim / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript and PDF figures (_/ \_)_/\_/ with Python & TeX: visit http://pyx.sourceforge.net/ |
From: M. F. <elm...@gm...> - 2008-05-15 16:20:20
|
Thanks André for your help. I also wanted to know your opinion about the idea of having an init file for layout adjustments. Now I know :) I think it would be a good idea to include somewhere (in the documentation, in the FAQ) an example of such python script used to override the default configuration. By the way, I have been very glad to see that graphxyz is already functional. Congratulations! Best, Mico |
From: M. F. <elm...@gm...> - 2008-06-13 20:02:38
|
Dear all, I am sorry for being so reiterative with the subject, but I am still confused :) As I said in my previous post, I want to use a customized version of the painter for the axes. There is a solution for this problem (see the first post in the thread), but I wonder if this is what you André were really suggesting. My feeling is that my code is a little redundant, and I would like to know the opinion of the experts on that. Besides, since I sometimes need to modify some of the attributes of my original defaults, I think it would be natural to have some callable object that changes, via a keyword, the attribute to modify. E.g.: myaxes = myaxis() # my defaults myaxes_b = myaxis(titledist=0.1) # my defaults except titledist, which is now 0.1 As far as I understand, with the class 'myaxis' you posted, you define a new class with different defaults for the attributes, but any slight variation of the values requires rewriting the whole thing. Am I right? Some time ago [see post https://sourceforge.net/mailarchive/message.php?msg_id=20051001211930.GA18839%40upf.edu] you André said that it would be a good idea to implement a sort of "costumizable instances" for that, so that it would be possible to use __call__ to modify some of the attributes of the class. This would certainly reduce the code shown above, and goes along the lines of what I was saying. I would like to hear about your current opinion on this matter. I apologize if this is really something trivial. Thanks for your attention Mico |