|
Package parasol ::
Module Plots
|
|
1 import matplotlib
2
3
4 import sys, os
5 from pylab import *
6 import time
7
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
21
22 __plotNumber = 0
23
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
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
51 im = Image.open( filename )
52 width, height = im.size
53 draw = ImageDraw.Draw(im)
54
55
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):
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
159 f = figure()
160 f.text(0.5, 0.975, figureOfMerit + " Sensitivity" ,horizontalalignment='center',verticalalignment='top')
161
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 = []
170 excelColExtraL = []
171 for desVar in desVars:
172 print ".",
173 subplot(nrows, ncols, Nplot)
174
175 dv = PS.desVarDict[desVar]
176
177 dv.savedVal = PS.getDesignVar( desVar )
178
179 span = dv.maxVal - dv.minVal
180 x = []
181 y = []
182 yextra = []
183 xviol = []
184 yviol = []
185 vioDict = {}
186 for stepVal in dv.rangeL:
187 PS.setDesignVar( desVar, stepVal)
188
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:
238 if len(xviol)==1:
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
244 legend(loc='best')
245
246
247
248
249 xlabel(desVar)
250 ylabel( figureOfMerit )
251 axvspan( dv.savedVal-span*0.01, dv.savedVal+span*0.01,
252 facecolor='g', alpha=0.5)
253
254 grid(True)
255
256
257
258 majorFormatter = FormatStrFormatter('%g')
259 gca().yaxis.set_major_formatter(majorFormatter)
260 majorFormatter = FormatStrFormatter('%g')
261 gca().xaxis.set_major_formatter(majorFormatter)
262
263
264
265 xticks( [dv.minVal, dv.maxVal], ('%g'%dv.minVal, '%g'%dv.maxVal) )
266
267 Nplot += 1
268
269
270
271
272 __Plots_Cache.restoreParasolState()
273
274
275
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
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
318
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() )
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)
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
414 if type(sysParam) == type([]):
415 sysParamList = sysParam
416 sysParam = sysParamList[0]
417 yLists = []
418
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
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
455 dv.savedVal = PS.getDesignVar( desVar )
456
457 x = []
458 y = []
459 xviol = []
460 yviol = []
461 vioDict = {}
462
463
464 xResultL = []
465 xResViolL = []
466
467 for stepVal in dv.rangeL:
468 PS.setDesignVar( desVar, stepVal)
469
470 __Plots_Cache.getResults()
471 x.append(stepVal)
472
473 if XusesResVar:
474 xResultL.append(PS.getResultVar(xResultVar))
475
476
477 for i in range(listLen):
478 yLists[i].append( PS.getResultVar(sysParamList[i]))
479
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
492
493
494
495 xDesVarL = x
496
497
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)
513 lw = linewidth + 2*int(i/7)
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
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]]
539 yrL = [y[-1], y[-1]]
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]]
544 yrL = [y[0], y[0]]
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
553 showLegend = 1
554
555 if len( xviol )>0:
556 for viol in vioDict.keys():
557 if len(xviol)==1:
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
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
592
593
594
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
602
603
604
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
619
620
621
622
623 __Plots_Cache.restoreParasolState()
624
625
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
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
684 if makeHTML:
685 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>')
686
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]) )
691
692
693 PS.htmlFile.write('</td></tr></table></center>')
694
695
696 if PS.userOptions.word:
697 putPlotInWord( PS, filename,*[desVar])
698
699 if PS.userOptions.ppt:
700 putPlotInPPT( PS, filename, PS.getResultVarAxisLabel(sysParam))
701
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
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
774 __Plots_Cache.getResults()
775
776
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
805 if deltaVal > 0.0:
806 nCurves = deltaVal / interval
807 if maxNumCurves > 0 and nCurves > maxNumCurves:
808 hiVal = lowVal + deltaVal * maxNumCurves
809
810
811
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
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
832 if hasattr(cm, colorMap):
833 myColorMap = getattr(cm, colorMap)
834 else:
835 myColorMap = cm.summer
836
837
838
839
840 if 1:
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,
853 inline=1,
854 fmt='%3g',
855 fontsize=10)
856
857
858 else:
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
886
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
904
905
906
907
908
909 __Plots_Cache.restoreParasolState()
910
911 if makeHTML:
912 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>')
913
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) )
918
919
920 PS.htmlFile.write('</td></tr></table></center>')
921
922
923 if PS.userOptions.word:
924 putPlotInWord( PS, filename, *desVars)
925
926 if PS.userOptions.ppt:
927 putPlotInPPT( PS, filename, desc)
928
929
930
931 if PS.userOptions.excel:
932
933
934
935
936
937
938
939
940
941
942 colL = []
943 for i,c in enumerate(CS.collections):
944
945
946
947
948 pathL = c.get_paths()
949 segs = []
950 for path in pathL:
951 segs.append( path.vertices )
952
953
954 if segs:
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
967
968
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
993
994
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
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
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
1055 if didLastCheck:
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
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 = []
1123
1124
1125
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
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
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 = []
1155 yviol = []
1156 vioDict = {}
1157
1158
1159 xResultL = []
1160 xResViolL = []
1161
1162 x = []
1163 y = []
1164
1165 for stepVal in dv.rangeL:
1166 PS.setDesignVar( desVar, stepVal)
1167
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
1177 y.append( PS.getResultVar(sysParam) )
1178
1179 if XusesResVar:
1180 xResultL.append(PS.getResultVar(xResultVar))
1181
1182 if len(vioList)>0:
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
1191
1192
1193
1194 xDesVarL = x
1195
1196
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)
1210 lw = linewidth + 2*int(iL/7)
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
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:
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
1265
1266
1267
1268
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
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
1333
1334
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
1355
1356
1357
1358 __Plots_Cache.restoreParasolState()
1359
1360
1361
1362 if makeHTML:
1363 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>')
1364
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]]) )
1369
1370
1371 PS.htmlFile.write('</td></tr></table></center>')
1372
1373
1374 if PS.userOptions.word:
1375 putPlotInWord( PS, filename, *[desVar, paramVar[0]])
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
1422 dvNameL = []
1423 dvL = []
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
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
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
1468
1469
1470 if __Plots_Cache.violationDescD and not omitViolPts:
1471 xviolL, yviolL = __Plots_Cache.getViolationXYLists()
1472 if len(xviolL)==1:
1473 xviolL.append( xviolL[-1] )
1474 yviolL.append( yviolL[-1] )
1475
1476 plot( xviolL, yviolL, 'ro', linewidth=0, alpha=0.5)
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
1509
1510
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
1531
1532
1533
1534
1535 __Plots_Cache.restoreParasolState()
1536
1537
1538
1539 if makeHTML:
1540 PS.htmlFile.write('<center><table border="1" class="mytable"><tr><td>')
1541
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) )
1546
1547
1548 PS.htmlFile.write('</td></tr></table></center>')
1549
1550
1551 if PS.userOptions.word:
1552 putPlotInWord( PS, filename, *dvNameL)
1553
1554 if PS.userOptions.ppt:
1555 putPlotInPPT( PS, filename, PS.getResultVarAxisLabel(sysParam) )
1556
1557
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
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']
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__":
1935 pass
1936