Package parasol :: Module Plots
[hide private]
[frames] | no frames]

Source Code for Module parasol.Plots

   1  import matplotlib 
   2  #matplotlib.use('TKAgg')   # usually the right thing to do 
   3   
   4  import sys, os 
   5  from pylab import * 
   6  import time 
   7  #import Image, ImageDraw, ImageFont 
   8  import csv 
   9  import traceback 
  10  from Plots_Cache import Plots_Cache 
  11  from cast import floatDammit, intDammit 
  12  from CarpetPlot import Carpet 
  13   
  14  __author__ = "Charlie Taylor (charlietaylor@sourceforge.net)" 
  15  __version__ = "1.0 " 
  16  __date__ = "Jan 1, 2009" 
  17  __copyright__ = "Copyright (c) 2009 Charlie Taylor" 
  18  __license__ = "BSD" 
  19   
  20  __Plots_Cache = None # holds cached results for speeding up Plots 
  21   
  22  __plotNumber = 0 
  23   
24 -def putPlotInPPT( PS, filename, title):
25 print 'saving Plot to',os.path.split(PS.pptDocName)[-1] 26 try: 27 PS.pptDoc.addImageSlide( imgFile=filename, title=title.replace('\n','\r')) 28 except: 29 print "ERROR... FAILED to put plot in PowerPoint file" 30 print traceback.print_exc()
31
32 -def putPlotInWord( PS, filename, *omitList):
33 print 'saving Plot to',os.path.split(PS.wordDocName)[-1] 34 tableStr = [(' ',),(' ',)] 35 wordTable1 = PS.wordDoc.addTable( tableStr, Range=PS.wordDoc.selectCharacter(-2) ) 36 wordTable1.Style = PS.tblstyl 37 PS.wordDoc.addImage(filename, Range=wordTable1.Cell(1,1).Range, 38 fracPage=PS.wordDocImagefracPage ) 39 PS.wordDoc.setCellStyle( wordTable1, 1, 1, just='c') 40 PS.wordDoc.setCellStyle( wordTable1, 2, 1, text= PS.getDesVarSummary(*omitList) + PS.getResultVarSummary() ) 41 42 PS.wordDoc.selectCharacter(-1) 43 PS.wordDoc.addText(' ')
44 45 46 47 _sigFontSize = 8 48 49 # signAndDatePlot IS NO LONGER USED... now use f.text for figure() in matplotlib
50 -def signAndDatePlot(PS, filename):
51 im = Image.open( filename ) 52 width, height = im.size 53 draw = ImageDraw.Draw(im) 54 55 # make font 56 if width<600: 57 arial = ImageFont.truetype ( "Arial.ttf", 10 ) 58 else: 59 arial = ImageFont.truetype ( "Arial.ttf", 12 ) 60 61 s = PS.author + ' ' + time.strftime('%m/%d/%Y)') 62 wLab,hLab = arial.getsize(s) 63 w = width - wLab - 6 64 h = height - hLab - 6 65 draw.text( (w,h), s, fill="black", font=arial) 66 67 s = "ParaSol v" + PS.getVersion() 68 wLab,hLab = arial.getsize(s) 69 w = 6 70 h = height - hLab - 6 71 draw.text( (w,h), s, fill="black", font=arial) 72 73 im.save( filename )
74 75
76 -def makeSensitivityPlot(PS, 77 figureOfMerit="sysMass", desVars=["PHe","Pc","MR"], 78 makeHTML=1, dpi=70, linewidth=2, extraFOM=None, omitViolPts=0):
79 global __plotNumber, __Plots_Cache 80 __plotNumber += 1 81 82 if __Plots_Cache==None: 83 __Plots_Cache = Plots_Cache(PS) 84 85 try: 86 _makeSensitivityPlot(PS, 87 figureOfMerit=figureOfMerit, desVars=desVars, 88 makeHTML=makeHTML, dpi=dpi, linewidth=linewidth, extraFOM=extraFOM, 89 omitViolPts=omitViolPts) 90 except: 91 print ' >>> ERROR... could not create SensitivityPlot' 92 print traceback.print_exc()
93 94 ''' 95 subplots_adjust(*args, **kwargs) 96 subplots_adjust(left=None, right=None, bottom=None, top=None, wspace=0.2, hspace=0.2) 97 98 Tune the subplot layout via the figure.SubplotParams mechanism. 99 The parameter meanings (and suggested defaults) are 100 101 left = 0.125 # the left side of the subplots of the figure 102 right = 0.9 # the right side of the subplots of the figure 103 bottom = 0.1 # the bottom of the subplots of the figure 104 top = 0.9 # the top of the subplots of the figure 105 wspace = 0.2 # the amount of width reserved for blank space between subplots 106 hspace = 0.2 # the amount of height reserved for white space between subplots 107 108 The actual defaults are controlled by the rc file 109 '''
110 -def _makeSensitivityPlot(PS, 111 figureOfMerit="sysMass", desVars=["PHe","Pc","MR"], 112 makeHTML=1, dpi=70, linewidth=2, extraFOM=None, omitViolPts=1):
113 '''looks like minitab trend analysis''' 114 115 __Plots_Cache.saveParasolState() 116 117 L = len( desVars ) 118 wspace = 0.2 119 hspace = 0.2 120 if L==1: 121 nrows=1; ncols=1; 122 elif L==2: 123 nrows=2; ncols=1; 124 elif L<=4: 125 nrows=2; ncols=2; 126 wspace = 0.4 127 elif L<=6: 128 nrows=2; ncols=3; 129 wspace = 0.5 130 elif L<=9: 131 nrows=3; ncols=3; 132 wspace = 0.5 133 hspace = 0.4 134 elif L<=12: 135 nrows=3; ncols=4; 136 wspace = 0.5 137 hspace = 0.4 138 elif L<=16: 139 nrows=4; ncols=4; 140 wspace = 0.5 141 hspace = 0.4 142 else : 143 nrows=1 + L/5; ncols=5; 144 wspace = 0.5 145 hspace = 0.4 146 147 dvs = '_'.join(desVars) 148 filename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + '_sens_'+figureOfMerit+'_vs_'+dvs+'.png' 149 print "building %i x %i sensitivity plot %s"%(nrows,ncols, os.path.split(filename)[-1] ) 150 151 htmlPath = './%s/%s'%(PS.scriptName[:-3],os.path.split(filename)[-1]) 152 153 Nplot = 1 154 ymin = 1.0E100 155 ymax = -1.0E100 156 157 158 # apply overall title 159 f = figure() 160 f.text(0.5, 0.975, figureOfMerit + " Sensitivity" ,horizontalalignment='center',verticalalignment='top') 161 # sign chart with name and date 162 f.text(0.975, 0.025, PS.author + ' ' + time.strftime('%m/%d/%Y)'), 163 horizontalalignment='right',verticalalignment='top', fontsize=_sigFontSize) 164 165 f.text(0.025, 0.025, "ParaSol v" + PS.getVersion(), 166 horizontalalignment='left',verticalalignment='top', fontsize=_sigFontSize) 167 168 subplots_adjust( wspace=wspace, hspace=hspace, left=0.1, right=0.95 ) 169 excelColL = [] #: used to collect possible Excel output 170 excelColExtraL = [] #: list of labels for curves in excel 171 for desVar in desVars: 172 print ".", 173 subplot(nrows, ncols, Nplot) 174 175 dv = PS.desVarDict[desVar] 176 # don't lose current value 177 dv.savedVal = PS.getDesignVar( desVar ) 178 179 span = dv.maxVal - dv.minVal 180 x = [] 181 y = [] 182 yextra = [] 183 xviol = [] # any constraint violations 184 yviol = [] 185 vioDict = {} 186 for stepVal in dv.rangeL: 187 PS.setDesignVar( desVar, stepVal) 188 #PS.evaluate() 189 __Plots_Cache.getResults() 190 191 vioList = PS.violatesResultConstraint() 192 if omitViolPts and len(vioList)>0: 193 pass 194 else: 195 x.append(stepVal) 196 197 y.append( PS.getResultVar(figureOfMerit) ) 198 if extraFOM: 199 yextra.append( PS.getResultVar(extraFOM) ) 200 201 if len(vioList)>0: 202 xviol.append( x[-1] ) 203 yviol.append( y[-1] ) 204 for viol in vioList: 205 vioDict[viol] = viol 206 207 if y[-1] > ymax: ymax = y[-1] 208 if y[-1] < ymin: ymin = y[-1] 209 if extraFOM: 210 if yextra[-1] > ymax: ymax = yextra[-1] 211 if yextra[-1] < ymin: ymin = yextra[-1] 212 213 214 215 if len(x)>0: 216 plot(x, y, label=figureOfMerit, linewidth=linewidth) 217 if extraFOM: 218 plot(x,yextra, label=extraFOM, linewidth=linewidth) 219 legend(loc='best') 220 221 if PS.userOptions.excel: 222 xmin = dv.rangeL[0] 223 xmax = dv.rangeL[-1] 224 label = '%g < %s < %g'%(xmin,dv.name,xmax) 225 xExcel = [label] 226 for xval in x: 227 xvalNorm = (xval-dv.savedVal)/(xmax-xmin) 228 xExcel.append( xvalNorm ) 229 230 y.insert(0, label) 231 excelColL.append( [xExcel,y] ) 232 if extraFOM: 233 yextra.insert(0, label) 234 excelColExtraL.append( [xExcel,yextra] ) 235 236 237 if len( xviol )>0: # will be empty if omitViolPts is true 238 if len(xviol)==1: # plot will BOMB with only 1 entry in list 239 xviol.append( xviol[-1] ) 240 yviol.append( yviol[-1] ) 241 for viol in vioDict.keys(): 242 plot(xviol, yviol, 'ro', mfc='r', label=str(viol), linewidth=0, alpha=0.5) 243 #print "violation = (%s)"%viol 244 legend(loc='best') 245 246 247 #xlabel( desVar ) 248 #title(desVar) 249 xlabel(desVar) 250 ylabel( figureOfMerit ) 251 axvspan( dv.savedVal-span*0.01, dv.savedVal+span*0.01, 252 facecolor='g', alpha=0.5) # show design point 253 254 grid(True) 255 256 #gca().xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 257 #gca().yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 258 majorFormatter = FormatStrFormatter('%g') 259 gca().yaxis.set_major_formatter(majorFormatter) 260 majorFormatter = FormatStrFormatter('%g') 261 gca().xaxis.set_major_formatter(majorFormatter) 262 263 #print 'xticks( )', xticks( ) 264 #locs, labels = xticks() 265 xticks( [dv.minVal, dv.maxVal], ('%g'%dv.minVal, '%g'%dv.maxVal) ) 266 267 Nplot += 1 268 269 # restore original value 270 #PS.setDesignVar( desVar, dv.savedVal) 271 #PS.evaluate() # recalc design point from savedVal 272 __Plots_Cache.restoreParasolState() 273 274 275 # make csv file 276 csvfilename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + '_sens_'+figureOfMerit+'_vs_'+desVar+'.csv' 277 print "saving data to CSV file",os.path.split(csvfilename)[-1] 278 csvWriter = csv.writer(file(csvfilename, "wb"), dialect='excel') 279 280 sumry = PS.getDesVarSummary() 281 sp = sumry.split('\n') 282 283 for s in sp: 284 csvWriter.writerow( ( s ,) ) 285 286 csvWriter.writerow( (desVar, figureOfMerit) ) 287 for i in range( len(x) ): 288 csvWriter.writerow((x[i],y[i])) 289 290 291 if ymin>=ymax: 292 print ' >>> ERROR... ymin equals ymax in makeSensitivityPlot' 293 print ' >>> ABANDONING PLOT' 294 return 295 296 Nplot = 1 297 for desVar in desVars: 298 print ".", 299 subplot(nrows, ncols, Nplot) 300 dv = PS.desVarDict[desVar] 301 axis([dv.minVal, dv.maxVal, ymin, ymax]) 302 Nplot += 1 303 print "." 304 # after all subplots are made, save the file 305 try: 306 savefig(filename, dpi=dpi) 307 except: 308 print traceback.print_exc() 309 print '===> WARNING, could NOT save',filename 310 close() 311 return None 312 313 print "image saved as",filename 314 print "with dpi =",dpi 315 close() 316 317 # sign and date the plot 318 #signAndDatePlot(PS, filename) 319 320 if makeHTML: 321 PS.htmlFile.write('<center><table border="1" class="mytable">') 322 PS.htmlFile.write('<th>System Sensitivity</th><tr><td>') 323 PS.htmlFile.write( '<img src="%s">'%(htmlPath,) ) 324 325 PS.htmlFile.write('</td></tr><tr><td nowrap>') 326 PS.htmlFile.write( PS.getHTMLDesVarSummary() ) # don't omit any desVar from table 327 PS.htmlFile.write( PS.getHTMLResultVarSummary() ) 328 329 PS.htmlFile.write('</td></tr></table></center>') 330 331 332 if PS.userOptions.word: 333 putPlotInWord( PS, filename)# don't omit any desVar from table 334 335 if PS.userOptions.ppt: 336 putPlotInPPT( PS, filename, 'Sensitivity Plot') 337 338 339 if PS.userOptions.excel: 340 sheetName = 'Data_%i'%__plotNumber 341 chartName = 'Plot_%i'%__plotNumber 342 343 xLabelStr = 'Design Variables ' + ', '.join( desVars ) 344 yLabelStr = PS.getResultVarAxisLabel(figureOfMerit) 345 346 if excelColL: 347 348 rs = build_rs_from_colL(excelColL) 349 350 PS.xlDoc.makeChart( rs, title=figureOfMerit+'_vs_'+desVar, nCurves = 1, 351 sheetName=sheetName,chartName=chartName, showPoints=1, showLegend=1, 352 yLabel=yLabelStr, xLabel=xLabelStr) 353 for i in range(1, len(rs[0])/2 ): 354 PS.xlDoc.addNewSeriesToCurrentSheetChart( xColumn=1+i*2, yColumn=2+i*2) 355 356 PS.xlDoc.addTextBox(PS.getDesVarShortSummary()) 357 358 if extraFOM: 359 sheetName = 'DataE_%i'%__plotNumber 360 chartName = 'PlotE_%i'%__plotNumber 361 362 yLabelStr = PS.getResultVarAxisLabel(extraFOM) 363 rs = build_rs_from_colL(excelColExtraL) 364 365 PS.xlDoc.makeChart( rs, title=extraFOM+'_vs_'+desVar, nCurves = 1, 366 sheetName=sheetName,chartName=chartName, showPoints=1, showLegend=1, 367 yLabel=yLabelStr, xLabel=xLabelStr) 368 for i in range(1, len(rs[0])/2 ): 369 PS.xlDoc.addNewSeriesToCurrentSheetChart( xColumn=1+i*2, yColumn=2+i*2) 370 371 PS.xlDoc.addTextBox(PS.getDesVarShortSummary())
372 373 374
375 -def make2DPlot(PS, sysParam="mass_lbm", desVar="PHe", makeHTML=1, dpi=70, linewidth=2, 376 ptData=None, ptLegend='', logX=0, logY=0, xResultVar=None, colorL=None, yLabel='', 377 legendOnLines=0, titleStr=''):
378 global __plotNumber, __Plots_Cache 379 __plotNumber += 1 380 381 if __Plots_Cache==None: 382 __Plots_Cache = Plots_Cache(PS) 383 384 try: 385 _make2DPlot(PS, 386 sysParam=sysParam, desVar=desVar, makeHTML=makeHTML, dpi=dpi, linewidth=linewidth, 387 ptData=ptData, ptLegend=ptLegend, logX=logX, logY=logY, xResultVar=xResultVar, 388 colorL=colorL, yLabel=yLabel, legendOnLines=legendOnLines, titleStr=titleStr) 389 except: 390 print ' >>> ERROR... could not create 2D Plot' 391 print traceback.print_exc()
392 393
394 -def _make2DPlot(PS, sysParam="mass_lbm", desVar="PHe", makeHTML=1, dpi=70, linewidth=2, 395 ptData=None, ptLegend='', logX=0, logY=0, xResultVar=None, colorL=None, yLabel='', 396 legendOnLines=0, titleStr=''):
397 ''' 398 sysParam can be a name or list of names 399 xResultVar allows plotting a result variable as the X axis (ex. xResultVar="Out1") 400 ''' 401 402 __Plots_Cache.saveParasolState() 403 404 logxy = '_' 405 if logX: logxy += 'logX' 406 if logY: logxy += 'logY' 407 408 if xResultVar==None: 409 XusesResVar = 0 410 else: 411 XusesResVar = 1 412 413 # allow use of lists of plotted vars 414 if type(sysParam) == type([]): 415 sysParamList = sysParam 416 sysParam = sysParamList[0] 417 yLists = [] 418 # make a list of lists for 2D plot 419 for s in sysParamList: 420 yLists.append([]) 421 else: 422 sysParamList = [sysParam] 423 yLists = [[]] 424 listLen = len( sysParamList ) 425 426 if listLen>1 or XusesResVar: 427 showLegend = 1 428 else: 429 showLegend = 0 430 431 if xResultVar==None: 432 fileNamePart = desVar 433 else: 434 fileNamePart = desVar + '_' + xResultVar 435 436 filename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + logxy +'_'+ '_'.join(sysParamList) +'_vs_'+fileNamePart+'.png' 437 print "building 2D plot", os.path.split(filename)[-1] 438 htmlPath = './%s/%s'%(PS.scriptName[:-3],os.path.split(filename)[-1]) 439 440 dv = PS.desVarDict[desVar] 441 442 # sign chart with name and date 443 f = figure() 444 f.text(0.975, 0.025, PS.author + ' ' + time.strftime('%m/%d/%Y)'), 445 horizontalalignment='right',verticalalignment='top', fontsize=_sigFontSize) 446 447 f.text(0.025, 0.025, "ParaSol v" + PS.getVersion(), 448 horizontalalignment='left',verticalalignment='top', fontsize=_sigFontSize) 449 450 if PS.hasFeasibleControlVar( dv.name ): 451 print "ERROR... can not use feasible design variable %s for plot axis"%dv.name 452 return 453 454 # don't lose current value 455 dv.savedVal = PS.getDesignVar( desVar ) 456 457 x = [] 458 y = [] 459 xviol = [] # any constraint violations 460 yviol = [] 461 vioDict = {} 462 463 #set up result variable x lists just in case 464 xResultL = [] 465 xResViolL = [] 466 467 for stepVal in dv.rangeL: 468 PS.setDesignVar( desVar, stepVal) 469 #PS.evaluate() 470 __Plots_Cache.getResults() 471 x.append(stepVal) 472 473 if XusesResVar: 474 xResultL.append(PS.getResultVar(xResultVar)) 475 476 # accept either result variables OR native attributes 477 for i in range(listLen): 478 yLists[i].append( PS.getResultVar(sysParamList[i])) 479 #y.append( PS.getResultVar(sysParam) ) 480 481 vioList = PS.violatesResultConstraint() 482 if len(vioList)>0: 483 xviol.append( x[-1] ) 484 if XusesResVar: 485 xResViolL.append( xResultL[-1] ) 486 487 yviol.append( yLists[i][-1] ) 488 for viol in vioList: 489 vioDict[viol] = viol 490 491 #print x 492 #print y 493 494 # save x list in case the X axis is using a result variable 495 xDesVarL = x 496 497 # swap out x arrays if x axis is using a result variable 498 if XusesResVar: 499 x = xResultL 500 xviol = xResViolL 501 502 for i in range(listLen): 503 y = yLists[i] 504 labelStr = sysParamList[i] 505 if XusesResVar: 506 labelStr = "%s = %g to %g"%(desVar,dv.minVal,dv.maxVal ) 507 508 try: 509 fmt = cnames[ colorL[i].lower() ] 510 lw = linewidth 511 except: 512 fmt = getColorName(i) # get standard color list 513 lw = linewidth + 2*int(i/7) # only modify line width if NOT using input colors 514 515 516 if logX and logY: 517 loglog(x, y, label=labelStr, linewidth=lw , color=fmt) 518 elif logX: 519 semilogx(x, y, label=labelStr, linewidth=lw, color=fmt) 520 elif logY: 521 semilogy(x, y, label=labelStr, linewidth=lw, color=fmt) 522 else: 523 plot(x, y, label=labelStr, linewidth=lw, color=fmt) 524 525 if legendOnLines: 526 di = len(x) / 6 527 iLabel = (1 + (i%5)) * di 528 props = {'ha':'center', 'va':'bottom', 'color':fmt} 529 text(x[iLabel], y[iLabel], labelStr, props) 530 531 532 # Now make labels for x result variables 533 if XusesResVar: 534 for i in range(listLen): 535 y = yLists[i] 536 537 labelStr = "%s = %g"%(desVar,dv.maxVal ) 538 xrL = [x[-1], x[-1]] # needs to have length > 1 or plot will BOMB 539 yrL = [y[-1], y[-1]] # needs to have length > 1 or plot will BOMB 540 plot(xrL, yrL, 'r^', mfc='r', label=labelStr, linewidth=0, markersize=12) 541 542 labelStr = "%s = %g"%(desVar,dv.minVal ) 543 xrL = [x[0], x[0]] # needs to have length > 1 or plot will BOMB 544 yrL = [y[0], y[0]] # needs to have length > 1 or plot will BOMB 545 plot(xrL, yrL, 'rv', mfc='r', label=labelStr, linewidth=0, markersize=12) 546 547 548 if ptData != None: 549 dx, dy = ptData 550 plot(dx, dy, 'ro', mfc='b', label=ptLegend, linewidth=0) 551 if len(ptLegend)>0: 552 #legend(loc='best') 553 showLegend = 1 554 555 if len( xviol )>0: 556 for viol in vioDict.keys(): 557 if len(xviol)==1: # plot will BOMB with only 1 entry in list 558 xviol.append( xviol[-1] ) 559 yviol.append( yviol[-1] ) 560 plot(xviol, yviol, 'ro', mfc='r', label=viol, linewidth=0, alpha=0.5) 561 #legend(loc='best') 562 showLegend = 1 563 564 if showLegend and (not legendOnLines): 565 legend(loc='best') 566 567 if XusesResVar: 568 xLabelStr = PS.getResultVarAxisLabel(xResultVar) 569 else: 570 xLabelStr = PS.getDesignVarAxisLabel(desVar) 571 xlabel( xLabelStr ) 572 573 yLabelStr = '' 574 if not titleStr: 575 if len( yLists ) > 1: 576 yLabelStr = ' '.join(sysParamList) 577 ylabel( yLabelStr ) 578 titleStr = PS.getResultVarAxisLabel(sysParam) + ' ETC...' 579 else: 580 yLabelStr = PS.getResultVarAxisLabel(sysParam) 581 ylabel( yLabelStr ) 582 titleStr = PS.getResultVarAxisLabel(sysParam) 583 584 if yLabel: 585 ylabel( yLabel ) 586 yLabelStr = yLabel 587 588 title(PS.subtaskName + '\n' + titleStr ) 589 grid(True) 590 591 #from matplotlib.ticker import OldScalarFormatter 592 #gca().xaxis.set_major_formatter(OldScalarFormatter()) 593 #gca().xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 594 #gca().yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 595 majorFormatter = FormatStrFormatter('%g') 596 gca().yaxis.set_major_formatter(majorFormatter) 597 majorFormatter = FormatStrFormatter('%g') 598 gca().xaxis.set_major_formatter(majorFormatter) 599 600 601 #xticklabels = getp(gca(), 'xticklabels') 602 #yticklabels = getp(gca(), 'yticklabels') 603 #setp(yticklabels, 'color', 'black', fontsize='small', fontweight='normal') 604 #setp(xticklabels, 'color', 'black', fontsize='small', fontweight='normal') 605 606 try: 607 savefig(filename, dpi=dpi) 608 except: 609 print traceback.print_exc() 610 print '===> WARNING, could NOT save',filename 611 close() 612 return None 613 614 print "image saved as",filename 615 print "with dpi =",dpi 616 close() 617 618 #signAndDatePlot(PS, filename) 619 620 # restore original value 621 #PS.setDesignVar( desVar, dv.savedVal) 622 #PS.evaluate() # recalc design point from savedVal 623 __Plots_Cache.restoreParasolState() 624 625 # make csv file 626 csvfilename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + '_'+'_'+sysParam+'_vs_'+fileNamePart+'.csv' 627 print "saving data to CSV file",os.path.split(csvfilename)[-1] 628 csvWriter = csv.writer(file(csvfilename, "wb"), dialect='excel') 629 630 sumry = PS.getDesVarSummary(*[desVar]) 631 sp = sumry.split('\n') 632 633 for s in sp: 634 csvWriter.writerow( ( s ,) ) 635 636 637 if XusesResVar: 638 csvWriter.writerow( (xResultVar, sysParam, desVar) ) 639 for i in range( len(x) ): 640 csvWriter.writerow((x[i],y[i],xDesVarL[i])) 641 else: 642 row = [desVar] 643 row.extend( sysParamList ) 644 csvWriter.writerow( row ) 645 646 for i in range( len(x) ): 647 row = [x[i]] 648 for j in range(listLen): 649 y = yLists[j] 650 row.append( y[i] ) 651 652 csvWriter.writerow(row) 653 654 # send to excel 655 if PS.userOptions.excel: 656 sheetName = 'Data_%i'%__plotNumber 657 chartName = 'Plot_%i'%__plotNumber 658 659 if XusesResVar: 660 rs = [[xResultVar, sysParam, desVar]] 661 for i in range( len(x) ): 662 rs.append([x[i],y[i],xDesVarL[i]]) 663 else: 664 row = [desVar] 665 row.extend( sysParamList ) 666 rs = [ row ] 667 668 for i in range( len(x) ): 669 row = [x[i]] 670 for j in range(listLen): 671 y = yLists[j] 672 row.append( y[i] ) 673 rs.append( row ) 674 675 676 PS.xlDoc.makeChart( rs, title=PS.subtaskName + '\n' + titleStr, nCurves = len(rs[1])-1, 677 sheetName=sheetName,chartName=chartName, showPoints=1, showLegend=1, 678 yLabel=yLabelStr, xLabel=xLabelStr) 679 680 PS.xlDoc.addTextBox(PS.getDesVarShortSummary(*[desVar])) 681 682 683 # make any HTML output 684 if makeHTML: 685 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>') 686 #PS.htmlFile.write( '<img src="file:///%s">'%(filename,) ) 687 PS.htmlFile.write( '<img src="%s">'%(htmlPath,) ) 688 689 PS.htmlFile.write('</td></tr><tr><td nowrap>') 690 PS.htmlFile.write( PS.getHTMLDesVarSummary(*[desVar]) ) # put desVar in omitList of desVars 691 692 693 PS.htmlFile.write('</td></tr></table></center>') 694 695 696 if PS.userOptions.word: 697 putPlotInWord( PS, filename,*[desVar]) # put desVar in omitList of desVars 698 699 if PS.userOptions.ppt: 700 putPlotInPPT( PS, filename, PS.getResultVarAxisLabel(sysParam))
701
702 -def funcDummy( x, y): # needed by contour plot routine
703 return x*y 704 705
706 -def makeContourPlot(PS, sysParam="mass_lbm", desVars=["PHe","Pc"], 707 interval = 0.0, maxNumCurves=50, nomNumCurves=12, makeHTML=1, 708 dpi=70, colorMap="summer",alpha=0.7,titleStr=''):
709 global __plotNumber, __Plots_Cache 710 __plotNumber += 1 711 712 if __Plots_Cache==None: 713 __Plots_Cache = Plots_Cache(PS) 714 715 try: 716 _makeContourPlot(PS, 717 sysParam=sysParam, desVars=desVars, 718 interval = interval, maxNumCurves=maxNumCurves, nomNumCurves=nomNumCurves, 719 makeHTML=makeHTML, dpi=dpi, colorMap=colorMap,alpha=alpha, titleStr=titleStr) 720 except: 721 print ' >>> ERROR... could not create Contour Plot' 722 print traceback.print_exc()
723 724
725 -def _makeContourPlot(PS, sysParam="mass_lbm", desVars=["PHe","Pc"], 726 interval = 0.0, maxNumCurves=50, nomNumCurves=12, makeHTML=1, 727 dpi=70, colorMap="summer",alpha=0.7,titleStr=''):
728 729 __Plots_Cache.saveParasolState() 730 731 732 filename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + '_'+'_'+sysParam+'_vs_'+\ 733 desVars[0]+'_'+desVars[1]+'.png' 734 print "building contour plot", os.path.split(filename)[-1] 735 htmlPath = './%s/%s'%(PS.scriptName[:-3],os.path.split(filename)[-1]) 736 737 dv0 = PS.desVarDict[desVars[0]] 738 dv1 = PS.desVarDict[desVars[1]] 739 740 if PS.hasFeasibleControlVar( dv0.name ): 741 print "ERROR... can not use feasible design variable %s for plot axis"%dv0.name 742 return 743 744 if PS.hasFeasibleControlVar( dv1.name ): 745 print "ERROR... can not use feasible design variable %s for plot axis"%dv1.name 746 return 747 748 # don't lose current values 749 dv0.savedVal = PS.getDesignVar( desVars[0] ) 750 dv1.savedVal = PS.getDesignVar( desVars[1] ) 751 752 minVal0 = dv0.minVal 753 minVal1 = dv1.minVal 754 maxVal0 = dv0.maxVal 755 maxVal1 = dv1.maxVal 756 757 p = dv0.rangeL 758 f = dv1.rangeL 759 760 P,F = meshgrid(p,f) 761 OutArr = funcDummy(P,F) 762 763 minval=1.0E100 764 maxval=-1.0E100 765 violx = [] 766 violy = [] 767 vioDict = {} 768 for j in range(len(p)): 769 print ".", 770 for i in range(len(f)): 771 PS.setDesignVar( desVars[0], P[i,j] ) 772 PS.setDesignVar( desVars[1], F[i,j] ) 773 #PS.evaluate() 774 __Plots_Cache.getResults() 775 776 # accept either result variables OR native attributes 777 val = PS.getResultVar(sysParam) 778 vioList = PS.violatesResultConstraint() 779 if len(vioList)>0: 780 violx.append( P[i,j] ) 781 violy.append( F[i,j] ) 782 for viol in vioList: 783 vioDict[viol] = viol 784 785 OutArr[i,j] = val 786 if val<minval: minval=val 787 if val>maxval: maxval=val 788 789 print "." 790 print "minval,maxval=",minval,maxval 791 792 if interval<=0.0: 793 diff = maxval - minval 794 step = diff / nomNumCurves 795 interval = float( '%.1g'%step ) 796 print "interval=",interval 797 798 799 lowVal = interval * ( minval // interval ) 800 hiVal = interval * ( maxval // interval ) 801 deltaVal = hiVal - lowVal 802 print "lowVal, hiVal",lowVal, hiVal 803 804 # if max number of curves is set, use it 805 if deltaVal > 0.0: 806 nCurves = deltaVal / interval 807 if maxNumCurves > 0 and nCurves > maxNumCurves: 808 hiVal = lowVal + deltaVal * maxNumCurves 809 810 811 # sign chart with name and date 812 f = figure() 813 f.text(0.975, 0.025, PS.author + ' ' + time.strftime('%m/%d/%Y)'), 814 horizontalalignment='right',verticalalignment='top', fontsize=_sigFontSize) 815 816 f.text(0.025, 0.025, "ParaSol v" + PS.getVersion(), 817 horizontalalignment='left',verticalalignment='top', fontsize=_sigFontSize) 818 819 # If there are any constraint violations, show them. 820 if len( violx )>0: 821 plot( violx, violy, 'ro', linewidth=0, markersize=12, alpha=0.5) 822 vStr = 'Red Circles : ' 823 vioList = [] 824 for viol in vioDict.keys(): 825 vioList.append( viol ) 826 vStr += ', '.join( vioList ) 827 f.text(0.95, 0.5, vStr, rotation=270, color="r", 828 horizontalalignment='center',verticalalignment='center', 829 fontsize=10, fontweight="bold", alpha=0.75) 830 831 # do contour last so fill color doesn't get skewed 832 if hasattr(cm, colorMap): 833 myColorMap = getattr(cm, colorMap) 834 else: 835 myColorMap = cm.summer 836 837 #im = imshow(OutArr, interpolation='bilinear', origin='lower', alpha=alpha, 838 # cmap=myColorMap, extent=(minVal0,maxVal0,minVal1,maxVal1)) 839 840 if 1:#try: 841 842 CS1 = contourf(P,F,OutArr, arange(lowVal,hiVal,interval), 843 alpha=1., 844 cmap=myColorMap, 845 origin='lower') 846 CS = contour(P,F,OutArr, arange(lowVal,hiVal,interval), 847 origin='lower', colors='k', 848 linewidths=2, 849 extent=(minVal0,maxVal0,minVal1,maxVal1)) 850 levels = arange(lowVal,hiVal,interval) 851 852 clabel(CS, #levels, 853 inline=1, 854 fmt='%3g', 855 fontsize=10) 856 857 858 else:#except: 859 CS = contour(P,F,OutArr, arange(lowVal,hiVal,interval), 860 origin='lower', 861 linewidths=2, 862 extent=(minVal0,maxVal0,minVal1,maxVal1)) 863 clabel(CS, 864 inline=1, 865 fmt='%3g', 866 fontsize=10) 867 axis('auto') 868 869 desc = PS.getResultVarAxisLabel(sysParam) 870 871 if titleStr: 872 title(titleStr) 873 else: 874 title('%s\n%s'%(PS.subtaskName,desc)) 875 876 xlabel(desVars[0]) 877 ylabel(desVars[1]) 878 879 xlabel( PS.getDesignVarAxisLabel(desVars[0]) ) 880 ylabel( PS.getDesignVarAxisLabel(desVars[1]) ) 881 882 883 axis('on') 884 hot() 885 #gca().xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 886 #gca().yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 887 majorFormatter = FormatStrFormatter('%g') 888 gca().yaxis.set_major_formatter(majorFormatter) 889 majorFormatter = FormatStrFormatter('%g') 890 gca().xaxis.set_major_formatter(majorFormatter) 891 892 try: 893 savefig(filename, dpi=dpi) 894 except: 895 print traceback.print_exc() 896 print '===> WARNING, could NOT save',filename 897 close() 898 return None 899 900 print "image saved as",filename 901 close() 902 903 #signAndDatePlot(PS, filename) 904 905 # restore original values 906 #PS.setDesignVar( desVars[0], dv0.savedVal ) 907 #PS.setDesignVar( desVars[1], dv1.savedVal ) 908 #PS.evaluate() # recalc design point from savedVal 909 __Plots_Cache.restoreParasolState() 910 911 if makeHTML: 912 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>') 913 #PS.htmlFile.write( '<img src="file:///%s">'%(filename,) ) 914 PS.htmlFile.write( '<img src="%s">'%(htmlPath,) ) 915 916 PS.htmlFile.write('</td></tr><tr><td nowrap>') 917 PS.htmlFile.write( PS.getHTMLDesVarSummary(*desVars) ) # omit from desVar table 918 919 920 PS.htmlFile.write('</td></tr></table></center>') 921 922 923 if PS.userOptions.word: 924 putPlotInWord( PS, filename, *desVars) # omit from desVar table 925 926 if PS.userOptions.ppt: 927 putPlotInPPT( PS, filename, desc) 928 929 930 # send to excel 931 if PS.userOptions.excel: 932 933 #print 'levels=',CS.levels 934 #V0 = CS.collections[0].get_verts() 935 #print 'V0=',V0 936 #V1 = CS.collections[1].get_verts() 937 #print 'V1=',V1 938 939 #pathL = CS.collections[0].get_paths() 940 941 # need to make rs list of row values for excel 942 colL = [] 943 for i,c in enumerate(CS.collections): 944 #verts = c.get_verts() 945 946 #print i,') _segments=',c._segments 947 948 pathL = c.get_paths() 949 segs = [] 950 for path in pathL: 951 segs.append( path.vertices ) 952 #verts = c.get_path().vertices 953 954 if segs: # is matplotlib.collections.LineCollection: 955 segs = sort_and_join_segments( segs, minVal0,maxVal0,minVal1,maxVal1 ) 956 val = CS.levels[i] 957 lblStr = '%s=%g'%(sysParam,val) 958 xL = [lblStr] 959 yL = [lblStr] 960 for s in segs: 961 for x,y in s: 962 xL.append(x) 963 yL.append(y) 964 xL.append('') 965 yL.append('') 966 #for x,y in verts: 967 # xL.append(x) 968 # yL.append(y) 969 colL.append( [xL, yL] ) 970 971 rs = build_rs_from_colL(colL) 972 sheetName = 'Data_%i'%__plotNumber 973 chartName = 'Plot_%i'%__plotNumber 974 975 xLabelStr = PS.getDesignVarAxisLabel(desVars[0]) 976 yLabelStr = PS.getDesignVarAxisLabel(desVars[1]) 977 978 PS.xlDoc.makeChart( rs, title=titleStr, nCurves = 1, 979 sheetName=sheetName,chartName=chartName, showPoints=1, showLegend=1, 980 yLabel=yLabelStr, xLabel=xLabelStr) 981 982 983 for i in range(1, len(rs[0])/2 ): 984 PS.xlDoc.addNewSeriesToCurrentSheetChart( xColumn=1+i*2, yColumn=2+i*2) 985 986 PS.xlDoc.setXrange( minVal0,maxVal0 ) 987 PS.xlDoc.setYrange( minVal1,maxVal1 ) 988 PS.xlDoc.setMarkerSizes( size=3 ) 989 990 PS.xlDoc.addTextBox(PS.getDesVarShortSummary(*desVars))
991
992 -def sort_and_join_segments( segs, minx, maxx, miny, maxy ):
993 994 # turn segs into list structure 995 segL = [] 996 for s in segs: 997 segL.append( list(s) ) 998 999 epsX = (maxx-minx)/1000.0 1000 epsY = (maxy-miny)/1000.0 1001 def borderPoint(x,y): 1002 if x<minx+epsX or x>maxx-epsX or y<miny+epsY or y>maxy-epsY: 1003 return 1 1004 else: 1005 return 0
1006 1007 def grabNearestNeighbor(x,y): 1008 n=-1 1009 best = 1.0E300 1010 for i,s in enumerate(segL): 1011 xt, yt = s[0][0], s[0][1] 1012 if not borderPoint(xt, yt): 1013 d = (x-xt)**2 + (y-yt)**2 1014 if d<best: 1015 n=i 1016 best=d 1017 # check to see if segment needs to be reversed 1018 rev=0 1019 for i,s in enumerate(segL): 1020 xt, yt = s[-1][0], s[-1][1] 1021 if not borderPoint(xt, yt): 1022 d = (x-xt)**2 + (y-yt)**2 1023 if d<best: 1024 n=i 1025 best=d 1026 rev=1 1027 1028 if n>=0: 1029 sreturn = segL.pop(n) 1030 if rev: 1031 sreturn.reverse() 1032 return sreturn 1033 else: 1034 return None 1035 1036 # first only worry about non-border end of segments 1037 madeProgress = 1 1038 didLastCheck = 0 1039 while madeProgress: 1040 madeProgress = 0 1041 testSegs = [segL.pop(0)] 1042 while len( segL )>0 : 1043 xe,ye = testSegs[-1][-1][0],testSegs[-1][-1][1] 1044 if not borderPoint(xe,ye): 1045 seg = grabNearestNeighbor(xe,ye) 1046 if seg: 1047 testSegs[-1].extend( seg ) 1048 madeProgress = 1 1049 else: 1050 testSegs.append( segL.pop(0) ) 1051 segL = testSegs 1052 testSegs = [] 1053 1054 # now see if beginning of segs should join 1055 if didLastCheck: # but break out of loop if already done 1056 break 1057 for seg in segL: 1058 xe,ye = seg[-1][0],seg[-1][1] 1059 if borderPoint(xe,ye): 1060 seg.reverse() 1061 madeProgress = 1 1062 didLastCheck = 1 1063 1064 return segL 1065 1066 1067
1068 -def make2DParametricPlot(PS, sysParam="mass_lbm", desVar="PHe", xResultVar=None, 1069 paramVar=["MR",1.0,1.5,2.0,2.5] ,makeHTML=1, dpi=70, linewidth=2, smallLegend=1, 1070 ptData=None, ptLegend='', logX=0, logY=0, titleStr='', yLabelStr='', colorL=None, 1071 haLabel='center', vaLabel='bottom', omitViolPts=0, reverseLabels=0):
1072 global __plotNumber, __Plots_Cache 1073 __plotNumber += 1 1074 1075 if __Plots_Cache==None: 1076 __Plots_Cache = Plots_Cache(PS) 1077 1078 try: 1079 _make2DParametricPlot(PS, 1080 sysParam=sysParam, desVar=desVar, xResultVar=xResultVar, 1081 paramVar=paramVar ,makeHTML=makeHTML, dpi=dpi, linewidth=linewidth,smallLegend=smallLegend, 1082 ptData=ptData, ptLegend=ptLegend, logX=logX, logY=logY, titleStr=titleStr, 1083 yLabelStr=yLabelStr, colorL=colorL,haLabel=haLabel, vaLabel=vaLabel, omitViolPts=omitViolPts, 1084 reverseLabels=reverseLabels) 1085 except: 1086 print ' >>> ERROR... could not create 2D Parametric Plot' 1087 print traceback.print_exc()
1088
1089 -def _make2DParametricPlot(PS, sysParam="mass_lbm", desVar="PHe", xResultVar=None, 1090 paramVar=["MR",1.0,1.5,2.0,2.5] ,makeHTML=1, dpi=70, linewidth=2, smallLegend=1, 1091 ptData=None, ptLegend='', logX=0, logY=0, titleStr='', yLabelStr='', colorL=None, 1092 haLabel='center', vaLabel='bottom', omitViolPts=0, reverseLabels=0):
1093 1094 __Plots_Cache.saveParasolState() 1095 1096 logxy = '_' 1097 if logX: logxy += 'logX' 1098 if logY: logxy += 'logY' 1099 1100 if xResultVar==None: 1101 XusesResVar = 0 1102 fileNamePart = desVar 1103 else: 1104 fileNamePart = desVar + '_' + xResultVar 1105 XusesResVar = 1 1106 xMarkMaxL = [] 1107 xMarkMinL = [] 1108 yMarkMaxL = [] 1109 yMarkMinL = [] 1110 1111 # make csv file 1112 csvfilename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + \ 1113 '_param_'+sysParam+'_vs_'+fileNamePart+'.csv' 1114 print "saving data to CSV file",os.path.split(csvfilename)[-1] 1115 csvWriter = csv.writer(file(csvfilename, "wb"), dialect='excel') 1116 1117 sumry = PS.getDesVarSummary(*[desVar, paramVar[0]]) 1118 sp = sumry.split('\n') 1119 1120 for s in sp: 1121 csvWriter.writerow( ( s ,) ) 1122 rs_csv = [] # will hold data for csv file 1123 1124 1125 # set up PNG file 1126 filename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + logxy +\ 1127 '_param_'+sysParam+'_vs_'+fileNamePart+'.png' 1128 print "building 2D plot", os.path.split(filename)[-1] 1129 htmlPath = './%s/%s'%(PS.scriptName[:-3],os.path.split(filename)[-1]) 1130 1131 dv = PS.desVarDict[desVar] 1132 pv = PS.desVarDict[paramVar[0]] 1133 1134 # sign chart with name and date 1135 f = figure() 1136 f.text(0.975, 0.025, PS.author + ' ' + time.strftime('%m/%d/%Y)'), 1137 horizontalalignment='right',verticalalignment='top', fontsize=_sigFontSize) 1138 1139 f.text(0.025, 0.025, "ParaSol v" + PS.getVersion(), 1140 horizontalalignment='left',verticalalignment='top', fontsize=_sigFontSize) 1141 1142 if PS.hasFeasibleControlVar( dv.name ) or PS.hasFeasibleControlVar( pv.name ): 1143 print "ERROR... can not use feasible design variable %s or %s for plot axis"%(dv.name,pv.name) 1144 return 1145 1146 # don't lose current value 1147 dv.savedVal = PS.getDesignVar( desVar ) 1148 pv.savedVal = PS.getDesignVar( paramVar[0] ) 1149 1150 for iL,pval in enumerate(paramVar[1:]): 1151 print ".", 1152 PS.setDesignVar( paramVar[0], pval ) 1153 1154 xviol = [] # any constraint violations 1155 yviol = [] 1156 vioDict = {} 1157 1158 #set up result variable x lists just in case 1159 xResultL = [] 1160 xResViolL = [] 1161 1162 x = [] 1163 y = [] 1164 1165 for stepVal in dv.rangeL: 1166 PS.setDesignVar( desVar, stepVal) 1167 #PS.evaluate() 1168 __Plots_Cache.getResults() 1169 vioList = PS.violatesResultConstraint() 1170 1171 if omitViolPts and len(vioList)>0: 1172 pass 1173 else: 1174 x.append(stepVal) 1175 1176 # accept either result variables OR native attributes 1177 y.append( PS.getResultVar(sysParam) ) 1178 1179 if XusesResVar: 1180 xResultL.append(PS.getResultVar(xResultVar)) 1181 1182 if len(vioList)>0: # will be empty if omitViolPts is True 1183 xviol.append( x[-1] ) 1184 if XusesResVar: 1185 xResViolL.append( xResultL[-1] ) 1186 yviol.append( y[-1] ) 1187 for viol in vioList: 1188 vioDict[viol] = viol 1189 1190 #print x 1191 #print y 1192 1193 # save x list in case the X axis is using a result variable 1194 xDesVarL = x 1195 1196 # swap out x arrays if x axis is using a result variable 1197 if XusesResVar: 1198 x = xResultL 1199 xviol = xResViolL 1200 xMarkMaxL.append( x[-1] ) 1201 xMarkMinL.append( x[0] ) 1202 yMarkMaxL.append( y[-1] ) 1203 yMarkMinL.append( y[0] ) 1204 1205 try: 1206 fmt = cnames[ colorL[iL].lower() ] 1207 lw = linewidth 1208 except: 1209 fmt = getColorName(iL) # get standard color list 1210 lw = linewidth + 2*int(iL/7) # only modify line width if NOT using input colors 1211 1212 1213 if smallLegend: 1214 lblStr = '' 1215 di = len(x) / 6 1216 if reverseLabels: 1217 iLabel = (1 + (5-(iL%5))) * di 1218 else: 1219 iLabel = (1 + (iL%5)) * di 1220 props = {'ha':'%s'%haLabel, 'va':'%s'%vaLabel, 'color':fmt} 1221 try: 1222 text(x[iLabel], y[iLabel], paramVar[0]+' %g'%pval , props) 1223 except: 1224 pass 1225 else: 1226 lblStr = paramVar[0]+' %g'%pval 1227 1228 if logX and logY: 1229 loglog(x, y, label=lblStr, linewidth=lw , color=fmt) 1230 elif logX: 1231 semilogx(x, y, label=lblStr, linewidth=lw , color=fmt) 1232 elif logY: 1233 semilogy(x, y, label=lblStr, linewidth=lw , color=fmt) 1234 else: 1235 plot(x, y, label=lblStr, linewidth=lw , color=fmt) 1236 1237 1238 # prepare data for csv file 1239 if len(rs_csv) == 0: 1240 for yval in y: 1241 rs_csv.append( [yval] ) 1242 rs_csv_labels = [ paramVar[0]+' = %g'%pval ] 1243 1244 else: 1245 rs_csv_labels.append( paramVar[0]+' = %g'%pval ) 1246 for icsv, yval in enumerate(y): 1247 try: 1248 rs_csv[icsv].append( yval ) 1249 except: 1250 pass 1251 1252 if XusesResVar: 1253 rs_csv_labels.insert(-1, xResultVar +' %s = %g'%(paramVar[0],pval) ) 1254 for i, row in enumerate( rs_csv ): 1255 row.insert(-1, x[i] ) 1256 1257 if len( xviol )>0: 1258 for viol in vioDict.keys(): 1259 if len(xviol)==1: # plot will BOMB with only 1 entry in list 1260 xviol.append( xviol[-1] ) 1261 yviol.append( yviol[-1] ) 1262 plot(xviol, yviol, 'ro', mfc='r', label=viol, linewidth=0, alpha=0.5) 1263 1264 # write to csv file 1265 #if XusesResVar: 1266 # csvWriter.writerow( [xResultVar+' vs '+sysParam,''] ) 1267 # rs_csv_labels.insert(0, xResultVar) 1268 #else: 1269 csvWriter.writerow( [desVar+' vs '+sysParam,''] ) 1270 rs_csv_labels.insert(0, desVar) 1271 1272 csvWriter.writerow( rs_csv_labels ) 1273 1274 1275 for i, row in enumerate( rs_csv ): 1276 try: 1277 row.insert(0, xDesVarL[i] ) 1278 except: 1279 row.insert(0,'') 1280 csvWriter.writerow( row ) 1281 csvWriter.writerow( ['',''] ) 1282 1283 1284 # Now make labels for x result variables 1285 if XusesResVar: 1286 labelStr = "%s = %g"%(desVar,dv.maxVal ) 1287 plot(xMarkMaxL, yMarkMaxL, 'r^', mfc='r', label=labelStr, linewidth=0, markersize=12) 1288 1289 labelStr = "%s = %g"%(desVar,dv.minVal ) 1290 plot(xMarkMinL, yMarkMinL, 'rv', mfc='r', label=labelStr, linewidth=0, markersize=12) 1291 1292 1293 if ptData != None: 1294 dx, dy = ptData 1295 plot(dx, dy, 'ro', mfc='b', label=ptLegend, linewidth=0) 1296 1297 if XusesResVar: 1298 xLabelStr = PS.getResultVarAxisLabel(xResultVar) + " (%s = %g to %g)"%(desVar,dv.minVal,dv.maxVal ) 1299 else: 1300 xLabelStr = PS.getDesignVarAxisLabel(desVar) 1301 xlabel( xLabelStr ) 1302 1303 1304 if not yLabelStr: 1305 yLabelStr = PS.getResultVarAxisLabel(sysParam) 1306 ylabel( yLabelStr ) 1307 1308 1309 if not titleStr: 1310 titleStr = PS.subtaskName + '\n' + PS.getResultVarAxisLabel(sysParam) 1311 1312 title(titleStr) 1313 if not smallLegend: 1314 legend(loc='best') 1315 grid(True) 1316 1317 1318 if PS.userOptions.excel: 1319 sheetName = 'Data_%i'%__plotNumber 1320 chartName = 'Plot_%i'%__plotNumber 1321 1322 rs = [rs_csv_labels] 1323 for row in rs_csv: 1324 rs.append( row ) 1325 1326 PS.xlDoc.makeChart( rs, title=titleStr, nCurves = len(rs_csv[0]), 1327 sheetName=sheetName,chartName=chartName, showPoints=1, showLegend=1, 1328 yLabel=yLabelStr, xLabel=xLabelStr) 1329 1330 PS.xlDoc.addTextBox(PS.getDesVarShortSummary(*[desVar, paramVar[0]])) 1331 1332 #gca().xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 1333 #gca().yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 1334 #gca().yaxis.set_major_formatter(ScalarFormatter(useOffset=False)) 1335 1336 majorFormatter = FormatStrFormatter('%g') 1337 gca().yaxis.set_major_formatter(majorFormatter) 1338 majorFormatter = FormatStrFormatter('%g') 1339 gca().xaxis.set_major_formatter(majorFormatter) 1340 1341 1342 try: 1343 savefig(filename, dpi=dpi) 1344 except: 1345 print traceback.print_exc() 1346 print '===> WARNING, could NOT save',filename 1347 close() 1348 return None 1349 print "." 1350 print "image saved as",filename 1351 print "with dpi =",dpi 1352 close() 1353 1354 # restore original value 1355 #PS.setDesignVar( desVar, dv.savedVal) 1356 #PS.setDesignVar( paramVar[0], pv.savedVal) 1357 #PS.evaluate() # recalc design point from savedVal 1358 __Plots_Cache.restoreParasolState() 1359 1360 1361 # make any HTML output 1362 if makeHTML: 1363 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>') 1364 #PS.htmlFile.write( '<img src="file:///%s">'%(filename,) ) 1365 PS.htmlFile.write( '<img src="%s">'%(htmlPath,) ) 1366 1367 PS.htmlFile.write('</td></tr><tr><td nowrap>') 1368 PS.htmlFile.write( PS.getHTMLDesVarSummary(*[desVar, paramVar[0]]) ) # omit from desVars table 1369 1370 1371 PS.htmlFile.write('</td></tr></table></center>') 1372 1373 1374 if PS.userOptions.word: 1375 putPlotInWord( PS, filename, *[desVar, paramVar[0]]) # omit from desVars table 1376 1377 if PS.userOptions.ppt: 1378 putPlotInPPT( PS, filename, PS.getResultVarAxisLabel(sysParam) )
1379 1380
1381 -def makeCarpetPlot(PS, sysParam="sysMass", 1382 desVarL=[["PHe",5000.,7000.,9000.,11000.],["SF",1.5,2.0,4.0]], 1383 xResultVar="requiredResultVar", 1384 makeHTML=1, dpi=70, linewidth=2, smallLegend=1, iLabelsX=0, iLabelsY=1000, 1385 inLineLabels=1, alphaInLineLabels=1.0, 1386 ptData=None, ptLegend='', logX=0, logY=0, titleStr='', yLabelStr='', colorL=None, 1387 haLabel='center', vaLabel='center', angDesVarL=[0.,0.], omitViolPts=0):
1388 global __plotNumber, __Plots_Cache 1389 __plotNumber += 1 1390 1391 if __Plots_Cache==None: 1392 __Plots_Cache = Plots_Cache(PS) 1393 1394 try: 1395 _makeCarpetPlot(PS, 1396 sysParam=sysParam, desVarL=desVarL, xResultVar=xResultVar, 1397 makeHTML=makeHTML, dpi=dpi, linewidth=linewidth,smallLegend=smallLegend, 1398 iLabelsX=iLabelsX, iLabelsY=iLabelsY, inLineLabels=inLineLabels, alphaInLineLabels=alphaInLineLabels, 1399 ptData=ptData, ptLegend=ptLegend, logX=logX, logY=logY, titleStr=titleStr, 1400 yLabelStr=yLabelStr, colorL=colorL,haLabel=haLabel, vaLabel=vaLabel, 1401 angDesVarL=angDesVarL, omitViolPts=omitViolPts) 1402 except: 1403 print ' >>> ERROR... could not create Carpet Plot' 1404 print traceback.print_exc()
1405
1406 -def _makeCarpetPlot(PS, sysParam="sysMass", 1407 desVarL=[["PHe",5000.,7000.,9000.,11000.],["SF",1.5,2.0,4.0]], 1408 xResultVar="requiredResultVar", 1409 makeHTML=1, dpi=70, linewidth=2, smallLegend=1,iLabelsX=0, iLabelsY=1000, 1410 inLineLabels=1, alphaInLineLabels=1.0, 1411 ptData=None, ptLegend='', logX=0, logY=0, titleStr='', yLabelStr='', colorL=None, 1412 haLabel='center', vaLabel='center', angDesVarL=[0.,0.], omitViolPts=0):
1413 1414 1415 __Plots_Cache.saveParasolState() 1416 1417 logxy = '_' 1418 if logX: logxy += 'logX' 1419 if logY: logxy += 'logY' 1420 1421 # make intermediate lists 1422 dvNameL = [] # list of design variable names 1423 dvL = [] # list of design varaible objects 1424 NumDesVar = len( desVarL ) 1425 if NumDesVar > 2: 1426 print 'For NOW, Carpet plots are limited to 2 design varables' 1427 return 1428 1429 for row in desVarL: 1430 dvName = row[0] 1431 dv = PS.desVarDict[dvName] 1432 dvL.append( dv ) 1433 dvNameL.append( dvName ) 1434 dvNameStr = '_'.join( dvNameL ) 1435 1436 1437 fileNamePart = dvNameStr + '_' + xResultVar 1438 filename = PS.outputPath + PS.scriptName[:-3] + '_%i_'%__plotNumber + logxy +\ 1439 '_carpet_'+sysParam+'_vs_'+fileNamePart+'.png' 1440 print "building Carpet plot", os.path.split(filename)[-1] 1441 htmlPath = './%s/%s'%(PS.scriptName[:-3],os.path.split(filename)[-1]) 1442 1443 # sign chart with name and date 1444 f = figure() 1445 f.text(0.975, 0.025, PS.author + ' ' + time.strftime('%m/%d/%Y)'), 1446 horizontalalignment='right',verticalalignment='top', fontsize=_sigFontSize) 1447 1448 f.text(0.025, 0.025, "ParaSol v" + PS.getVersion(), 1449 horizontalalignment='left',verticalalignment='top', fontsize=_sigFontSize) 1450 1451 for dv in dvL: 1452 if PS.hasFeasibleControlVar( dv.name ): 1453 print "ERROR... can not use feasible design variable %s for CARPET PLOT axis"%(dv.name) 1454 return 1455 1456 __Plots_Cache.setUpForFuncCall( dvNameL=dvNameL, outNameL=[xResultVar, sysParam]) 1457 #print __Plots_Cache.funcCall( 1000.0, 2.0 ) 1458 1459 CarpetObj = Carpet( __Plots_Cache.funcCall , 1460 aName=dvNameL[0], aList=desVarL[0][1:], bName=dvNameL[1], bList=desVarL[1][1:], 1461 nStepsA=20, nStepsB=20, iLabelsX=iLabelsX, iLabelsY=iLabelsY, showLabels=smallLegend, 1462 linewidth=linewidth, inLineLabels=inLineLabels, showGrid=1, alphaInLineLabels=alphaInLineLabels, 1463 logX=logX, logY=logY) 1464 1465 CarpetObj.plotCarpet(figObj = f, afmt='green', bfmt='purple') 1466 1467 # plot any constraint violations 1468 #print __Plots_Cache.getViolationXYLists() 1469 #print __Plots_Cache.violationDescD 1470 if __Plots_Cache.violationDescD and not omitViolPts: 1471 xviolL, yviolL = __Plots_Cache.getViolationXYLists() 1472 if len(xviolL)==1: # plot will BOMB with only 1 entry in list 1473 xviolL.append( xviolL[-1] ) 1474 yviolL.append( yviolL[-1] ) 1475 1476 plot( xviolL, yviolL, 'ro', linewidth=0, alpha=0.5) #, markersize=12) 1477 vStr = 'Red Circles : ' 1478 vioList = [] 1479 for viol in __Plots_Cache.violationDescD: 1480 vioList.append( viol ) 1481 vStr += ', '.join( vioList ) 1482 f.text(0.95, 0.5, vStr, rotation=270, color="r", 1483 horizontalalignment='center',verticalalignment='center', 1484 fontsize=10, fontweight="bold", alpha=0.75) 1485 1486 1487 1488 if ptData != None: 1489 dx, dy = ptData 1490 plot(dx, dy, 'ro', mfc='b', label=ptLegend, linewidth=0) 1491 1492 xlabel( PS.getResultVarAxisLabel(xResultVar) ) 1493 1494 1495 if not yLabelStr: 1496 ylabel( PS.getResultVarAxisLabel(sysParam) ) 1497 else: 1498 ylabel( yLabelStr ) 1499 1500 1501 if not titleStr: 1502 titleStr = PS.subtaskName + '\n(%s & %s)'%( xResultVar, sysParam) + ' vs (%s & %s)'%(dvNameL[1],dvNameL[0]) 1503 1504 title(titleStr) 1505 1506 grid(True) 1507 1508 #gca().xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 1509 #gca().yaxis.set_major_formatter(ScalarFormatter(useMathText=True)) 1510 #gca().yaxis.set_major_formatter(ScalarFormatter(useOffset=False)) 1511 1512 majorFormatter = FormatStrFormatter('%g') 1513 gca().yaxis.set_major_formatter(majorFormatter) 1514 majorFormatter = FormatStrFormatter('%g') 1515 gca().xaxis.set_major_formatter(majorFormatter) 1516 1517 1518 try: 1519 savefig(filename, dpi=dpi) 1520 except: 1521 print traceback.print_exc() 1522 print '===> WARNING, could NOT save',filename 1523 close() 1524 return None 1525 print "." 1526 print "image saved as",filename 1527 print "with dpi =",dpi 1528 close() 1529 1530 # restore original value 1531 #for dv in dvL: 1532 # PS.setDesignVar( dv.name, dv.savedVal) 1533 # 1534 #PS.evaluate() # recalc design point from savedVal 1535 __Plots_Cache.restoreParasolState() 1536 1537 1538 # make any HTML output 1539 if makeHTML: 1540 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>') 1541 #PS.htmlFile.write( '<img src="file:///%s">'%(filename,) ) 1542 PS.htmlFile.write( '<img src="%s">'%(htmlPath,) ) 1543 1544 PS.htmlFile.write('</td></tr><tr><td nowrap>') 1545 PS.htmlFile.write( PS.getHTMLDesVarSummary(*dvNameL) ) # omit from desVar table 1546 1547 1548 PS.htmlFile.write('</td></tr></table></center>') 1549 1550 1551 if PS.userOptions.word: 1552 putPlotInWord( PS, filename, *dvNameL) # omit from desVar table 1553 1554 if PS.userOptions.ppt: 1555 putPlotInPPT( PS, filename, PS.getResultVarAxisLabel(sysParam) ) 1556 1557 # send to excel 1558 if PS.userOptions.excel: 1559 sheetName = 'Data_%i'%__plotNumber 1560 chartName = 'CarpetPlot_%i'%__plotNumber 1561 1562 yLabelStr = PS.getResultVarAxisLabel(sysParam) 1563 xLabelStr = PS.getResultVarAxisLabel(xResultVar) 1564 1565 colL = [] 1566 Lmax = 0 1567 for a,bL,xL,yL in CarpetObj.aCurveXYL: 1568 lblStr = '%s=%g'%(CarpetObj.aName,a) 1569 xL.insert(0, lblStr) 1570 yL.insert(0, lblStr) 1571 colL.append( [xL, yL] ) 1572 if len(xL)>Lmax: 1573 Lmax = len(xL) 1574 1575 numA = len( colL ) 1576 1577 for b,aL,xL,yL in CarpetObj.bCurveXYL: 1578 lblStr = '%s=%g'%(CarpetObj.bName,b) 1579 xL.insert(0, lblStr) 1580 yL.insert(0, lblStr) 1581 colL.append( [xL, yL] ) 1582 if len(xL)>Lmax: 1583 Lmax = len(xL) 1584 1585 1586 rs = [] 1587 for i in range( Lmax ): 1588 rs.append( [] ) 1589 1590 for icol in range( len(colL) ): 1591 xL,yL = colL[icol] 1592 for i in range( Lmax ): 1593 if i<len(xL): 1594 rs[i].append( xL[i] ) 1595 rs[i].append( yL[i] ) 1596 else: 1597 rs[i].append( '' ) 1598 rs[i].append( '' ) 1599 1600 1601 PS.xlDoc.makeChart( rs, title=titleStr, nCurves = 1, 1602 sheetName=sheetName,chartName=chartName, showPoints=1, showLegend=1, 1603 yLabel=yLabelStr, xLabel=xLabelStr) 1604 1605 PS.xlDoc.setSeriesColor( NSeries=1, red=127, green=0, blue=127) 1606 PS.xlDoc.setLineThickness( NSeries=1, thickness=2) 1607 1608 for i in range(1, len(rs[0])/2 ): 1609 PS.xlDoc.addNewSeriesToCurrentSheetChart( xColumn=1+i*2, yColumn=2+i*2) 1610 1611 if i >= numA: 1612 PS.xlDoc.setSeriesColor( NSeries=i+1, red=60, green=200, blue=60) 1613 PS.xlDoc.setLineThickness( NSeries=i+1, thickness=2+i-numA) 1614 else: 1615 PS.xlDoc.setSeriesColor( NSeries=i+1, red=127, green=0, blue=127) 1616 PS.xlDoc.setLineThickness( NSeries=i+1, thickness=2+i) 1617 1618 xmin, xmax, ymin, ymax = CarpetObj.xmin, CarpetObj.xmax, CarpetObj.ymin, CarpetObj.ymax 1619 1620 PS.xlDoc.setXrange( xmin, xmax ) 1621 PS.xlDoc.setYrange( ymin, ymax ) 1622 PS.xlDoc.setMarkerSizes( size=3 ) 1623 1624 PS.xlDoc.addTextBox(PS.getDesVarShortSummary(*dvNameL))
1625 1626
1627 -def build_rs_from_colL(colL):
1628 1629 Lmax = 0 1630 for col in colL: 1631 if len(col[0])>Lmax: 1632 Lmax = len(col[0]) 1633 1634 rs = [] 1635 for i in range( Lmax ): 1636 rs.append( [] ) 1637 1638 for icol in range( len(colL) ): 1639 xL,yL = colL[icol] 1640 for i in range( Lmax ): 1641 if i<len(xL): 1642 rs[i].append( xL[i] ) 1643 rs[i].append( yL[i] ) 1644 else: 1645 rs[i].append( '' ) 1646 rs[i].append( '' ) 1647 return rs
1648 1649 1650 stdList = ['red','green','blue','cyan','magenta','olive','brown','gold','coral', 1651 'darkred','darkgreen','darkblue']
1652 -def getColorName(i):
1653 if i < len( stdList ): 1654 return stdList[i] 1655 elif i< len(cnames): 1656 return cnames[ cnames.keys()[i] ] 1657 else: 1658 return cnames[ cnames.keys()[i/len(cnames)] ]
1659 cnames = { 1660 'aliceblue' : '#F0F8FF', 1661 'antiquewhite' : '#FAEBD7', 1662 'aqua' : '#00FFFF', 1663 'aquamarine' : '#7FFFD4', 1664 'azure' : '#F0FFFF', 1665 'beige' : '#F5F5DC', 1666 'bisque' : '#FFE4C4', 1667 'black' : '#000000', 1668 'blanchedalmond' : '#FFEBCD', 1669 'blue' : '#0000FF', 1670 'blueviolet' : '#8A2BE2', 1671 'brown' : '#A52A2A', 1672 'burlywood' : '#DEB887', 1673 'cadetblue' : '#5F9EA0', 1674 'chartreuse' : '#7FFF00', 1675 'chocolate' : '#D2691E', 1676 'coral' : '#FF7F50', 1677 'cornflowerblue' : '#6495ED', 1678 'cornsilk' : '#FFF8DC', 1679 'crimson' : '#DC143C', 1680 'cyan' : '#00FFFF', 1681 'darkblue' : '#00008B', 1682 'darkcyan' : '#008B8B', 1683 'darkgoldenrod' : '#B8860B', 1684 'darkgray' : '#A9A9A9', 1685 'darkgreen' : '#006400', 1686 'darkkhaki' : '#BDB76B', 1687 'darkmagenta' : '#8B008B', 1688 'darkolivegreen' : '#556B2F', 1689 'darkorange' : '#FF8C00', 1690 'darkorchid' : '#9932CC', 1691 'darkred' : '#8B0000', 1692 'darksalmon' : '#E9967A', 1693 'darkseagreen' : '#8FBC8F', 1694 'darkslateblue' : '#483D8B', 1695 'darkslategray' : '#2F4F4F', 1696 'darkturquoise' : '#00CED1', 1697 'darkviolet' : '#9400D3', 1698 'deeppink' : '#FF1493', 1699 'deepskyblue' : '#00BFFF', 1700 'dimgray' : '#696969', 1701 'dodgerblue' : '#1E90FF', 1702 'firebrick' : '#B22222', 1703 'floralwhite' : '#FFFAF0', 1704 'forestgreen' : '#228B22', 1705 'fuchsia' : '#FF00FF', 1706 'gainsboro' : '#DCDCDC', 1707 'ghostwhite' : '#F8F8FF', 1708 'gold' : '#FFD700', 1709 'goldenrod' : '#DAA520', 1710 'gray' : '#808080', 1711 'green' : '#008000', 1712 'greenyellow' : '#ADFF2F', 1713 'honeydew' : '#F0FFF0', 1714 'hotpink' : '#FF69B4', 1715 'indigo' : '#4B0082', 1716 'ivory' : '#FFFFF0', 1717 'khaki' : '#F0E68C', 1718 'lavender' : '#E6E6FA', 1719 'lavenderblush' : '#FFF0F5', 1720 'lawngreen' : '#7CFC00', 1721 'lemonchiffon' : '#FFFACD', 1722 'lightblue' : '#ADD8E6', 1723 'lightcoral' : '#F08080', 1724 'lightcyan' : '#E0FFFF', 1725 'lightgoldenrodyellow' : '#FAFAD2', 1726 'lightgreen' : '#90EE90', 1727 'lightgrey' : '#D3D3D3', 1728 'lightpink' : '#FFB6C1', 1729 'lightsalmon' : '#FFA07A', 1730 'lightseagreen' : '#20B2AA', 1731 'lightskyblue' : '#87CEFA', 1732 'lightslategray' : '#778899', 1733 'lightsteelblue' : '#B0C4DE', 1734 'lightyellow' : '#FFFFE0', 1735 'lime' : '#00FF00', 1736 'limegreen' : '#32CD32', 1737 'linen' : '#FAF0E6', 1738 'magenta' : '#FF00FF', 1739 'maroon' : '#800000', 1740 'mediumaquamarine' : '#66CDAA', 1741 'mediumblue' : '#0000CD', 1742 'mediumorchid' : '#BA55D3', 1743 'mediumpurple' : '#9370DB', 1744 'mediumseagreen' : '#3CB371', 1745 'mediumslateblue' : '#7B68EE', 1746 'mediumspringgreen' : '#00FA9A', 1747 'mediumturquoise' : '#48D1CC', 1748 'mediumvioletred' : '#C71585', 1749 'midnightblue' : '#191970', 1750 'mintcream' : '#F5FFFA', 1751 'mistyrose' : '#FFE4E1', 1752 'moccasin' : '#FFE4B5', 1753 'navajowhite' : '#FFDEAD', 1754 'navy' : '#000080', 1755 'oldlace' : '#FDF5E6', 1756 'olive' : '#808000', 1757 'olivedrab' : '#6B8E23', 1758 'orange' : '#FFA500', 1759 'orangered' : '#FF4500', 1760 'orchid' : '#DA70D6', 1761 'palegoldenrod' : '#EEE8AA', 1762 'palegreen' : '#98FB98', 1763 'palevioletred' : '#AFEEEE', 1764 'peru' : '#CD853F', 1765 'pink' : '#FFC0CB', 1766 'plum' : '#DDA0DD', 1767 'powderblue' : '#B0E0E6', 1768 'purple' : '#800080', 1769 'red' : '#FF0000', 1770 'rosybrown' : '#BC8F8F', 1771 'royalblue' : '#4169E1', 1772 'saddlebrown' : '#8B4513', 1773 'salmon' : '#FA8072', 1774 'sandybrown' : '#FAA460', 1775 'seagreen' : '#2E8B57', 1776 'seashell' : '#FFF5EE', 1777 'sienna' : '#A0522D', 1778 'silver' : '#C0C0C0', 1779 'skyblue' : '#87CEEB', 1780 'slateblue' : '#6A5ACD', 1781 'slategray' : '#708090', 1782 'snow' : '#FFFAFA', 1783 'springgreen' : '#00FF7F', 1784 'steelblue' : '#4682B4', 1785 'tan' : '#D2B48C', 1786 'teal' : '#008080', 1787 'thistle' : '#D8BFD8', 1788 'tomato' : '#FF6347', 1789 'turquoise' : '#40E0D0', 1790 'violet' : '#EE82EE', 1791 'wheat' : '#F5DEB3', 1792 'white' : '#FFFFFF', 1793 'whitesmoke' : '#F5F5F5', 1794 'yellow' : '#FFFF00', 1795 'yellowgreen' : '#9ACD32', 1796 'black' : '#000000', 1797 'navy' : '#000080', 1798 'darkblue' : '#00008B', 1799 'mediumblue' : '#0000CD', 1800 'blue' : '#0000FF', 1801 'darkgreen' : '#006400', 1802 'green' : '#008000', 1803 'teal' : '#008080', 1804 'darkcyan' : '#008B8B', 1805 'deepskyblue' : '#00BFFF', 1806 'darkturquoise' : '#00CED1', 1807 'mediumspringgreen' : '#00FA9A', 1808 'lime' : '#00FF00', 1809 'springgreen' : '#00FF7F', 1810 'aqua' : '#00FFFF', 1811 'cyan' : '#00FFFF', 1812 'midnightblue' : '#191970', 1813 'dodgerblue' : '#1E90FF', 1814 'lightseagreen' : '#20B2AA', 1815 'forestgreen' : '#228B22', 1816 'seagreen' : '#2E8B57', 1817 'darkslategray' : '#2F4F4F', 1818 'limegreen' : '#32CD32', 1819 'mediumseagreen' : '#3CB371', 1820 'turquoise' : '#40E0D0', 1821 'royalblue' : '#4169E1', 1822 'steelblue' : '#4682B4', 1823 'darkslateblue' : '#483D8B', 1824 'mediumturquoise' : '#48D1CC', 1825 'indigo' : '#4B0082', 1826 'darkolivegreen' : '#556B2F', 1827 'cadetblue' : '#5F9EA0', 1828 'cornflowerblue' : '#6495ED', 1829 'mediumaquamarine' : '#66CDAA', 1830 'dimgray' : '#696969', 1831 'slateblue' : '#6A5ACD', 1832 'olivedrab' : '#6B8E23', 1833 'slategray' : '#708090', 1834 'lightslategray' : '#778899', 1835 'mediumslateblue' : '#7B68EE', 1836 'lawngreen' : '#7CFC00', 1837 'chartreuse' : '#7FFF00', 1838 'aquamarine' : '#7FFFD4', 1839 'maroon' : '#800000', 1840 'purple' : '#800080', 1841 'olive' : '#808000', 1842 'gray' : '#808080', 1843 'skyblue' : '#87CEEB', 1844 'lightskyblue' : '#87CEFA', 1845 'blueviolet' : '#8A2BE2', 1846 'darkred' : '#8B0000', 1847 'darkmagenta' : '#8B008B', 1848 'saddlebrown' : '#8B4513', 1849 'darkseagreen' : '#8FBC8F', 1850 'lightgreen' : '#90EE90', 1851 'mediumpurple' : '#9370DB', 1852 'darkviolet' : '#9400D3', 1853 'palegreen' : '#98FB98', 1854 'darkorchid' : '#9932CC', 1855 'yellowgreen' : '#9ACD32', 1856 'sienna' : '#A0522D', 1857 'brown' : '#A52A2A', 1858 'darkgray' : '#A9A9A9', 1859 'lightblue' : '#ADD8E6', 1860 'greenyellow' : '#ADFF2F', 1861 'palevioletred' : '#AFEEEE', 1862 'lightsteelblue' : '#B0C4DE', 1863 'powderblue' : '#B0E0E6', 1864 'firebrick' : '#B22222', 1865 'darkgoldenrod' : '#B8860B', 1866 'mediumorchid' : '#BA55D3', 1867 'rosybrown' : '#BC8F8F', 1868 'darkkhaki' : '#BDB76B', 1869 'silver' : '#C0C0C0', 1870 'mediumvioletred' : '#C71585', 1871 'peru' : '#CD853F', 1872 'chocolate' : '#D2691E', 1873 'tan' : '#D2B48C', 1874 'lightgrey' : '#D3D3D3', 1875 'thistle' : '#D8BFD8', 1876 'orchid' : '#DA70D6', 1877 'goldenrod' : '#DAA520', 1878 'crimson' : '#DC143C', 1879 'gainsboro' : '#DCDCDC', 1880 'plum' : '#DDA0DD', 1881 'burlywood' : '#DEB887', 1882 'lightcyan' : '#E0FFFF', 1883 'lavender' : '#E6E6FA', 1884 'darksalmon' : '#E9967A', 1885 'violet' : '#EE82EE', 1886 'palegoldenrod' : '#EEE8AA', 1887 'lightcoral' : '#F08080', 1888 'khaki' : '#F0E68C', 1889 'aliceblue' : '#F0F8FF', 1890 'honeydew' : '#F0FFF0', 1891 'azure' : '#F0FFFF', 1892 'wheat' : '#F5DEB3', 1893 'beige' : '#F5F5DC', 1894 'whitesmoke' : '#F5F5F5', 1895 'mintcream' : '#F5FFFA', 1896 'ghostwhite' : '#F8F8FF', 1897 'salmon' : '#FA8072', 1898 'sandybrown' : '#FAA460', 1899 'antiquewhite' : '#FAEBD7', 1900 'linen' : '#FAF0E6', 1901 'lightgoldenrodyellow' : '#FAFAD2', 1902 'oldlace' : '#FDF5E6', 1903 'red' : '#FF0000', 1904 'fuchsia' : '#FF00FF', 1905 'magenta' : '#FF00FF', 1906 'deeppink' : '#FF1493', 1907 'orangered' : '#FF4500', 1908 'tomato' : '#FF6347', 1909 'hotpink' : '#FF69B4', 1910 'coral' : '#FF7F50', 1911 'darkorange' : '#FF8C00', 1912 'lightsalmon' : '#FFA07A', 1913 'orange' : '#FFA500', 1914 'lightpink' : '#FFB6C1', 1915 'pink' : '#FFC0CB', 1916 'gold' : '#FFD700', 1917 'navajowhite' : '#FFDEAD', 1918 'moccasin' : '#FFE4B5', 1919 'bisque' : '#FFE4C4', 1920 'mistyrose' : '#FFE4E1', 1921 'blanchedalmond' : '#FFEBCD', 1922 'lavenderblush' : '#FFF0F5', 1923 'seashell' : '#FFF5EE', 1924 'cornsilk' : '#FFF8DC', 1925 'lemonchiffon' : '#FFFACD', 1926 'floralwhite' : '#FFFAF0', 1927 'snow' : '#FFFAFA', 1928 'yellow' : '#FFFF00', 1929 'lightyellow' : '#FFFFE0', 1930 'ivory' : '#FFFFF0', 1931 } 1932 1933 1934 if __name__ == "__main__": #self test 1935 pass 1936