From: Rich S. <rsh...@ap...> - 2008-03-19 00:57:32
|
I'm looking at PyX as a replacement for Matplotlib in our application. But, reading the manual and FAQ I don't see that I can plot Gaussian curves, S-Curves, and Z-Curves for example, by passing the appropriate parameters. Can this be done? Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Alan G I. <ai...@am...> - 2008-03-20 21:26:53
|
On Tue, 18 Mar 2008, Rich Shepard apparently wrote: > I'm looking at PyX as a replacement for Matplotlib in our > application. But, reading the manual and FAQ I don't see > that I can plot Gaussian curves, S-Curves, and Z-Curves > for example, by passing the appropriate parameters. http://www.cs.ucr.edu/~titus/pyxTutorial/index.html#func Please note that there are great differences between the two applications. PyX is a PostScript oriented drawing and plotting application; Matplotlib provides interactive graphics. Also, note that PyX is under the GPL. Cheers, Alan Isaac |
From: Rich S. <rsh...@ap...> - 2008-03-20 21:34:26
|
On Thu, 20 Mar 2008, Alan G Isaac wrote: > Please note that there are great differences between the two applications. > PyX is a PostScript oriented drawing and plotting application; Matplotlib > provides interactive graphics. Also, note that PyX is under the GPL. Alan, Thank you, I saw those differences as I explored further. Seems to me that PyX is similar to PSTricks, and neither is actually as useful for plotting the curves I need as is matplotlib. Thanks, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Alan G I. <ai...@am...> - 2008-03-20 22:45:07
|
On Thu, 20 Mar 2008, Rich Shepard apparently wrote: > But I need to draw bell curves, S-, and Z-curves, and > similar by passing parameters to the plotting routine. > I did not see this capability in PyX. Whether in Matplotlib or PyX, you will need to characterize what you are drawing somehow. I assume from your description that your drawings are based on known functional forms. Did you look at the function plot example I posted the link to? Why won't that work? Cheers, Alan Isaac |
From: Rich S. <rsh...@ap...> - 2008-03-20 23:08:39
|
On Thu, 20 Mar 2008, Alan G Isaac wrote: > Whether in Matplotlib or PyX, you will need to characterize what you are > drawing somehow. And I do. > I assume from your description that your drawings are based on known > functional forms. Correct. > Did you look at the function plot example I posted the link to? Why won't > that work? I looked at the function plot on the pyx web site and did not see the same capabilities as I do with mpl. The drawback to PyX and PSTricks is trying to call LaTeX from within the python report generating functions. My problems are not with the plotting functions but with figuring out how to correctly manipulate a list of tuples, each of which has 17 items, and loop through them correctly calling the appropriate plotting routines. Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Joerg L. <jo...@us...> - 2008-03-20 23:20:54
|
Hi Rich, On 20.03.08, Rich Shepard wrote: > I looked at the function plot on the pyx web site and did not see the same > capabilities as I do with mpl. There's no difference in which functions can be plotted by PyX and which ones by matplotlib? Both libraries allow you to plot any arbitrary function which can be defined in Python. > The drawback to PyX and PSTricks is trying to call LaTeX from within the > python report generating functions. Just as a side-node: Using PSTricks you can also plot every function you are able to define in PostScript - which, depending on you programming skills and patience, might imply a different set of functions as the one mentioned above - only practically, though, theoretically, it of course does not. But concerning the way LaTeX comes into play, PyX and PSTricks are entirely different. While PSTricks code is executed by the LaTex interpreter, PyX actually calls LaTeX itself. > My problems are not with the plotting functions but with figuring out how > to correctly manipulate a list of tuples, each of which has 17 items, and > loop through them correctly calling the appropriate plotting routines. Now this looks like a totally different problem... Best, Jörg |
From: Rich S. <rsh...@ap...> - 2008-03-23 17:50:43
|
On Thu, 20 Mar 2008, Alan G Isaac wrote: > Please note that there are great differences between the two applications. > PyX is a PostScript oriented drawing and plotting application; Matplotlib > provides interactive graphics. Also, note that PyX is under the GPL. Alan, Let me start over with the PyX group. Matplotlib does non-interactive, publication-quality plots, too. But, it is derived from MatLab and has serious limitations as far as my needs are concerned. Allow me to share what I'm trying to do, then folks can point me toward the appropriate part(s) of the manual and faq to learn how to do it. These are some of the functions I need to plot in my application. The last part of each (starting with 'p.' is the mpl code that would, I presume, be replaced by pyx code: def fwhm2k(fwhm): # for matplotlib Gaussian and Singleton curves """ Converts fwhm value to k (see above) """ return fwhm/(2 * nx.sqrt(nx.log(2))) def gauss1d(r, fwhm, center): """ Returns the 1d gaussian given by fwhm (full-width at half-max), and c (center) at positions given by r """ return nx.exp(-(r-center)**2 / fwhm2k(fwhm)**2) def boltzman(x, xmid, tau): """ Evaluate the boltzman function with midpoint, xmid, and time constant tau over x """ return 1.0 / (1.0 + nx.exp(-(x-xmid)/tau)) #------------------------------------------------------------------------------ def gaussCurve(midpt, width): center = midpt fwhm = width x = nx.arange(0, 100, 0.1) G = gauss1d(x, fwhm, center) p.plot(x, G, color='red', lw=1) p.axis([0, 100, 0.0, 1.0]) p.xlabel('Universe of Discourse') p.ylabel('Membership Grade') #------------------------------------------------------------------------------ def sCurve(left, right): leftend = left rightend = right midpt = ((rightend-leftend)/2.0) + leftend tau = 5.0 x = nx.arange(leftend, rightend, 0.1) S = boltzman(x, midpt, tau) p.plot(x, S, color='red', lw=1) p.axis([0, 100, 0.0, 1.0]) p.xlabel('Universe of Discourse') p.ylabel('Membership Grade') #------------------------------------------------------------------------------ def zCurve(left, right): leftend = left rightend = right midpt = rightend/2.0 tau = 5.0 x = nx.arange(leftend, rightend, 0.1) Z = 1.0-boltzman(x, midpt, tau) p.plot(x, Z, color='red', lw=1) p.axis([0, 100, 0.0, 1.0]) p.xlabel('Universe of Discourse') p.ylabel('Membership Grade') #------------------------------------------------------------------------------ def trapezoidCurve(ll, hl, hr, lr): lowLeft = ll hiLeft = hl hiRight = hr lowRight = lr x, y = zip(*[(lowLeft, 0.0), (hiLeft, 1.0), (hiRight, 1.0), (lowRight, 0.0)]) p.plot(x, y, color='red', lw=1) p.axis([0, 100, 0.0, 1.0]) p.xlabel('Universe of Discourse') p.ylabel('Membership Grade') #------------------------------------------------------------------------------ def leftShoulderCurve(hl, hr, lr): hiLeft = hl hiRight = hr lowRight = lr x, y = zip(*[(hiLeft, 1.0), (hiRight, 1.0), (lowRight, 0.0)]) p.plot(x, y, color='red', lw=1) p.axis([0, 100, 0.0, 1.0]) p.xlabel('Universe of Discourse') p.ylabel('Membership Grade') #------------------------------------------------------------------------------ def rightShoulderCurve(ll, hl, hr): lowLeft = ll hiLeft = hl hiRight = hr x, y = zip(*[(lowLeft, 0.0), (hiLeft, 1.0), (hiRight, 1.0)]) p.plot(x, y, color='red', lw=1) p.axis([0, 100, 0.0, 1.0]) p.xlabel('Universe of Discourse') p.ylabel('Membership Grade') (As an aside, if there are alternate algorithms for the Gaussian, S-, and Z-Curves, I'm open to those. The Gaussian doesn't reach y=0 at the ends.) Here's an example how I'm calling these: varData =[("Low","Variety","Fish","Wildlife","Decay S-Curve",1,0.0,100.0,0.0,100.0,0.0,100.0,50.0,50.0,100.0,1.0,2), ("High","Variety","Fish","Wildlife","Growth S-Curve",2,0.0,100.0,0.0,100.0,0.0,100.0,50.0,50.0,100.0,1.0,2)] for row in varData: ... if row[4] == 'Decay S-Curve': functions.zCurve(row[10],row[9]) elif row[4] == 'Bell Curve': functions.gaussCurve(row[13],row[14]) elif row[4] == 'Growth S-Curve': functions.sCurve(row[8],row[11]) Two problems with mpl are: the inability to produce only the left and bottom axes (it insists on drawing a box with four axes) and the inability to allow me to define the lengths of the x- and y-axes (it insists that all plots must be square). I need rectangular plots (height half the width, for example) with only the left and bottom axes. If you PyX gurus point me in the proper direction I'll be very happy to translate my code from mpl and get on to labeling and the rest of the applicaiton. Thank you, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Alan G I. <ai...@am...> - 2008-03-23 20:42:58
|
On Sun, 23 Mar 2008, Rich Shepard apparently wrote: > Two problems with mpl are: the inability to produce only > the left and bottom axes (it insists on drawing a box with > four axes) and the inability to allow me to define the > lengths of the x- and y-axes (it insists that all plots > must be square). This might help: <URL:http://pyx.sourceforge.net/gallery/graphs/symbolline.html> You can set length and width to anything you wish. (But that is also true in mpl.) Cheers, Alan Isaac |
From: Rich S. <rsh...@ap...> - 2008-03-25 18:43:56
Attachments:
testData.py
testFunctions.py
|
I'm reading the users manual and looking at examples on the web site's gallery pages (integral seems relevant to me). Attached are two files, one has the data and testing application code, the other the plotting functions. Something has been left out. Here's the python traceback: Traceback (most recent call last): File "testData.py", line 58, in ? testCode() File "testData.py", line 37, in testCode testFunctions.linearDecrCurve(row[10],row[9]) File "/data1/eikos/testFunctions.py", line 186, in linearDecrCurve g.plot(x, y) File "/usr/lib/python2.4/site-packages/pyx/graph/graph.py", line 191, in plot plotitems.append(plotitem(self, d, styles)) File "/usr/lib/python2.4/site-packages/pyx/graph/graph.py", line 52, in __init__ self.title = data.title AttributeError: 'float' object has no attribute 'title' What have I done incorrectly, and what's the proper way to assign axes titles? Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Rich S. <rsh...@ap...> - 2008-03-25 20:18:53
|
On Tue, 25 Mar 2008, Rich Shepard wrote: > Something has been left out. Here's the python traceback: I modified line 216 in testFunctions.py by appending painter=p to the graph canvas. That resolved the first error, but replaced it with an axis data error: Traceback (most recent call last): File "testData.py", line 58, in ? testCode() File "testData.py", line 37, in testCode testFunctions.linearDecrCurve(row[10],row[9]) File "/data1/eikos/testFunctions.py", line 216, in linearDecrCurve painter=p) File "/usr/lib/python2.4/site-packages/pyx/graph/graph.py", line 305, in __init__ self.axes[axisname] = axis.anchoredaxis(aaxis, self.texrunner, axisname) File "/usr/lib/python2.4/site-packages/pyx/graph/axis/axis.py", line 488, in __init__ self.data = axis.createdata(errorname) AttributeError: regular instance has no attribute 'createdata' What is now missing? Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: David B. <dav...@ci...> - 2008-03-25 21:46:23
Attachments:
example.py
|
Hi, Try taking a look at this minimal example; hopefully it will show you how to do the basic things you need. I'd recommend persevering with PyX. I've found it to be one of the best plotting tools available in terms of producing print-quality figures. (Matplotlib is great for previewing data but I can't stand how you have to jump though hoops to get the figures all the right sizes). All the best David Rich Shepard wrote: > On Tue, 25 Mar 2008, Rich Shepard wrote: > >> Something has been left out. Here's the python traceback: > > I modified line 216 in testFunctions.py by appending painter=p to the > graph canvas. That resolved the first error, but replaced it with an axis > data error: > > Traceback (most recent call last): > File "testData.py", line 58, in ? > testCode() > File "testData.py", line 37, in testCode > testFunctions.linearDecrCurve(row[10],row[9]) > File "/data1/eikos/testFunctions.py", line 216, in linearDecrCurve > painter=p) > File "/usr/lib/python2.4/site-packages/pyx/graph/graph.py", line 305, in > __init__ > self.axes[axisname] = axis.anchoredaxis(aaxis, self.texrunner, axisname) > File "/usr/lib/python2.4/site-packages/pyx/graph/axis/axis.py", line 488, > in __init__ > self.data = axis.createdata(errorname) > AttributeError: regular instance has no attribute 'createdata' > > What is now missing? > > Rich > -- =========================================== David Barton Email: dav...@ci... Web: www.cityinthesky.co.uk =========================================== |
From: Rich S. <rsh...@ap...> - 2008-03-25 22:06:29
|
On Tue, 25 Mar 2008, David Barton wrote: > Try taking a look at this minimal example; hopefully it will show you how > to do the basic things you need. I'd recommend persevering with PyX. I've > found it to be one of the best plotting tools available in terms of > producing print-quality figures. (Matplotlib is great for previewing data > but I can't stand how you have to jump though hoops to get the figures all > the right sizes). David, I originally wanted to use PSTricks as I use that for my vector graphics and LaTeX for my written documents, but it doesn't integrate smoothly with Python. So, I want to quickly become conversant with PyX so I can use it to generate exactly the figures I need for our model output reports. Despite reading the users guide and FAQ, and looking at examples on the web site, I'm still not sure exactly what needs to be included, and in which order. I know that experience will help, but today is my first attempt to get results with code that produces matplotlib results ... not the right size, not having the proper axes, no labeling, but they do print. So I know the data and functions are correct. Your example helps very much, but with understanding comes more questions. For example, given the functions in the testFunction.py file I attached, do I need to use graph.data.points() to convert the data before passing them to the rest of the PyX code? May I have an example of how to do that for the normal or logistic curves there? (Once I understand what I'm doing, and why I'm doing it I'll be able to adapt all the curve-generating functions correctly.) Would the graph.data.paramdate() function be used in my code? Many thanks, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Rich S. <rsh...@ap...> - 2008-03-27 13:51:49
|
On Tue, 25 Mar 2008, David Barton wrote: > I'd recommend persevering with PyX. I've found it to be one of the best > plotting tools available in terms of producing print-quality figures. David, I agree that it's a powerful and useful library which is not too difficult to learn. Yesterday I experimented, re-read the manual, faq, and example/gallery code so I have a much greater appreciation and know how to do much of what I need from it. However, there are currently two remaining issues for which I have not found the solutions on my own. I would greatly appreciate help from the community here. 1.) The y-axis on the plots I need to create range from [0.0, 1.0]. By specifying my own partioner I can change the tick spacing from 0, 0.25, 0.5, 0.75, 1 to every 0.2: pary = graph.axis.parter.lin([0.2,]) However, the ends are labeled without the '.0' that the inner labels have. How do I replace 0 with 0.0 and 1 with 1.0? 2.) This actually has two components, but they are related and need to be addressed together. The actual curve drawing functions are used in several parts of the model's use, so they are in the generic 'functions.py' and imported to the specific modules where they are needed. However, each plot needs to contain multiple curves (from 2 to 7). I read that multiple calls to plot() can be made to put all the curves on a single set of axes. But, how do I implement this across modules? Perhaps the best way to explain this is how I did it with matplotlib. The calling module instructed matplotlib to freeze the plot until released. Then the required curve-generating functions in functions.py were called and the curves themselves returned to the calling module. When all were returned, matplotlib was told to generate the figure, write it to disk, and release the axes and plot for the next figure. Perhaps PyX has a different approach, but my experiments yesterday did not discover just how I can do this. The calls to graphxy() appear to immediately preceed the call to plot(), and there's no way to separate them. I suppose the curve-generating functions could return a list of tuples (appropriate x,y pairs) to the calling module for graph creation and plotting but I don't know how to do that. Nor do I know how I can assemble the the figure to plot from different curves. I can provide both calling code and curve-generating functions in my two stand-alone testing/learning modules. TIA, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Alan G I. <ai...@am...> - 2008-03-27 14:04:33
|
On Thu, 27 Mar 2008, Rich Shepard apparently wrote: > I read that multiple calls to plot() can be made to put all the curves on > a single set of axes. But, how do I implement this across modules? Here's an example (with data from files, but adapt it). You can just build up the data however you want, and then plot it at one go. http://www.cs.ucr.edu/~titus/pyxTutorial/index.html#multi Cheers, Alan |
From: Rich S. <rsh...@ap...> - 2008-03-27 14:20:07
|
On Thu, 27 Mar 2008, Alan G Isaac wrote: > Here's an example (with data from files, but adapt it). You can just build > up the data however you want, and then plot it at one go. > http://www.cs.ucr.edu/~titus/pyxTutorial/index.html#multi Alan, This looks like the examples on the gallery. If I understand, I need to generate a list of tuples using the curve-generating functions, then return that list to the calling module to assemble them in sequence and plot them. Correct? Thanks, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Alan G I. <ai...@am...> - 2008-03-27 14:37:28
|
On Thu, 27 Mar 2008, Rich Shepard apparently wrote: > If I understand, I need to generate a list of tuples using > the curve-generating functions, then return that list to > the calling module to assemble them in sequence and plot > them. You can generate the data however you wish. If you want detailed control, generate the actual points as you suggest (using graph.data.points or graph.data.values). Or just provide your functions or wrappers to them (using graph.data.function). <URL:http://pyx.sourceforge.net/manual/module-graph.data.html> hth, Alan Isaac |
From: Rich S. <rsh...@ap...> - 2008-03-27 16:56:56
|
On Thu, 27 Mar 2008, Alan G Isaac wrote: > You can generate the data however you wish. Or just provide your functions > or wrappers to them (using graph.data.function). Alan, I think that what I want is graph.data.function(). The syntax needs to be validated. For example, in the calling module I would have this: if plotting: if row[4] == 'Decay S-Curve': gdS = graph.data.function(" ", context={"Functions.zCurve(row[10],row[9])": Functions.zCurve(row[10],row[9])}) elif row[4] == 'Bell Curve': gB = graph.data.functin(" ", context={"functions.gaussCurverow([13],row[14])": functions.gaussCurve}(row[13],row[14)]) where functions.zCurve is defined as: def zCurve(left, right): leftend = left rightend = right midpt = rightend/2.0 tau = 5.0 x = nx.arange(leftend, rightend, 0.1) Z = 1.0-boltzman(x, midpt, tau) return (x,Z) and functions.gaussCurve() is defined as: def gaussCurve(midpt, width): center = midpt fwhm = width x = nx.arange(0, 100, 0.1) G = gauss1d(x, fwhm, center) return (x,G) If these are correct, then I need to work out how to feed the appropriate results to g.plot() and where the axes, parter, texter, etc. are to be defined. Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Rich S. <rsh...@ap...> - 2008-03-27 17:02:43
|
On Thu, 27 Mar 2008, Rich Shepard wrote: > context={"Functions.zCurve(row[10],row[9])": Typos. it should be "functions...." with lowercase 'f'. Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Joerg L. <jo...@us...> - 2008-03-25 22:03:32
|
Hi Rich, On 25.03.08, Rich Shepard wrote: > I'm reading the users manual and looking at examples on the web site's > gallery pages (integral seems relevant to me). Attached are two files, one > has the data and testing application code, the other the plotting functions. > > Something has been left out. Here's the python traceback: > > Traceback (most recent call last): > File "testData.py", line 58, in ? > testCode() > File "testData.py", line 37, in testCode > testFunctions.linearDecrCurve(row[10],row[9]) > File "/data1/eikos/testFunctions.py", line 186, in linearDecrCurve > g.plot(x, y) > File "/usr/lib/python2.4/site-packages/pyx/graph/graph.py", line 191, in > plot > plotitems.append(plotitem(self, d, styles)) > File "/usr/lib/python2.4/site-packages/pyx/graph/graph.py", line 52, in > __init__ > self.title = data.title > AttributeError: 'float' object has no attribute 'title' > > What have I done incorrectly, and what's the proper way to assign axes > titles? The problem is that with PyX you have to wrap your data (either functions, lists or files) in certain data provider classes, e.g. g.plot(graph.data.function("y(x)=sin(x)") or g.plot(graph.data.values(x=[1,2,3], y=[1,4,9])) As pointed out by David, have a look at the examples on the webpage, in particular: http://pyx.sourceforge.net/examples/graphs/function.html Admittedly, an example for the second use case outlined above had been missing, but has been added in the PyX repository just today due to a corresponding request on this list. Note furthermore that when plotting "non-standard" mathematical functions, especially functions you have defined yourself, you have to tell the data class under which name you want to access them, e.g. def f(x): # calculate result y return y g.plot(graph.data.function("y(x)=f(x)", context={"f": f})) Finally, as a side remark: Try to start with a reduced version of your code and build the more complex version only after the simple parts work. Especially when asking for help on this list, post a minimal example in order to allow people to quickly identify what's going on. HTH, Jörg |
From: Rich S. <rsh...@ap...> - 2008-03-25 22:11:06
|
On Tue, 25 Mar 2008, Joerg Lehmann wrote: > The problem is that with PyX you have to wrap your data (either functions, > lists or files) in certain data provider classes, e.g. > > g.plot(graph.data.function("y(x)=sin(x)") > or > g.plot(graph.data.values(x=[1,2,3], y=[1,4,9])) Jörg, Ah, that's what I thought. And, you answered my question to David regarding this. > As pointed out by David, have a look at the examples on the webpage, > in particular: > > http://pyx.sourceforge.net/examples/graphs/function.html I did look at this, but did not see how to apply it to my needs. > Note furthermore that when plotting "non-standard" mathematical functions, > especially functions you have defined yourself, you have to tell the data > class under which name you want to access them, e.g. > > def f(x): > # calculate result y > return y > > g.plot(graph.data.function("y(x)=f(x)", context={"f": f})) This is what I did not fully understand how to write. > Finally, as a side remark: Try to start with a reduced version of your > code and build the more complex version only after the simple parts work. > Especially when asking for help on this list, post a minimal example in > order to allow people to quickly identify what's going on. Makes sense. I had isolated code and a few data tuples (from a collection of about 360). But, I'll take it one function at a time. Will start with the logistic curves. I'll probably have questions, but they'll be on a smaller code base and just a single data set. Thanks, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: David B. <dav...@ci...> - 2008-03-25 22:17:09
|
I would try something like: def gaussCurve(midpt, width): center = midpt fwhm = width x = nx.arange(0, 100, 0.1) G = gauss1d(x, fwhm, center) p = graph.axis.painter.regular(titlepos=0.3, titledirection=None) g = graph.graphxy(width=8, x2=None, y2=None, x=graph.axis.linear(min=0, max=100, title='Universe of Discourse', painter=p), y=graph.axis.linear(min=0.0, max=1.0, title='Membership Grade', painter=p)) g.plot(graph.data.values(x=x, y=G)) but I haven't tried it myself ;-) David Rich Shepard wrote: > On Tue, 25 Mar 2008, David Barton wrote: > >> Try taking a look at this minimal example; hopefully it will show you how >> to do the basic things you need. I'd recommend persevering with PyX. I've >> found it to be one of the best plotting tools available in terms of >> producing print-quality figures. (Matplotlib is great for previewing data >> but I can't stand how you have to jump though hoops to get the figures all >> the right sizes). > > David, > > I originally wanted to use PSTricks as I use that for my vector graphics > and LaTeX for my written documents, but it doesn't integrate smoothly with > Python. So, I want to quickly become conversant with PyX so I can use it to > generate exactly the figures I need for our model output reports. > > Despite reading the users guide and FAQ, and looking at examples on the > web site, I'm still not sure exactly what needs to be included, and in which > order. I know that experience will help, but today is my first attempt to > get results with code that produces matplotlib results ... not the right > size, not having the proper axes, no labeling, but they do print. So I know > the data and functions are correct. > > Your example helps very much, but with understanding comes more questions. > For example, given the functions in the testFunction.py file I attached, do > I need to use graph.data.points() to convert the data before passing them to > the rest of the PyX code? May I have an example of how to do that for the > normal or logistic curves there? (Once I understand what I'm doing, and why > I'm doing it I'll be able to adapt all the curve-generating functions > correctly.) Would the graph.data.paramdate() function be used in my code? > > Many thanks, > > Rich > -- =========================================== David Barton Email: dav...@ci... Web: www.cityinthesky.co.uk =========================================== |
From: Rich S. <rsh...@ap...> - 2008-03-26 00:50:47
|
On Tue, 25 Mar 2008, David Barton wrote: > I would try something like: David, Joerg, et al.: An excellent example to get me going. The code's attached, and you can create the same .pdf file I did. I've looked at the docs (user manual, faq, web examples and galleries) but haven't found how to specify the y-axis ticks (every 0.2) and format them so all have 1 decimal place (0.0 - 1.0). In this example I used graph.graphxy() rather than graph.data() or graph.paramdata(). Can I assume that graphxy() will work for all my curves since they're all specified within the method in which the plotting is done? Or, should I rewrite it to use an explicit function defined within the statement? (I've probably not clearly explained my question; if so, let me know and I'll try again). Is a thick line for the plot the default? Took a while to find how to make it thin. I'm going to want multiple curves on the same set of axes. I learned that I can get this by calling plot() for each one, but ... that's not how the functions are arranged in the module. I need to learn how to pass the values from one module to the other, but still create multiple plots. Not at all sure how to structure this. The learning curve looks like it might be fairly short and not too steep. But, incorporating it into the multi-module application probably will take some serious learning. Thanks for the nudge in the right direction, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Rich S. <rsh...@ap...> - 2008-03-26 00:55:22
Attachments:
learnPyX.py
|
On Tue, 25 Mar 2008, Rich Shepard wrote: > The code's attached, and you can create the same .pdf file I did. Helps if I remember to slap it on before sending the message. Here is the code. Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Joerg L. <jo...@us...> - 2008-03-27 14:09:50
|
Hi Rich, On 27.03.08, Rich Shepard wrote: > 1.) The y-axis on the plots I need to create range from [0.0, 1.0]. By > specifying my own partioner I can change the tick spacing from 0, 0.25, > 0.5, 0.75, 1 to every 0.2: > pary = graph.axis.parter.lin([0.2,]) > > However, the ends are labeled without the '.0' that the inner labels have. > How do I replace 0 with 0.0 and 1 with 1.0? If really wanted (*hint*), this can be realized by passing a modified texter to the axis. Now I would have liked to point you to a corresponding example, but unfortunately, while already existing, it's not yet online. So instead, I refer to the documentation http://pyx.sourceforge.net/manual/module-graph.axis.texter.html and mention that you probably want to set the equalprecision option to 1. > 2.) This actually has two components, but they are related and need to be > addressed together. > > The actual curve drawing functions are used in several parts of the > model's use, so they are in the generic 'functions.py' and imported to the > specific modules where they are needed. However, each plot needs to contain > multiple curves (from 2 to 7). > > I read that multiple calls to plot() can be made to put all the curves on > a single set of axes. But, how do I implement this across modules? Perhaps > the best way to explain this is how I did it with matplotlib. I'm not totally sure whether I understand you correctly, but what you can do is to pass the graphxy instance around. Then you can plot on this graph up to the moment you write it to a file (or call things like the finish() method of the graph, but that's just a side remark). HTH, Jörg |
From: Rich S. <rsh...@ap...> - 2008-03-27 19:11:29
|
On Thu, 27 Mar 2008, Joerg Lehmann wrote: Jörg, > If really wanted (*hint*), this can be realized by passing a > modified texter to the axis. That certainly did the trick. Thanks. > I'm not totally sure whether I understand you correctly, but what you can > do is to pass the graphxy instance around. Then you can plot on this graph > up to the moment you write it to a file (or call things like the finish() > method of the graph, but that's just a side remark). Perhaps the most efficient way is to post two small files. testData.py has a few data tuples in the varData list and is the calling module. testFunctions.py hold the code for each curve. I want to generate the multi-curve plots from within testData.py and collect the .eps files on disk for inclusion in the LaTeX report. There is, obviously, tremendous repetition in testFunctions.py, and most of that code probably belongs at the end of testData.py, where I have the descriptive comment. If the curve-generating routines are to be called remotely, I probably want to use graph.data.functions() instead of graph.data.values(). I hope that being highly specific helps me to learn how to accomplish this plotting quickly and makes the best use of your time in teaching me. TIA, Rich -- Richard B. Shepard, Ph.D. | Integrity Credibility Applied Ecosystem Services, Inc. | Innovation <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |