def getDimensions(self): if self.width is None: (self.width, self.height) = getGoldenRatioDimensions(8.0) elif self.height is None: (goldWidth, goldHeight) = getGoldenRatioDimensions(self.width) self.height = goldHeight return (self.width, self.height)
def getDimensions(self): """ Get the dimensions of this plot. """ if self.width is None: (self.width, self.height) = getGoldenRatioDimensions(8.0) elif self.height is None: (goldWidth, goldHeight) = getGoldenRatioDimensions(self.width) self.height = goldHeight return (self.width, self.height)
def _doPlot(self): if len(self.groupedPlots) + len(self.plots) == 0: print "WeightedPlotLayout.plot(): No data to plot!" return oldRCParams = {} if self.rcParams is not None: for (key,val) in self.rcParams.items(): oldRCParams[key] = pylab.rcParams[key] pylab.rcParams[key] = val numRows = len(self.groupedPlots.keys()) + len(self.plots) maxRowLength = max([len(self.groupedPlots[f]) for f in self.groupedPlots.keys()]) if self.groupOrder is not None: keyList = self.groupOrder else: keyList = sorted(self.groupedPlots.keys()) if self.figdimensions is not None: fig = pyplot.figure(figsize=(self.figdimensions[0], self.figdimensions[1])) elif self.dimensions is not None: fig = pyplot.figure(figsize=(self.dimensions[0] * maxRowLength, self.dimensions[1] * numRows)) else: (figWidth, figHeight) = getGoldenRatioDimensions(8.0) figWidth *= maxRowLength figHeight *= numRows fig = pyplot.figure(figsize=(figWidth, figHeight)) # figWidth = fig.get_figwidth() # print figWidth # print fig.get_figheight() # (goldenWidth, goldenHeight) = getGoldenRatioDimensions(figWidth) # fig.set_figheight(goldenHeight) # print fig.get_figheight() plotHandles = [] plotLabels = [] # Force a call to plotParams since we need them here if self.plotParams is None: self.setPlotParameters(**dict()) figTop = self.plotParams["top"] figLeft = self.plotParams["left"] wspace = self.plotParams["wspace"] hspace = self.plotParams["hspace"] height = figTop - self.plotParams["bottom"] rowHeight = height / (numRows + (numRows - 1) * hspace) hgap = self.plotParams["hspace"] * rowHeight rowWidth = self.plotParams["right"] - figLeft # To contain a list of plots and rects, so we can do the # information collection in one pass plotInfo = [] def applyParams(r, pp): if pp is None: return r left, bottom, width, height = r return [ left + width * pp.get('left',0), bottom + height * pp.get('bottom',0), width * (pp.get('right',1) - pp.get('left',0)), height * (pp.get('top',1) - pp.get('bottom',0)) ] # Generate rects for grouped plots currentRow = 0 for grouping in keyList: plots = self.groupedPlots[grouping] weights = self.groupedWeights[grouping] totalWeight = 1.0 * sum(weights) numPlots = len(plots) # hspace, wspace behavior defined in matplotlib/axes.py # in the class SubplotBase unitWidth = rowWidth / (numPlots + (numPlots-1) * wspace) availableWidth = unitWidth * numPlots wgap = unitWidth * wspace bottom = figTop - rowHeight - (rowHeight + hgap) * currentRow left = figLeft for i in range(0, len(plots)): plot = plots[i] weight = weights[i] myWidth = availableWidth * weights[i] / totalWeight rect = [left, bottom, myWidth, rowHeight] if self.usePlotParams and hasattr(plot,'plotParams'): rect = applyParams(rect, plot.plotParams) plotInfo.append((plot, rect)) left += myWidth + wgap currentRow += 1 # Generate rects for ungrouped plots for plot in self.plots: bottom = figTop - rowHeight - (rowHeight + hgap) * currentRow left = figLeft rect = [left, bottom, rowWidth, rowHeight] if self.usePlotParams and hasattr(plot,'plotParams'): rect = applyParams(rect, plot.plotParams) plotInfo.append((plot, rect)) currentRow += 1 # Plot everything for (plot, rect) in plotInfo: ax = fig.add_axes(rect) (currPlotHandles, currPlotLabels) = plot.drawPlot(fig, ax) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) if self.figTitle is not None: fig.suptitle(self.figTitle) for (key,val) in oldRCParams.items(): pylab.rcParams[key] = val return fig
def _doPlot(self): if len(self.groupedPlots) + len(self.plots) == 0: print "WeightedPlotLayout.plot(): No data to plot!" return oldRCParams = {} if self.rcParams is not None: for (key,val) in self.rcParams.items(): oldRCParams[key] = pylab.rcParams[key] pylab.rcParams[key] = val numRows = len(self.groupedPlots.keys()) + len(self.plots) maxRowLength = max([len(self.groupedPlots[f]) for f in self.groupedPlots.keys()]) if self.groupOrder is not None: keyList = self.groupOrder else: keyList = sorted(self.groupedPlots.keys()) if self.figdimensions is not None: fig = pyplot.figure(figsize=(self.figdimensions[0], self.figdimensions[1])) elif self.dimensions is not None: fig = pyplot.figure(figsize=(self.dimensions[0] * maxRowLength, self.dimensions[1] * numRows)) else: (figWidth, figHeight) = getGoldenRatioDimensions(8.0) figWidth *= maxRowLength figHeight *= numRows fig = pyplot.figure(figsize=(figWidth, figHeight)) plotHandles = [] plotLabels = [] # Force a call to plotParams since we need them here if self.plotParams is None: self.setPlotParameters(**dict()) figTop = self.plotParams["top"] figLeft = self.plotParams["left"] wspace = self.plotParams["wspace"] hspace = self.plotParams["hspace"] height = figTop - self.plotParams["bottom"] rowHeight = height / (numRows + (numRows - 1) * hspace) hgap = self.plotParams["hspace"] * rowHeight rowWidth = self.plotParams["right"] - figLeft # To contain a list of plots and rects, so we can do the # information collection in one pass plotInfo = [] def applyParams(r, pp): if pp is None: return r left, bottom, width, height = r return [ left + width * pp.get('left',0), bottom + height * pp.get('bottom',0), width * (pp.get('right',1) - pp.get('left',0)), height * (pp.get('top',1) - pp.get('bottom',0)) ] # Generate rects for grouped plots currentRow = 0 for grouping in keyList: plots = self.groupedPlots[grouping] weights = self.groupedWeights[grouping] totalWeight = 1.0 * sum(weights) numPlots = len(plots) # hspace, wspace behavior defined in matplotlib/axes.py # in the class SubplotBase unitWidth = rowWidth / (numPlots + (numPlots-1) * wspace) availableWidth = unitWidth * numPlots wgap = unitWidth * wspace bottom = figTop - rowHeight - (rowHeight + hgap) * currentRow left = figLeft for i in range(0, len(plots)): plot = plots[i] myWidth = availableWidth * weights[i] / totalWeight rect = [left, bottom, myWidth, rowHeight] if self.usePlotParams and hasattr(plot,'plotParams'): rect = applyParams(rect, plot.plotParams) plotInfo.append((plot, rect)) left += myWidth + wgap currentRow += 1 # Generate rects for ungrouped plots for plot in self.plots: bottom = figTop - rowHeight - (rowHeight + hgap) * currentRow left = figLeft rect = [left, bottom, rowWidth, rowHeight] if self.usePlotParams and hasattr(plot,'plotParams'): rect = applyParams(rect, plot.plotParams) plotInfo.append((plot, rect)) currentRow += 1 # Plot everything for (plot, rect) in plotInfo: ax = fig.add_axes(rect) (currPlotHandles, currPlotLabels) = plot.drawPlot(fig, ax) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) if self.figTitle is not None: fig.suptitle(self.figTitle) for (key,val) in oldRCParams.items(): pylab.rcParams[key] = val return fig
def _doPlot(self): if len(self.groupedPlots) + len(self.plots) == 0: raise BoomslangPlotRenderingException("No data to plot!") oldRCParams = {} if self.rcParams is not None: for (param, value) in self.rcParams.items(): oldRCParams[param] = pylab.rcParams[param] pylab.rcParams[param] = value groupedPlotLengths = [len(plots) for plots in self.groupedPlots.values()] if len(groupedPlotLengths) == 0: maxRowLength = self.width else: maxRowLength = max(groupedPlotLengths) numPlots = len(self.plots) if numPlots == 0: numExcessRows = 0 elif numPlots <= maxRowLength: numExcessRows = 1 elif numPlots % maxRowLength == 0: numExcessRows = numPlots / maxRowLength else: numExcessRows = (numPlots / maxRowLength) + 1 numRows = len(self.groupedPlots.keys()) + numExcessRows if self.groupOrder is not None: keyList = self.groupOrder else: keyList = self.groupedPlots.keys() currentRow = 0 if self.figdimensions is not None: fig = pyplot.figure(figsize=(self.figdimensions[0], self.figdimensions[1])) elif self.dimensions is not None: fig = pyplot.figure(figsize=(self.dimensions[0] * maxRowLength, self.dimensions[1] * numRows)) else: (figWidth, figHeight) = getGoldenRatioDimensions(8.0) figWidth *= maxRowLength figHeight *= numRows fig = pyplot.figure(figsize=(figWidth, figHeight)) plotHandles = [] plotLabels = [] for grouping in keyList: currentColumn = 1 plots = self.groupedPlots[grouping] numPlots = len(plots) for plot in plots: myRows = numRows myCols = numPlots myPos = (currentRow * numPlots) + currentColumn (currPlotHandles, currPlotLabels) = self._plot_subplot( plot = plot, fig = fig, rows = myRows, cols = myCols, pos = myPos, projection=plot.projection) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) currentColumn += 1 currentRow += 1 ungroupedPlotsRemaining = len(self.plots) if ungroupedPlotsRemaining > 0: currentColumn = 1 for plot in self.plots: if currentColumn == 1: numColumns = min(maxRowLength, ungroupedPlotsRemaining) myRows = numRows myCols = numColumns myPos = (currentRow * numColumns) + currentColumn (currPlotHandles, currPlotLabels) = self._plot_subplot( plot = plot, fig = fig, rows = myRows, cols = myCols, pos = myPos, projection=plot.projection) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) currentColumn += 1 if currentColumn > numColumns: currentRow += 1 currentColumn = 1 ungroupedPlotsRemaining -= 1 if self.figLegendLoc is not None: figLegendKeywords = {} if self.figLegendCols is not None: if not self._check_min_matplotlib_version(0, 98, 0): warnings.warn("Number of columns support not available in " "versions of matplotlib prior to 0.98") else: figLegendKeywords["ncol"] = self.figLegendCols fig.legend(plotHandles, plotLabels, self.figLegendLoc, **figLegendKeywords) if self.plotParams is not None: fig.subplots_adjust(left=self.plotParams["left"], bottom=self.plotParams["bottom"], right=self.plotParams["right"], top=self.plotParams["top"], wspace=self.plotParams["wspace"], hspace=self.plotParams["hspace"]) # Restore old RC params for (key,value) in oldRCParams.items(): pylab.rcParams[key] = value return fig
def _doPlot(self): if len(self.groupedPlots) + len(self.plots) == 0: raise BoomslangPlotRenderingException("No data to plot!") oldRCParams = {} if self.rcParams is not None: for (param, value) in self.rcParams.items(): oldRCParams[param] = pylab.rcParams[param] pylab.rcParams[param] = value groupedPlotLengths = [ len(plots) for plots in self.groupedPlots.values() ] if len(groupedPlotLengths) == 0: maxRowLength = self.width else: maxRowLength = max(groupedPlotLengths) numPlots = len(self.plots) if numPlots == 0: numExcessRows = 0 elif numPlots <= maxRowLength: numExcessRows = 1 elif numPlots % maxRowLength == 0: numExcessRows = numPlots / maxRowLength else: numExcessRows = (numPlots / maxRowLength) + 1 numRows = len(self.groupedPlots.keys()) + numExcessRows if self.groupOrder is not None: keyList = self.groupOrder else: keyList = self.groupedPlots.keys() currentRow = 0 if self.figdimensions is not None: fig = pyplot.figure(figsize=(self.figdimensions[0], self.figdimensions[1])) elif self.dimensions is not None: fig = pyplot.figure(figsize=(self.dimensions[0] * maxRowLength, self.dimensions[1] * numRows)) else: (figWidth, figHeight) = getGoldenRatioDimensions(8.0) figWidth *= maxRowLength figHeight *= numRows fig = pyplot.figure(figsize=(figWidth, figHeight)) plotHandles = [] plotLabels = [] for grouping in keyList: currentColumn = 1 plots = self.groupedPlots[grouping] numPlots = len(plots) for plot in plots: myRows = numRows myCols = numPlots myPos = (currentRow * numPlots) + currentColumn (currPlotHandles, currPlotLabels) = self._plot_subplot( plot=plot, fig=fig, rows=myRows, cols=myCols, pos=myPos, projection=plot.projection) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) currentColumn += 1 currentRow += 1 ungroupedPlotsRemaining = len(self.plots) if ungroupedPlotsRemaining > 0: currentColumn = 1 for plot in self.plots: if currentColumn == 1: numColumns = min(maxRowLength, ungroupedPlotsRemaining) myRows = numRows myCols = numColumns myPos = (currentRow * numColumns) + currentColumn (currPlotHandles, currPlotLabels) = self._plot_subplot( plot=plot, fig=fig, rows=myRows, cols=myCols, pos=myPos, projection=plot.projection) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) currentColumn += 1 if currentColumn > numColumns: currentRow += 1 currentColumn = 1 ungroupedPlotsRemaining -= 1 if self.figLegendLoc is not None: figLegendKeywords = {} if self.figLegendCols is not None: if not _check_min_matplotlib_version(0, 98, 0): warnings.warn("Number of columns support not available in " "versions of matplotlib prior to 0.98") else: figLegendKeywords["ncol"] = self.figLegendCols fig.legend(plotHandles, plotLabels, self.figLegendLoc, **figLegendKeywords) if self.plotParams is not None: fig.subplots_adjust(left=self.plotParams["left"], bottom=self.plotParams["bottom"], right=self.plotParams["right"], top=self.plotParams["top"], wspace=self.plotParams["wspace"], hspace=self.plotParams["hspace"]) # Restore old RC params for (key, value) in oldRCParams.items(): pylab.rcParams[key] = value if _check_min_matplotlib_version(1, 1, 0) and self.tight: fig.tight_layout() return fig
def __doPlot(self): if len(self.groupedPlots) + len(self.plots) == 0: print "PlotLayout.plot(): No data to plot!" return if self.rcParams is not None: pylab.rcParams.update(self.rcParams) groupedPlotLengths = [len(plots) for plots in self.groupedPlots.values()] if len(groupedPlotLengths) == 0: maxRowLength = self.width else: maxRowLength = max(groupedPlotLengths) numPlots = len(self.plots) if numPlots == 0: numExcessRows = 0 elif numPlots <= maxRowLength: numExcessRows = 1 elif numPlots % maxRowLength == 0: numExcessRows = numPlots / maxRowLength else: numExcessRows = (numPlots / maxRowLength) + 1 numRows = len(self.groupedPlots.keys()) + numExcessRows if self.groupOrder is not None: keyList = self.groupOrder else: keyList = self.groupedPlots.keys() currentRow = 0 if self.figdimensions is not None: fig = pyplot.figure(figsize=(self.figdimensions[0], self.figdimensions[1])) elif self.dimensions is not None: fig = pyplot.figure(figsize=(self.dimensions[0] * maxRowLength, self.dimensions[1] * numRows)) else: (figWidth, figHeight) = getGoldenRatioDimensions(8.0) figWidth *= maxRowLength figHeight *= numRows fig = pyplot.figure(figsize=(figWidth, figHeight)) # figWidth = fig.get_figwidth() # print figWidth # print fig.get_figheight() # (goldenWidth, goldenHeight) = getGoldenRatioDimensions(figWidth) # fig.set_figheight(goldenHeight) # print fig.get_figheight() plotHandles = [] plotLabels = [] for grouping in keyList: currentColumn = 1 plots = self.groupedPlots[grouping] numPlots = len(plots) for plot in plots: myRows = numRows myCols = numPlots myPos = (currentRow * numPlots) + currentColumn (currPlotHandles, currPlotLabels) = plot.subplot( myRows, myCols, myPos) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) # plotHandles.extend(currPlotHandles) # plotLabels.extend(currPlotLabels) currentColumn += 1 currentRow += 1 ungroupedPlotsRemaining = len(self.plots) if ungroupedPlotsRemaining > 0: currentColumn = 1 for plot in self.plots: if currentColumn == 1: numColumns = min(maxRowLength, ungroupedPlotsRemaining) myRows = numRows myCols = numColumns myPos = (currentRow * numColumns) + currentColumn (currPlotHandles, currPlotLabels) = plot.subplot( myRows, myCols, myPos) for i in xrange(len(currPlotHandles)): if currPlotLabels[i] in plotLabels: continue if isinstance(currPlotHandles[i], list): plotHandles.append(currPlotHandles[i][0]) else: plotHandles.append(currPlotHandles[i]) plotLabels.append(currPlotLabels[i]) currentColumn += 1 if currentColumn > numColumns: currentRow += 1 currentColumn = 1 ungroupedPlotsRemaining -= 1 if self.figLegendLoc is not None: figLegendKeywords = {} if self.figLegendCols is not None: versionPieces = [int(x) for x in matplotlib.__version__.split('.')] (superMajor, major, minor) = versionPieces[0:3] if superMajor == 0 and major < 98: print >>sys.stderr, "Number of columns support not available in versions of matplotlib prior to 0.98" else: figLegendKeywords["ncol"] = self.figLegendCols pylab.figlegend(plotHandles, plotLabels, self.figLegendLoc, **figLegendKeywords) if self.plotParams is not None: pylab.subplots_adjust(left=self.plotParams["left"], bottom=self.plotParams["bottom"], right=self.plotParams["right"], top=self.plotParams["top"], wspace=self.plotParams["wspace"], hspace=self.plotParams["hspace"])