aboutsummaryrefslogtreecommitdiff
path: root/wqflask/utility/Plot.py
diff options
context:
space:
mode:
authorSam Ockman2012-06-22 23:35:30 -0400
committerSam Ockman2012-06-22 23:35:30 -0400
commit5ab5ede79ee823f7fbb70016809c887a78732472 (patch)
treec1a19cc9007b46ad071160f755c9a223fccab904 /wqflask/utility/Plot.py
parent02e022348c5b865d03a446cdd19c7c920bb3c2c5 (diff)
downloadgenenetwork2-5ab5ede79ee823f7fbb70016809c887a78732472.tar.gz
Working my way through getting the review and edit data dynamically generated in Jinja2
Diffstat (limited to 'wqflask/utility/Plot.py')
-rwxr-xr-xwqflask/utility/Plot.py868
1 files changed, 434 insertions, 434 deletions
diff --git a/wqflask/utility/Plot.py b/wqflask/utility/Plot.py
index 04fe85bf..086f3d57 100755
--- a/wqflask/utility/Plot.py
+++ b/wqflask/utility/Plot.py
@@ -487,440 +487,440 @@ def plotSecurity(canvas, text="12345"):
# parameter: data is either object returned by reaper permutation function (called by MarkerRegressionPage.py)
# or the first object returned by direct (pair-scan) permu function (called by DirectPlotPage.py)
-def plotBar(canvas, data, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, offset= (60, 20, 40, 40), zoom = 1):
-
- xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
-
- plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
- plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
- if plotHeight<=0 or plotWidth<=0:
- return
-
- if len(data) < 2:
- return
-
- max_D = max(data)
- min_D = min(data)
- #add by NL 06-20-2011: fix the error: when max_D is infinite, log function in detScale will go wrong
- if max_D == float('inf') or max_D>webqtlConfig.MAXLRS:
- max_D=webqtlConfig.MAXLRS #maximum LRS value
-
- xLow, xTop, stepX = detScale(min_D, max_D)
-
- #reduce data
- step = ceil((xTop-xLow)/50.0)
- j = xLow
- dataXY = []
- Count = []
- while j <= xTop:
- dataXY.append(j)
- Count.append(0)
- j += step
-
- for i, item in enumerate(data):
- if item == float('inf') or item>webqtlConfig.MAXLRS:
- item = webqtlConfig.MAXLRS #maximum LRS value
- j = int((item-xLow)/step)
- Count[j] += 1
-
- yLow, yTop, stepY=detScale(0,max(Count))
-
- #draw data
- xScale = plotWidth/(xTop-xLow)
- yScale = plotHeight/(yTop-yLow)
- barWidth = xScale*step
-
- for i, count in enumerate(Count):
- if count:
- xc = (dataXY[i]-xLow)*xScale+xLeftOffset
- yc =-(count-yLow)*yScale+yTopOffset+plotHeight
- canvas.drawRect(xc+2,yc,xc+barWidth-2,yTopOffset+plotHeight,edgeColor=barColor,fillColor=barColor)
-
- #draw drawing region
- canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
-
- #draw scale
- scaleFont=pid.Font(ttf="cour",size=11,bold=1)
- x=xLow
- for i in range(stepX+1):
- xc=xLeftOffset+(x-xLow)*xScale
- canvas.drawLine(xc,yTopOffset+plotHeight,xc,yTopOffset+plotHeight+5, color=axesColor)
- strX = cformat(d=x, rank=0)
- canvas.drawString(strX,xc-canvas.stringWidth(strX,font=scaleFont)/2,yTopOffset+plotHeight+14,font=scaleFont)
- x+= (xTop - xLow)/stepX
-
- y=yLow
- for i in range(stepY+1):
- yc=yTopOffset+plotHeight-(y-yLow)*yScale
- canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
- strY = "%d" %y
- canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
- y+= (yTop - yLow)/stepY
-
- #draw label
- labelFont=pid.Font(ttf="tahoma",size=17,bold=0)
- if XLabel:
- canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,
- yTopOffset+plotHeight+yBottomOffset-10,font=labelFont,color=labelColor)
-
- if YLabel:
- canvas.drawString(YLabel, 19, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,
- font=labelFont,color=labelColor,angle=90)
-
- labelFont=pid.Font(ttf="verdana",size=16,bold=0)
- if title:
- canvas.drawString(title,xLeftOffset+(plotWidth-canvas.stringWidth(title,font=labelFont))/2.0,
- 20,font=labelFont,color=labelColor)
-
-def plotBarText(canvas, data, label, variance=None, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, sLabel = None, offset= (80, 20, 40, 100), barSpace = 2, zoom = 1):
- xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
- plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
- plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
- if plotHeight<=0 or plotWidth<=0:
- return
-
- NNN = len(data)
- if NNN < 2 or NNN != len(label):
- return
- if variance and len(variance)!=NNN:
- variance = []
-
- Y2 = data[:]
- if variance:
- for i in range(NNN):
- if variance[i]:
- Y2 += [data[i]-variance[i]]
-
- #Y axis
- YLow, YTop, stepY = detScale(min(Y2), max(Y2))
- YScale = plotHeight/(YTop - YLow)
-
- if YLow < 0 and YTop > 0:
- drawZero = 1
- else:
- drawZero = 0
-
- #X axis
- X = range(NNN)
- Xll= 0
- Xur= NNN-1
-
-
- if drawZero:
- YZero = yTopOffset+plotHeight-YScale*(0-YLow)
- canvas.drawLine(xLeftOffset, YZero, xLeftOffset+plotWidth, YZero)
- else:
- YZero = yTopOffset+plotHeight
- #draw data
- spaceWidth = barSpace
- if spaceWidth < 1:
- spaceWidth = 1
- barWidth = int((plotWidth - (NNN-1.0)*spaceWidth)/NNN)
-
- xc= xLeftOffset
- scaleFont=pid.Font(ttf="verdana",size=11,bold=0)
- for i in range(NNN):
- yc = yTopOffset+plotHeight-(data[i]-YLow)*YScale
- canvas.drawRect(xc,YZero,xc+barWidth-1, yc, edgeColor=barColor,fillColor=barColor)
- if variance and variance[i]:
- varlen = variance[i]*YScale
- if yc-varlen < yTopOffset:
- topYd = yTopOffset
- else:
- topYd = yc-varlen
- canvas.drawLine(xc+barWidth/2-2,yc-varlen,xc+barWidth/2+2,yc-varlen,color=pid.red)
- canvas.drawLine(xc+barWidth/2,yc+varlen,xc+barWidth/2,topYd,color=pid.red)
- canvas.drawLine(xc+barWidth/2-2,yc+varlen,xc+barWidth/2+2,yc+varlen,color=pid.red)
- strX = label[i]
- canvas.drawString(strX,xc+barWidth/2.0+2,yTopOffset+plotHeight+2+canvas.stringWidth(strX,font=scaleFont),font=scaleFont,angle=90)
- xc += barWidth + spaceWidth
-
- #draw drawing region
- canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
-
- #draw Y scale
- scaleFont=pid.Font(ttf="cour",size=16,bold=1)
- y=YLow
- for i in range(stepY+1):
- yc=yTopOffset+plotHeight-(y-YLow)*YScale
- canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
- strY = cformat(d=y, rank=0)
- canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
- y+= (YTop - YLow)/stepY
-
- #draw label
- labelFont=pid.Font(ttf="verdana",size=17,bold=0)
- if XLabel:
- canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,yTopOffset+plotHeight+65,font=labelFont,color=labelColor)
-
- if YLabel:
- canvas.drawString(YLabel,xLeftOffset-50, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,font=labelFont,color=labelColor,angle=90)
-
- labelFont=pid.Font(ttf="verdana",size=18,bold=0)
- if title:
- canvas.drawString(title,xLeftOffset,yTopOffset-15,font=labelFont,color=labelColor)
-
- return
-
-def plotXY(canvas, dataX, dataY, rank=0, dataLabel=[], plotColor = pid.black, axesColor=pid.black, labelColor=pid.black, lineSize="thin", lineColor=pid.grey, idFont="arial", idColor=pid.blue, idSize="14", symbolColor=pid.black, symbolType="circle", filled="yes", symbolSize="tiny", XLabel=None, YLabel=None, title=None, fitcurve=None, connectdot=1, displayR=None, loadingPlot = 0, offset= (80, 20, 40, 60), zoom = 1, specialCases=[], showLabel = 1, bufferSpace = 15):
- 'displayR : correlation scatter plot, loadings : loading plot'
-
- dataXRanked, dataYRanked = webqtlUtil.calRank(dataX, dataY, len(dataX))
-
- #get ID font size
- idFontSize = int(idSize)
-
- #If filled is yes, set fill color
- if filled == "yes":
- fillColor = symbolColor
- else:
- fillColor = None
-
- if symbolSize == "large":
- sizeModifier = 7
- fontModifier = 12
- elif symbolSize == "medium":
- sizeModifier = 5
- fontModifier = 8
- elif symbolSize == "small":
- sizeModifier = 3
- fontModifier = 3
- else:
- sizeModifier = 1
- fontModifier = -1
-
- if rank == 0: # Pearson correlation
- bufferSpace = 0
- dataXPrimary = dataX
- dataYPrimary = dataY
- dataXAlt = dataXRanked #Values used just for printing the other corr type to the graph image
- dataYAlt = dataYRanked #Values used just for printing the other corr type to the graph image
- else: # Spearman correlation: Switching Ranked and Unranked X and Y values
- dataXPrimary = dataXRanked
- dataYPrimary = dataYRanked
- dataXAlt = dataX #Values used just for printing the other corr type to the graph image
- dataYAlt = dataY #Values used just for printing the other corr type to the graph image
-
- xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
- plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
- plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
- if plotHeight<=0 or plotWidth<=0:
- return
- if len(dataXPrimary) < 1 or len(dataXPrimary) != len(dataYPrimary) or (dataLabel and len(dataXPrimary) != len(dataLabel)):
- return
-
- max_X=max(dataXPrimary)
- min_X=min(dataXPrimary)
- max_Y=max(dataYPrimary)
- min_Y=min(dataYPrimary)
-
- #for some reason I forgot why I need to do this
- if loadingPlot:
- min_X = min(-0.1,min_X)
- max_X = max(0.1,max_X)
- min_Y = min(-0.1,min_Y)
- max_Y = max(0.1,max_Y)
-
- xLow, xTop, stepX=detScale(min_X,max_X)
- yLow, yTop, stepY=detScale(min_Y,max_Y)
- xScale = plotWidth/(xTop-xLow)
- yScale = plotHeight/(yTop-yLow)
-
- #draw drawing region
- canvas.drawRect(xLeftOffset-bufferSpace, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight+bufferSpace)
- canvas.drawRect(xLeftOffset-bufferSpace+1, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight+bufferSpace-1)
-
- #calculate data points
- data = map(lambda X, Y: (X, Y), dataXPrimary, dataYPrimary)
- xCoord = map(lambda X, Y: ((X-xLow)*xScale + xLeftOffset, yTopOffset+plotHeight-(Y-yLow)*yScale), dataXPrimary, dataYPrimary)
-
- labelFont=pid.Font(ttf=idFont,size=idFontSize,bold=0)
-
- if loadingPlot:
- xZero = -xLow*xScale+xLeftOffset
- yZero = yTopOffset+plotHeight+yLow*yScale
- for point in xCoord:
- canvas.drawLine(xZero,yZero,point[0],point[1],color=pid.red)
- else:
- if connectdot:
- canvas.drawPolygon(xCoord,edgeColor=plotColor,closed=0)
- else:
- pass
-
- symbolFont = pid.Font(ttf="fnt_bs", size=12+fontModifier,bold=0)
-
- for i, item in enumerate(xCoord):
- if dataLabel and dataLabel[i] in specialCases:
- canvas.drawRect(item[0]-3, item[1]-3, item[0]+3, item[1]+3, edgeColor=pid.green)
- #canvas.drawCross(item[0],item[1],color=pid.blue,size=5)
- else:
- if symbolType == "vertRect":
- canvas.drawRect(x1=item[0]-sizeModifier+2,y1=item[1]-sizeModifier-2, x2=item[0]+sizeModifier-1,y2=item[1]+sizeModifier+2, edgeColor=symbolColor, edgeWidth=1, fillColor=fillColor)
- elif (symbolType == "circle" and filled != "yes"):
- canvas.drawString(":", item[0]-canvas.stringWidth(":",font=symbolFont)/2+1,item[1]+2,color=symbolColor, font=symbolFont)
- elif (symbolType == "circle" and filled == "yes"):
- canvas.drawString("5", item[0]-canvas.stringWidth("5",font=symbolFont)/2+1,item[1]+2,color=symbolColor, font=symbolFont)
- elif symbolType == "horiRect":
- canvas.drawRect(x1=item[0]-sizeModifier-1,y1=item[1]-sizeModifier+3, x2=item[0]+sizeModifier+3,y2=item[1]+sizeModifier-2, edgeColor=symbolColor, edgeWidth=1, fillColor=fillColor)
- elif (symbolType == "square"):
- canvas.drawRect(x1=item[0]-sizeModifier+1,y1=item[1]-sizeModifier-4, x2=item[0]+sizeModifier+2,y2=item[1]+sizeModifier-3, edgeColor=symbolColor, edgeWidth=1, fillColor=fillColor)
- elif (symbolType == "diamond" and filled != "yes"):
- canvas.drawString(",", item[0]-canvas.stringWidth(",",font=symbolFont)/2+2, item[1]+6, font=symbolFont, color=symbolColor)
- elif (symbolType == "diamond" and filled == "yes"):
- canvas.drawString("D", item[0]-canvas.stringWidth("D",font=symbolFont)/2+2, item[1]+6, font=symbolFont, color=symbolColor)
- elif symbolType == "4-star":
- canvas.drawString("l", item[0]-canvas.stringWidth("l",font=symbolFont)/2+1, item[1]+3, font=symbolFont, color=symbolColor)
- elif symbolType == "3-star":
- canvas.drawString("k", item[0]-canvas.stringWidth("k",font=symbolFont)/2+1, item[1]+3, font=symbolFont, color=symbolColor)
- else:
- canvas.drawCross(item[0],item[1]-2,color=symbolColor, size=sizeModifier+2)
-
- if showLabel and dataLabel:
- if (symbolType == "vertRect" or symbolType == "diamond"):
- labelGap = 15
- elif (symbolType == "4-star" or symbolType == "3-star"):
- labelGap = 12
- else:
- labelGap = 11
- canvas.drawString(dataLabel[i], item[0]- canvas.stringWidth(dataLabel[i],
- font=labelFont)/2 + 1, item[1]+(labelGap+sizeModifier+(idFontSize-12)), font=labelFont, color=idColor)
-
- #draw scale
- scaleFont=pid.Font(ttf="cour",size=16,bold=1)
-
-
- x=xLow
- for i in range(stepX+1):
- xc=xLeftOffset+(x-xLow)*xScale
- if ((x == 0) & (rank == 1)):
- pass
- else:
- canvas.drawLine(xc,yTopOffset+plotHeight + bufferSpace,xc,yTopOffset+plotHeight+5 + bufferSpace, color=axesColor)
- strX = cformat(d=x, rank=rank)
- if ((strX == "0") & (rank == 1)):
- pass
- else:
- canvas.drawString(strX,xc-canvas.stringWidth(strX,font=scaleFont)/2,yTopOffset+plotHeight+20 + bufferSpace,font=scaleFont)
- x+= (xTop - xLow)/stepX
-
- y=yLow
- for i in range(stepY+1):
- yc=yTopOffset+plotHeight-(y-yLow)*yScale
- if ((y == 0) & (rank == 1)):
- pass
- else:
- canvas.drawLine(xLeftOffset - bufferSpace,yc,xLeftOffset-5 - bufferSpace,yc, color=axesColor)
- strY = cformat(d=y, rank=rank)
- if ((strY == "0") & (rank == 1)):
- pass
- else:
- canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)- 10 - bufferSpace,yc+4,font=scaleFont)
- y+= (yTop - yLow)/stepY
-
- #draw label
-
- labelFont=pid.Font(ttf="verdana",size=canvas.size[0]/45,bold=0)
- titleFont=pid.Font(ttf="verdana",size=canvas.size[0]/40,bold=0)
-
- if (rank == 1 and not title):
- canvas.drawString("Spearman Rank Correlation", xLeftOffset-canvas.size[0]*.025+(plotWidth-canvas.stringWidth("Spearman Rank Correlation",font=titleFont))/2.0,
- 25,font=titleFont,color=labelColor)
- elif (rank == 0 and not title):
- canvas.drawString("Pearson Correlation", xLeftOffset-canvas.size[0]*.025+(plotWidth-canvas.stringWidth("Pearson Correlation",font=titleFont))/2.0,
- 25,font=titleFont,color=labelColor)
-
- if XLabel:
- canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,
- yTopOffset+plotHeight+yBottomOffset-25,font=labelFont,color=labelColor)
-
- if YLabel:
- canvas.drawString(YLabel, xLeftOffset-65, yTopOffset+plotHeight- (plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,
- font=labelFont,color=labelColor,angle=90)
-
- labelFont=pid.Font(ttf="verdana",size=20,bold=0)
- if title:
- canvas.drawString(title,xLeftOffset+(plotWidth-canvas.stringWidth(title,font=labelFont))/2.0,
- 20,font=labelFont,color=labelColor)
-
- if fitcurve:
- import sys
- sys.argv = [ "mod_python" ]
- #from numarray import linear_algebra as la
- #from numarray import ones, array, dot, swapaxes
- fitYY = array(dataYPrimary)
- fitXX = array([ones(len(dataXPrimary)),dataXPrimary])
- AA = dot(fitXX,swapaxes(fitXX,0,1))
- BB = dot(fitXX,fitYY)
- bb = la.linear_least_squares(AA,BB)[0]
-
- xc1 = xLeftOffset
- yc1 = yTopOffset+plotHeight-(bb[0]+bb[1]*xLow-yLow)*yScale
- if yc1 > yTopOffset+plotHeight:
- yc1 = yTopOffset+plotHeight
- xc1 = (yLow-bb[0])/bb[1]
- xc1=(xc1-xLow)*xScale+xLeftOffset
- elif yc1 < yTopOffset:
- yc1 = yTopOffset
- xc1 = (yTop-bb[0])/bb[1]
- xc1=(xc1-xLow)*xScale+xLeftOffset
- else:
- pass
-
- xc2 = xLeftOffset + plotWidth
- yc2 = yTopOffset+plotHeight-(bb[0]+bb[1]*xTop-yLow)*yScale
- if yc2 > yTopOffset+plotHeight:
- yc2 = yTopOffset+plotHeight
- xc2 = (yLow-bb[0])/bb[1]
- xc2=(xc2-xLow)*xScale+xLeftOffset
- elif yc2 < yTopOffset:
- yc2 = yTopOffset
- xc2 = (yTop-bb[0])/bb[1]
- xc2=(xc2-xLow)*xScale+xLeftOffset
- else:
- pass
-
- canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace,xc2,yc2,color=lineColor)
- if lineSize == "medium":
- canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace+1,xc2,yc2+1,color=lineColor)
- if lineSize == "thick":
- canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace+1,xc2,yc2+1,color=lineColor)
- canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace-1,xc2,yc2-1,color=lineColor)
-
-
- if displayR:
- labelFont=pid.Font(ttf="trebuc",size=canvas.size[0]/60,bold=0)
- NNN = len(dataX)
- corr = webqtlUtil.calCorrelation(dataXPrimary,dataYPrimary,NNN)[0]
-
- if NNN < 3:
- corrPValue = 1.0
- else:
- if abs(corr) >= 1.0:
- corrPValue = 0.0
- else:
- ZValue = 0.5*log((1.0+corr)/(1.0-corr))
- ZValue = ZValue*sqrt(NNN-3)
- corrPValue = 2.0*(1.0 - reaper.normp(abs(ZValue)))
-
- NStr = "N = %d" % NNN
- strLenN = canvas.stringWidth(NStr,font=labelFont)
-
- if rank == 1:
- if corrPValue < 0.0000000000000001:
- corrStr = "Rho = %1.3f P < 1.00 E-16" % (corr)
- else:
- corrStr = "Rho = %1.3f P = %3.2E" % (corr, corrPValue)
- else:
- if corrPValue < 0.0000000000000001:
- corrStr = "r = %1.3f P < 1.00 E-16" % (corr)
- else:
- corrStr = "r = %1.3f P = %3.2E" % (corr, corrPValue)
- strLen = canvas.stringWidth(corrStr,font=labelFont)
-
- canvas.drawString(NStr,xLeftOffset,yTopOffset-10,font=labelFont,color=labelColor)
- canvas.drawString(corrStr,xLeftOffset+plotWidth-strLen,yTopOffset-10,font=labelFont,color=labelColor)
-
- return xCoord
+#def plotBar(canvas, data, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, offset= (60, 20, 40, 40), zoom = 1):
+#
+# xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
+#
+# plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
+# plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
+# if plotHeight<=0 or plotWidth<=0:
+# return
+#
+# if len(data) < 2:
+# return
+#
+# max_D = max(data)
+# min_D = min(data)
+# #add by NL 06-20-2011: fix the error: when max_D is infinite, log function in detScale will go wrong
+# if max_D == float('inf') or max_D>webqtlConfig.MAXLRS:
+# max_D=webqtlConfig.MAXLRS #maximum LRS value
+#
+# xLow, xTop, stepX = detScale(min_D, max_D)
+#
+# #reduce data
+# step = ceil((xTop-xLow)/50.0)
+# j = xLow
+# dataXY = []
+# Count = []
+# while j <= xTop:
+# dataXY.append(j)
+# Count.append(0)
+# j += step
+#
+# for i, item in enumerate(data):
+# if item == float('inf') or item>webqtlConfig.MAXLRS:
+# item = webqtlConfig.MAXLRS #maximum LRS value
+# j = int((item-xLow)/step)
+# Count[j] += 1
+#
+# yLow, yTop, stepY=detScale(0,max(Count))
+#
+# #draw data
+# xScale = plotWidth/(xTop-xLow)
+# yScale = plotHeight/(yTop-yLow)
+# barWidth = xScale*step
+#
+# for i, count in enumerate(Count):
+# if count:
+# xc = (dataXY[i]-xLow)*xScale+xLeftOffset
+# yc =-(count-yLow)*yScale+yTopOffset+plotHeight
+# canvas.drawRect(xc+2,yc,xc+barWidth-2,yTopOffset+plotHeight,edgeColor=barColor,fillColor=barColor)
+#
+# #draw drawing region
+# canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
+#
+# #draw scale
+# scaleFont=pid.Font(ttf="cour",size=11,bold=1)
+# x=xLow
+# for i in range(stepX+1):
+# xc=xLeftOffset+(x-xLow)*xScale
+# canvas.drawLine(xc,yTopOffset+plotHeight,xc,yTopOffset+plotHeight+5, color=axesColor)
+# strX = cformat(d=x, rank=0)
+# canvas.drawString(strX,xc-canvas.stringWidth(strX,font=scaleFont)/2,yTopOffset+plotHeight+14,font=scaleFont)
+# x+= (xTop - xLow)/stepX
+#
+# y=yLow
+# for i in range(stepY+1):
+# yc=yTopOffset+plotHeight-(y-yLow)*yScale
+# canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
+# strY = "%d" %y
+# canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
+# y+= (yTop - yLow)/stepY
+#
+# #draw label
+# labelFont=pid.Font(ttf="tahoma",size=17,bold=0)
+# if XLabel:
+# canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,
+# yTopOffset+plotHeight+yBottomOffset-10,font=labelFont,color=labelColor)
+#
+# if YLabel:
+# canvas.drawString(YLabel, 19, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,
+# font=labelFont,color=labelColor,angle=90)
+#
+# labelFont=pid.Font(ttf="verdana",size=16,bold=0)
+# if title:
+# canvas.drawString(title,xLeftOffset+(plotWidth-canvas.stringWidth(title,font=labelFont))/2.0,
+# 20,font=labelFont,color=labelColor)
+#
+#def plotBarText(canvas, data, label, variance=None, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, sLabel = None, offset= (80, 20, 40, 100), barSpace = 2, zoom = 1):
+# xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
+# plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
+# plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
+# if plotHeight<=0 or plotWidth<=0:
+# return
+#
+# NNN = len(data)
+# if NNN < 2 or NNN != len(label):
+# return
+# if variance and len(variance)!=NNN:
+# variance = []
+#
+# Y2 = data[:]
+# if variance:
+# for i in range(NNN):
+# if variance[i]:
+# Y2 += [data[i]-variance[i]]
+#
+# #Y axis
+# YLow, YTop, stepY = detScale(min(Y2), max(Y2))
+# YScale = plotHeight/(YTop - YLow)
+#
+# if YLow < 0 and YTop > 0:
+# drawZero = 1
+# else:
+# drawZero = 0
+#
+# #X axis
+# X = range(NNN)
+# Xll= 0
+# Xur= NNN-1
+#
+#
+# if drawZero:
+# YZero = yTopOffset+plotHeight-YScale*(0-YLow)
+# canvas.drawLine(xLeftOffset, YZero, xLeftOffset+plotWidth, YZero)
+# else:
+# YZero = yTopOffset+plotHeight
+# #draw data
+# spaceWidth = barSpace
+# if spaceWidth < 1:
+# spaceWidth = 1
+# barWidth = int((plotWidth - (NNN-1.0)*spaceWidth)/NNN)
+#
+# xc= xLeftOffset
+# scaleFont=pid.Font(ttf="verdana",size=11,bold=0)
+# for i in range(NNN):
+# yc = yTopOffset+plotHeight-(data[i]-YLow)*YScale
+# canvas.drawRect(xc,YZero,xc+barWidth-1, yc, edgeColor=barColor,fillColor=barColor)
+# if variance and variance[i]:
+# varlen = variance[i]*YScale
+# if yc-varlen < yTopOffset:
+# topYd = yTopOffset
+# else:
+# topYd = yc-varlen
+# canvas.drawLine(xc+barWidth/2-2,yc-varlen,xc+barWidth/2+2,yc-varlen,color=pid.red)
+# canvas.drawLine(xc+barWidth/2,yc+varlen,xc+barWidth/2,topYd,color=pid.red)
+# canvas.drawLine(xc+barWidth/2-2,yc+varlen,xc+barWidth/2+2,yc+varlen,color=pid.red)
+# strX = label[i]
+# canvas.drawString(strX,xc+barWidth/2.0+2,yTopOffset+plotHeight+2+canvas.stringWidth(strX,font=scaleFont),font=scaleFont,angle=90)
+# xc += barWidth + spaceWidth
+#
+# #draw drawing region
+# canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
+#
+# #draw Y scale
+# scaleFont=pid.Font(ttf="cour",size=16,bold=1)
+# y=YLow
+# for i in range(stepY+1):
+# yc=yTopOffset+plotHeight-(y-YLow)*YScale
+# canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
+# strY = cformat(d=y, rank=0)
+# canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
+# y+= (YTop - YLow)/stepY
+#
+# #draw label
+# labelFont=pid.Font(ttf="verdana",size=17,bold=0)
+# if XLabel:
+# canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,yTopOffset+plotHeight+65,font=labelFont,color=labelColor)
+#
+# if YLabel:
+# canvas.drawString(YLabel,xLeftOffset-50, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,font=labelFont,color=labelColor,angle=90)
+#
+# labelFont=pid.Font(ttf="verdana",size=18,bold=0)
+# if title:
+# canvas.drawString(title,xLeftOffset,yTopOffset-15,font=labelFont,color=labelColor)
+#
+# return
+#
+#def plotXY(canvas, dataX, dataY, rank=0, dataLabel=[], plotColor = pid.black, axesColor=pid.black, labelColor=pid.black, lineSize="thin", lineColor=pid.grey, idFont="arial", idColor=pid.blue, idSize="14", symbolColor=pid.black, symbolType="circle", filled="yes", symbolSize="tiny", XLabel=None, YLabel=None, title=None, fitcurve=None, connectdot=1, displayR=None, loadingPlot = 0, offset= (80, 20, 40, 60), zoom = 1, specialCases=[], showLabel = 1, bufferSpace = 15):
+# 'displayR : correlation scatter plot, loadings : loading plot'
+#
+# dataXRanked, dataYRanked = webqtlUtil.calRank(dataX, dataY, len(dataX))
+#
+# #get ID font size
+# idFontSize = int(idSize)
+#
+# #If filled is yes, set fill color
+# if filled == "yes":
+# fillColor = symbolColor
+# else:
+# fillColor = None
+#
+# if symbolSize == "large":
+# sizeModifier = 7
+# fontModifier = 12
+# elif symbolSize == "medium":
+# sizeModifier = 5
+# fontModifier = 8
+# elif symbolSize == "small":
+# sizeModifier = 3
+# fontModifier = 3
+# else:
+# sizeModifier = 1
+# fontModifier = -1
+#
+# if rank == 0: # Pearson correlation
+# bufferSpace = 0
+# dataXPrimary = dataX
+# dataYPrimary = dataY
+# dataXAlt = dataXRanked #Values used just for printing the other corr type to the graph image
+# dataYAlt = dataYRanked #Values used just for printing the other corr type to the graph image
+# else: # Spearman correlation: Switching Ranked and Unranked X and Y values
+# dataXPrimary = dataXRanked
+# dataYPrimary = dataYRanked
+# dataXAlt = dataX #Values used just for printing the other corr type to the graph image
+# dataYAlt = dataY #Values used just for printing the other corr type to the graph image
+#
+# xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
+# plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
+# plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
+# if plotHeight<=0 or plotWidth<=0:
+# return
+# if len(dataXPrimary) < 1 or len(dataXPrimary) != len(dataYPrimary) or (dataLabel and len(dataXPrimary) != len(dataLabel)):
+# return
+#
+# max_X=max(dataXPrimary)
+# min_X=min(dataXPrimary)
+# max_Y=max(dataYPrimary)
+# min_Y=min(dataYPrimary)
+#
+# #for some reason I forgot why I need to do this
+# if loadingPlot:
+# min_X = min(-0.1,min_X)
+# max_X = max(0.1,max_X)
+# min_Y = min(-0.1,min_Y)
+# max_Y = max(0.1,max_Y)
+#
+# xLow, xTop, stepX=detScale(min_X,max_X)
+# yLow, yTop, stepY=detScale(min_Y,max_Y)
+# xScale = plotWidth/(xTop-xLow)
+# yScale = plotHeight/(yTop-yLow)
+#
+# #draw drawing region
+# canvas.drawRect(xLeftOffset-bufferSpace, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight+bufferSpace)
+# canvas.drawRect(xLeftOffset-bufferSpace+1, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight+bufferSpace-1)
+#
+# #calculate data points
+# data = map(lambda X, Y: (X, Y), dataXPrimary, dataYPrimary)
+# xCoord = map(lambda X, Y: ((X-xLow)*xScale + xLeftOffset, yTopOffset+plotHeight-(Y-yLow)*yScale), dataXPrimary, dataYPrimary)
+#
+# labelFont=pid.Font(ttf=idFont,size=idFontSize,bold=0)
+#
+# if loadingPlot:
+# xZero = -xLow*xScale+xLeftOffset
+# yZero = yTopOffset+plotHeight+yLow*yScale
+# for point in xCoord:
+# canvas.drawLine(xZero,yZero,point[0],point[1],color=pid.red)
+# else:
+# if connectdot:
+# canvas.drawPolygon(xCoord,edgeColor=plotColor,closed=0)
+# else:
+# pass
+#
+# symbolFont = pid.Font(ttf="fnt_bs", size=12+fontModifier,bold=0)
+#
+# for i, item in enumerate(xCoord):
+# if dataLabel and dataLabel[i] in specialCases:
+# canvas.drawRect(item[0]-3, item[1]-3, item[0]+3, item[1]+3, edgeColor=pid.green)
+# #canvas.drawCross(item[0],item[1],color=pid.blue,size=5)
+# else:
+# if symbolType == "vertRect":
+# canvas.drawRect(x1=item[0]-sizeModifier+2,y1=item[1]-sizeModifier-2, x2=item[0]+sizeModifier-1,y2=item[1]+sizeModifier+2, edgeColor=symbolColor, edgeWidth=1, fillColor=fillColor)
+# elif (symbolType == "circle" and filled != "yes"):
+# canvas.drawString(":", item[0]-canvas.stringWidth(":",font=symbolFont)/2+1,item[1]+2,color=symbolColor, font=symbolFont)
+# elif (symbolType == "circle" and filled == "yes"):
+# canvas.drawString("5", item[0]-canvas.stringWidth("5",font=symbolFont)/2+1,item[1]+2,color=symbolColor, font=symbolFont)
+# elif symbolType == "horiRect":
+# canvas.drawRect(x1=item[0]-sizeModifier-1,y1=item[1]-sizeModifier+3, x2=item[0]+sizeModifier+3,y2=item[1]+sizeModifier-2, edgeColor=symbolColor, edgeWidth=1, fillColor=fillColor)
+# elif (symbolType == "square"):
+# canvas.drawRect(x1=item[0]-sizeModifier+1,y1=item[1]-sizeModifier-4, x2=item[0]+sizeModifier+2,y2=item[1]+sizeModifier-3, edgeColor=symbolColor, edgeWidth=1, fillColor=fillColor)
+# elif (symbolType == "diamond" and filled != "yes"):
+# canvas.drawString(",", item[0]-canvas.stringWidth(",",font=symbolFont)/2+2, item[1]+6, font=symbolFont, color=symbolColor)
+# elif (symbolType == "diamond" and filled == "yes"):
+# canvas.drawString("D", item[0]-canvas.stringWidth("D",font=symbolFont)/2+2, item[1]+6, font=symbolFont, color=symbolColor)
+# elif symbolType == "4-star":
+# canvas.drawString("l", item[0]-canvas.stringWidth("l",font=symbolFont)/2+1, item[1]+3, font=symbolFont, color=symbolColor)
+# elif symbolType == "3-star":
+# canvas.drawString("k", item[0]-canvas.stringWidth("k",font=symbolFont)/2+1, item[1]+3, font=symbolFont, color=symbolColor)
+# else:
+# canvas.drawCross(item[0],item[1]-2,color=symbolColor, size=sizeModifier+2)
+#
+# if showLabel and dataLabel:
+# if (symbolType == "vertRect" or symbolType == "diamond"):
+# labelGap = 15
+# elif (symbolType == "4-star" or symbolType == "3-star"):
+# labelGap = 12
+# else:
+# labelGap = 11
+# canvas.drawString(dataLabel[i], item[0]- canvas.stringWidth(dataLabel[i],
+# font=labelFont)/2 + 1, item[1]+(labelGap+sizeModifier+(idFontSize-12)), font=labelFont, color=idColor)
+#
+# #draw scale
+# scaleFont=pid.Font(ttf="cour",size=16,bold=1)
+#
+#
+# x=xLow
+# for i in range(stepX+1):
+# xc=xLeftOffset+(x-xLow)*xScale
+# if ((x == 0) & (rank == 1)):
+# pass
+# else:
+# canvas.drawLine(xc,yTopOffset+plotHeight + bufferSpace,xc,yTopOffset+plotHeight+5 + bufferSpace, color=axesColor)
+# strX = cformat(d=x, rank=rank)
+# if ((strX == "0") & (rank == 1)):
+# pass
+# else:
+# canvas.drawString(strX,xc-canvas.stringWidth(strX,font=scaleFont)/2,yTopOffset+plotHeight+20 + bufferSpace,font=scaleFont)
+# x+= (xTop - xLow)/stepX
+#
+# y=yLow
+# for i in range(stepY+1):
+# yc=yTopOffset+plotHeight-(y-yLow)*yScale
+# if ((y == 0) & (rank == 1)):
+# pass
+# else:
+# canvas.drawLine(xLeftOffset - bufferSpace,yc,xLeftOffset-5 - bufferSpace,yc, color=axesColor)
+# strY = cformat(d=y, rank=rank)
+# if ((strY == "0") & (rank == 1)):
+# pass
+# else:
+# canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)- 10 - bufferSpace,yc+4,font=scaleFont)
+# y+= (yTop - yLow)/stepY
+#
+# #draw label
+#
+# labelFont=pid.Font(ttf="verdana",size=canvas.size[0]/45,bold=0)
+# titleFont=pid.Font(ttf="verdana",size=canvas.size[0]/40,bold=0)
+#
+# if (rank == 1 and not title):
+# canvas.drawString("Spearman Rank Correlation", xLeftOffset-canvas.size[0]*.025+(plotWidth-canvas.stringWidth("Spearman Rank Correlation",font=titleFont))/2.0,
+# 25,font=titleFont,color=labelColor)
+# elif (rank == 0 and not title):
+# canvas.drawString("Pearson Correlation", xLeftOffset-canvas.size[0]*.025+(plotWidth-canvas.stringWidth("Pearson Correlation",font=titleFont))/2.0,
+# 25,font=titleFont,color=labelColor)
+#
+# if XLabel:
+# canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,
+# yTopOffset+plotHeight+yBottomOffset-25,font=labelFont,color=labelColor)
+#
+# if YLabel:
+# canvas.drawString(YLabel, xLeftOffset-65, yTopOffset+plotHeight- (plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,
+# font=labelFont,color=labelColor,angle=90)
+#
+# labelFont=pid.Font(ttf="verdana",size=20,bold=0)
+# if title:
+# canvas.drawString(title,xLeftOffset+(plotWidth-canvas.stringWidth(title,font=labelFont))/2.0,
+# 20,font=labelFont,color=labelColor)
+#
+# if fitcurve:
+# import sys
+# sys.argv = [ "mod_python" ]
+# #from numarray import linear_algebra as la
+# #from numarray import ones, array, dot, swapaxes
+# fitYY = array(dataYPrimary)
+# fitXX = array([ones(len(dataXPrimary)),dataXPrimary])
+# AA = dot(fitXX,swapaxes(fitXX,0,1))
+# BB = dot(fitXX,fitYY)
+# bb = la.linear_least_squares(AA,BB)[0]
+#
+# xc1 = xLeftOffset
+# yc1 = yTopOffset+plotHeight-(bb[0]+bb[1]*xLow-yLow)*yScale
+# if yc1 > yTopOffset+plotHeight:
+# yc1 = yTopOffset+plotHeight
+# xc1 = (yLow-bb[0])/bb[1]
+# xc1=(xc1-xLow)*xScale+xLeftOffset
+# elif yc1 < yTopOffset:
+# yc1 = yTopOffset
+# xc1 = (yTop-bb[0])/bb[1]
+# xc1=(xc1-xLow)*xScale+xLeftOffset
+# else:
+# pass
+#
+# xc2 = xLeftOffset + plotWidth
+# yc2 = yTopOffset+plotHeight-(bb[0]+bb[1]*xTop-yLow)*yScale
+# if yc2 > yTopOffset+plotHeight:
+# yc2 = yTopOffset+plotHeight
+# xc2 = (yLow-bb[0])/bb[1]
+# xc2=(xc2-xLow)*xScale+xLeftOffset
+# elif yc2 < yTopOffset:
+# yc2 = yTopOffset
+# xc2 = (yTop-bb[0])/bb[1]
+# xc2=(xc2-xLow)*xScale+xLeftOffset
+# else:
+# pass
+#
+# canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace,xc2,yc2,color=lineColor)
+# if lineSize == "medium":
+# canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace+1,xc2,yc2+1,color=lineColor)
+# if lineSize == "thick":
+# canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace+1,xc2,yc2+1,color=lineColor)
+# canvas.drawLine(xc1 - bufferSpace,yc1 + bufferSpace-1,xc2,yc2-1,color=lineColor)
+#
+#
+# if displayR:
+# labelFont=pid.Font(ttf="trebuc",size=canvas.size[0]/60,bold=0)
+# NNN = len(dataX)
+# corr = webqtlUtil.calCorrelation(dataXPrimary,dataYPrimary,NNN)[0]
+#
+# if NNN < 3:
+# corrPValue = 1.0
+# else:
+# if abs(corr) >= 1.0:
+# corrPValue = 0.0
+# else:
+# ZValue = 0.5*log((1.0+corr)/(1.0-corr))
+# ZValue = ZValue*sqrt(NNN-3)
+# corrPValue = 2.0*(1.0 - reaper.normp(abs(ZValue)))
+#
+# NStr = "N = %d" % NNN
+# strLenN = canvas.stringWidth(NStr,font=labelFont)
+#
+# if rank == 1:
+# if corrPValue < 0.0000000000000001:
+# corrStr = "Rho = %1.3f P < 1.00 E-16" % (corr)
+# else:
+# corrStr = "Rho = %1.3f P = %3.2E" % (corr, corrPValue)
+# else:
+# if corrPValue < 0.0000000000000001:
+# corrStr = "r = %1.3f P < 1.00 E-16" % (corr)
+# else:
+# corrStr = "r = %1.3f P = %3.2E" % (corr, corrPValue)
+# strLen = canvas.stringWidth(corrStr,font=labelFont)
+#
+# canvas.drawString(NStr,xLeftOffset,yTopOffset-10,font=labelFont,color=labelColor)
+# canvas.drawString(corrStr,xLeftOffset+plotWidth-strLen,yTopOffset-10,font=labelFont,color=labelColor)
+#
+# return xCoord
def plotXYSVG(drawSpace, dataX, dataY, rank=0, dataLabel=[], plotColor = "black", axesColor="black", labelColor="black", symbolColor="red", XLabel=None, YLabel=None, title=None, fitcurve=None, connectdot=1, displayR=None, loadingPlot = 0, offset= (80, 20, 40, 60), zoom = 1, specialCases=[], showLabel = 1):
'displayR : correlation scatter plot, loadings : loading plot'