Our solver is in R and we present the QP/QPY code, not to impress but to remind the developer to add more features to make the solver more useful, robust, fast and reliable.
"""
file boxviolin.qpy
version 2010.09.01 0.0.1 first version
"""
__version__ = "0.0.1 2010.09.01"
__author__ = "ernesto.adorio@gmail.com"
__title__ = "Box-Violin Plots using R"
__file__ = "matrix.qpy"
__catalog__ = "BOXVIOLINPLOT-xxxx"
__url__ = "/solvers/rplotpage/box-violin/"
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, str2file,runRcode
from qp.sites.extreme.lib import config
from qp.sites.extreme.lib import getlists
def Solve(fields):
# Get the fields.
(gX, gY, orientation, notchedQ, color, input, output, main, sub, data)= fields
color = color.strip()
# Start of R code.
fname1 = GraphicsFile(str("png"))
barefile1 = fname1.split(str("/"))[-1]
if input == "lists":
values, names = getlists.getlists(data)
else:
str2file(data, "%s.datR" % barefile1)
Rcode = """
library("UsingR")
library("vioplot")
png('%s', width=%s*72, height=%s*72)\n""" % (fname1,gX,gY)
if input == "lists":
Rcode += values
Rcode += "%s(" % output
n = len(names)
for i, name in enumerate(names):
if i == 0:
Rcode += "%s" % name
else:
Rcode += ",%s" % name
else:
if output != "vioplot":
Rcode += 'D<- read.table("%s.datR", header= %s)\n' %(barefile1, "T" if input == "dataframeh" else "F")
Rcode += "%s(D" % output
else:
return "Error: vioplot do not work with dataframes (will fix this later)."
Rcode += ",col=\"%s\"" % color
if output != "violinplot":
Rcode += ",horizontal= %s" %("T" if (orientation== "horizontal") else "F")
if output== "boxplot":
if notchedQ == "True":
Rcode += ",notch=T"
Rcode += ",main=\"%s\",sub=\"%s\"" % (main, sub)
Rcode += ")\n"
Rcode += """
graphics.off()
#img %s
""" % (barefile1,)
(status, output) = runRcode(Rcode)
return output
class BoxviolinPage(Directory):
def get_exports(self):
yield ('', 'index', 'MatrixPlot', '')
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)
sample = """
A = [0.48277807, 0.55883118, 1.16229686, -2.46396356, 0.51974668,-0.01998613,
-0.86259931, -1.06209308, -0.15671515, 0.38586572, -0.58470602, 0.31188390,
-1.68227059, 0.23231185, 0.31535337, -0.26056577, -0.79349169, -0.94405202,
0.24571925, -0.09696371, -0.23873567, -0.04282470, -1.14515572, -0.27451771,
-0.34858889, 0.82800299, -0.95087183, 0.96757912, -0.15727265, 0.18871157,
-0.86204394, 0.38754598, 1.50002723, 1.12436546, 0.61330870, 1.06893060,
-1.41018422, 0.51767624, -0.45544199, -2.51855547, -0.77679863, -1.15285965,
1.63166143, 0.65999935, -0.32582916, 1.56306037, 0.64053237, 0.01575183,
0.46375195, -0.59255240, 0.10008879, -1.84196389, -1.52021625, -0.65748902,
1.37202728, 1.02064967, -0.67488492, -0.60657784, -1.03975969, -0.33201024,
-0.21770026, -0.35978620, -1.27524339, -0.98302583, -0.14502137, 0.54930432,
-0.62277989, 0.30322268, 0.37256666, -0.32351923, 0.29565189, -0.18387578,
-0.19855784, -1.15357907, -0.22684307, -1.45764974, -1.10523354, -0.04629259,
0.36703816, -0.74684309, -1.61969633, 0.58941017, -0.64764459, 0.11335716,
-0.57165179, -0.02908054, -2.99190083, -0.13697042, -0.93464799, -0.09097572,
0.77899241, 0.91366189, -0.36055108, 0.53784267, -2.15995157, 0.58759839,
-2.36184597, -0.77934578, 0.80640923, -0.28747470]
B = [28.833158, 25.579569, 24.135939, 22.743252, 29.847344, 25.390941, 26.578796,
28.889899, 26.165342, 33.802780, 22.116170, 15.447919, 20.142984, 25.902806,
19.445479, 28.119898, 26.801888, 29.305805, 30.587547, 34.293373, 28.956599,
28.371756, 30.963548, 16.572734, 35.695663, 32.681236, 25.234438, 19.401117,
23.782763, 26.520000, 39.802655, 21.715052, 25.242914, 21.716478, 26.979986,
25.078014, 9.517322, 27.996393, 35.096322, 30.132288, 33.942315, 26.993927,
27.792392, 15.718047, 36.352729, 28.949376, 20.445088, 29.874274, 29.586799,
33.060320, 28.655216, 27.505567, 26.661354, 29.419386, 27.377346, 23.985406,
15.868329, 17.621934, 35.456224, 26.697508, 28.179293, 27.151317, 28.227135,
23.882481, 45.793041, 22.712121, 29.222936, 27.619567, 28.854152, 23.744545,
23.856285, 34.919047, 40.032500, 32.566862, 34.253867, 31.959225, 29.008039,
29.965751, 20.319337, 39.284185, 29.676313, 34.686862, 22.103798, 38.521644,
30.967211, 18.150335, 21.622198, 24.717461, 29.424366, 34.169033, 27.881900,
28.577999, 29.547534, 35.179072, 27.350809, 35.940215, 31.848857, 23.747476,
27.135937, 29.275092]
"""
form.add(TextWidget, name = "data", title="Input", rows="25", cols = "90", value = sample)
form.add(SingleSelectWidget, name= "input", title="Input", value = "lists", options=
[ ("lists", "R or Python lists"),
("dataframeh", "dataframe with headers"),
("dataframe", "dataframe without headers")
])
form.add(SingleSelectWidget, name="orientation", title="Orientation", value = "vertical", options=
[("vertical", "vertical"),
("horizontal", "horizontal")])
form.add(CheckboxWidget, name="notched?", title="Notched?",value = True)
form.add(SingleSelectWidget, name= "output", title="Output Graph ", value="boxplot", options=
[("boxplot", "Box plot"),
("violinplot", "Violin plot"),
("vioplot", "Vioplot")
# ("violinbox", "Violin with boxplot"),
# ("viobox", "Vioplot with boxplot")
])
form.add(StringWidget, name = "color", title="color", size = 35, value = "blue")
form.add(StringWidget, name = "main", title="Main Title", size = 35, value = "Box plot")
form.add(StringWidget, name = "sub", title="Sub Title", size = 35, value = "Extreme Computing")
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 | |||
form.get_widget("gY").render(),
form.get_widget("orientation").render(),
form.get_widget("notched?").render(),
form.get_widget("color").render(),
form.get_widget("input").render(),
form.get_widget("output").render(),
form.get_widget("main").render(),
form.get_widget("sub").render(),
form.get_widget("data").render())
"""
Notched?, Main title and subtitle only works for boxplot.
Orientation only works for both box and vioplot.
"""
renderfooter(form, __version__, __catalog__, __author__)
if not form.is_submitted():
return page('Box Violin Plot page', render(), style= BASIC_FORM_CSS)
def process [html] ():
processheader(__title__)
calctime_start = time.time()
# Get the problem parameters
(gX, gY,orientation, notchedQ, color, input, output, main, sub, data) = getFormStrings(form,
[
"gX", "gY", "orientation", "notched?", "color",
"input", "output", "main", "sub",
"data"
])
output=Solve((gX, gY, orientation, notchedQ, color, input, output, main, sub, data))
"
"
printRlines(output)
""showLogo("Rlogo.jpg")
processfooter(form, calctime_start, "./", __url__)
process()
Currently the box|violin|vio plot will only plot one of these types for each list.
The vioplot cannot be drawn for a dataframe and does not accept a main and a sub title.See previous posting on these topics.
Sep. 10: Vioplot can now process dataframes, by rewriting the code to draw the columns. If D is a dataframe with 3 columns for example, the code to draw a vioplot for this set is is vioplot(D[[1]], D[[2]], D[[3]]).
We will remove some of the limitation in a future version.



























