computed can be computed separately as $$x = r cos(theta)$$ and $$y = r sin(theta)$$.
Our solver page at http://extreme.adorio-research.org/solvers/rplotpage/polar/ has three different ways to present polar plots, namely
[polar, rectangular and space]. The range of theta can be specified and the number of points can be set up to 15000, to allow fast drawing without overloading the server.
Here are the three images possible for the butterfly equation, exp(cos(theta)) - 2 * cos(4*theta) + sin(theta/12)^5, presented in Venables and Ripley authoritative book: MASS "Modern Applied Statistics using S" book.
The last image was generated using ntheta = 15000 and pch=5.
Here is the page QP/QPY code for the polar plot page.
# pie.qpy # 2006.09.02 0.0.1 first version # 2006.09.20 0.0.2 split from pie,pie, dot page. # 2010.08.23 0.0.3 third version. __version__ = "0.0.3" __date__ = "07.08.12" __author__ = "eadorio@yahoo.com" __title__ = "Polar plots using R" __catalog__ = "POLAR-RPLOT-0127" __url__ = "/solvers/rplotpage/polar/" __author__ = "E.P. Adorio" import time import tempfile import commands import os from qp.fill.directory import Directory from qp.fill.form import Form, StringWidget, TextWidget,CheckboxWidget,SingleSelectWidget from qp.fill.css import BASIC_FORM_CSS from qp.sites.extreme.lib.tmpfilesmanager import TmpFilesManager from qp.sites.extreme.lib.uicommon import renderheader, renderfooter, processheader, processfooter from qp.pub.common import page from qp.sites.extreme.lib.checkinput import checkInputs, getFormStrings from qp.sites.extreme.lib.qpyutils import printRlines, showLogo from qp.sites.extreme.lib.webutils import vecRead,GraphicsFile, as_R_cvector, as_R_vector, as_R_matrix, runRcode from qp.sites.extreme.lib import config def Solve(fields): (gX, gY, theta0, theta1, ntheta, gtype, psize, equation, col, main, sub, xlab, ylab) = fields fname1 = GraphicsFile("png") barefile1 = fname1.split(str("/")) [-1] Rcode = "png('%s', width=%s*72, height=%s*72)\n" % (fname1, gX, gY) Rcode += """ theta <- seq(%s, %s, len=%s) radius <- %s x <- radius * cos(theta) y <- radius * sin(theta) """ % (theta0, theta1, ntheta, equation) if gtype == "polar": Rcode += """ plot(y, x, col="%s",type="l", main="%s",sub="%s",xlab="%s",ylab="%s", axes=FALSE) """ % (col, main, sub, xlab, ylab) elif gtype == "rect": Rcode += """ vlo = min(radius, x, y) vhi = max(radius, x, y) plot(theta, radius, ylim=c(vlo, vhi), col="black",type="l", main="%s",sub="%s",xlab="%s",ylab="%s") points(theta, x, col="red",type="l") points(theta, y, col="blue",type="l") """ % (main, sub, xlab, ylab) elif gtype == "3d": Rcode += """ library(scatterplot3d) scatterplot3d(x, y, theta, highlight.3d=TRUE, col.axis="blue", col.grid="lightblue", main="Space Curve", pch=16, cex.symbols = %s) """ % psize Rcode += """ graphics.off() #img %s """ % (barefile1) status, output = runRcode(Rcode) return output class PolarplotPage(Directory): def get_exports(self): yield ('', 'index', 'PolarPlot', '') def index[html](self): form = Form(enctype="multipart/form-data") # enctype for file upload form.add(StringWidget, name="gX", title = "gX", value="6", size=3) form.add(StringWidget, name="gY", title = "gY", value="6", size=3) form.add(StringWidget, name="theta0", title = "theta0", value = "0", size=5) form.add(StringWidget, name="theta1", title = "theta1", value = "24*pi", size=5) form.add(StringWidget, name="ntheta", title = "ntheta", value = "2000", size = 5) form.add(SingleSelectWidget, name="gtype", title = "Type", value = "polar", options = [("polar", "polar"), ("rect", "rect"),("3d", "space")]) form.add(StringWidget, name="psize", title = "Pt size", value = "0.2", size = 3) form.add(StringWidget, name="equation", title="Equation in theta r = f(theta)", value= "exp(cos(theta)) - 2 * cos(4*theta) + sin(theta/12)^5", size = 70) form.add(StringWidget, name="col", title="Color", value="red", size=10) form.add(StringWidget, name="main", title="Main", value="Polar Plot", size=15) form.add(StringWidget, name="sub", title="Sub", value="Example", size = 15) form.add(StringWidget, name="xlab", title="xlab", value="X", size=15) form.add(StringWidget, name="ylab", title="ylab", value="Y", size=15) form.add_hidden("time", value = time.time()) form.add_submit("submit", "submit") def render [html] (): renderheader(__title__) """\
%s | %s | %s | %s | %s | %s | %s | %s |
%s |
%s | %s | %s | %s |
gX | float | 3, 10 |
gY | float | 3, 10 |
ntheta | int | 2, 15000 |
psize | float | 0.2, 10 |
Space curves are drawn using the R scatterplot3d package of Uwe Ligges.
The butterfly polar function example is from Venables and Ripley, MASS.
"""
renderfooter(form, __version__, __catalog__, __author__)
if not form.is_submitted():
return page('polarplotpage', render(), style= BASIC_FORM_CSS)
def process [html] ():
processheader(__title__)
calctime_start = time.time()
# Get the form input values
def tmp1():
return getFormStrings(form, [
"gX", "gY", "theta0", "theta1", "ntheta",
"gtype", "psize", "equation", "col", "main",
"sub", "xlab", "ylab"])
(gX, gY, theta0, theta1, ntheta, gtype, psize,
equation, col, main, sub, xlab, ylab) = tmp1()
def tmp2():
inflag = checkInputs(
[("gX", gX, ("float", 3, 10)),
("gY", gY, ("float", 3, 10)),
("theta0", theta0, ("eqn", "")),
("theta1", theta1, ("eqn", "")),
("ntheta", ntheta, ("int", 2, 15000)),
("psize", psize, ("float", 0.2, 10)),
("equation", equation, ("eqn",""))])
return inflag
inflag = tmp2()
if inflag[0]:
"
" inflag[1] "" else: output = Solve((gX, gY, theta0, theta1, ntheta, gtype, psize, equation, col, main, sub, xlab, ylab)) "
" printRlines(output) "" showLogo("Rlogo.jpg") processfooter(form, calctime_start, "./", __url__) process()
Constructive criticisms from our reader are very welcome. Email the page author at ernesto.adorio@gmail.com or alternately at eadorio@yahoo.com
No comments:
Post a Comment