cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTest Manager Web-UI - Graph Helpers - Implemented using matplotlib.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2012-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncavailable from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGeneral Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThe contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncof the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncYou may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncterms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard Python Import and extensions installed on the system.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom numpy import arange as numpy_arange; # pylint: disable=E0611
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager.webui.wuihlpgraphbase import WuiHlpGraphBase;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Base class for the matplotlib graphs. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Enables xkcd style graphs for implementations that supports it. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Wrapper around matplotlib.pyplot.figure that feeds the figure the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync basic graph configuration.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fXkcdStyle and matplotlib.__version__ > '1.2.9':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync matplotlib.rcParams.update({'font.size': self._cPtFont});
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFigure = matplotlib.pyplot.figure(figsize = (float(self._cxGraph) / self._cDpiGraph,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _produceSvg(self, oFigure, fTightLayout = True):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Creates an SVG string from the given figure. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._oDisp and self._oDisp.isBrowserGecko('20100101'):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # This browser will stretch images to fit if no size or width is given.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sSubstitute = r'\1 \3 reserveAspectRatio="xMidYMin meet"';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Chrome and IE likes to have the sizes as well as the viewBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sSubstitute = r'\1 \3 reserveAspectRatio="xMidYMin meet" \2 \4';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return re.sub(r'(<svg) (height="\d+pt") (version="\d+.\d+" viewBox="\d+ \d+ \d+ \d+") (width="\d+pt")',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync WuiHlpGraphMatplotlibBase.__init__(self, sId, oData, oDisp);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Sets the max range."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Extract/structure the required data.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oXRange = numpy_arange(self._oData.getGroupCount());
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.cxBarWidth = 1.0 / (len(aoTable[0].asValues) + 1.1);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Render the PNG.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoBars.append(oSubPlot.bar(oXRange + self.cxBarWidth * i,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oSubPlot.set_title('Title')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oSubPlot.set_xlabel('X-axis')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oSubPlot.set_xticks(oXRange + self.cxBarWidth);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oLegend = oSubPlot.legend(aoTable[0].asValues, loc = 'best', fancybox = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oSubPlot.set_ylabel('Y-axis')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.set_yticks(numpy_arange(fpMin, fpMax + (fpMax - fpMin) / 10 * 0, fpMax / 10));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.text(oRect.get_x() + oRect.get_width() / 2.0,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ha = 'center', va = 'bottom', rotation = 'vertical', alpha = 0.6, fontsize = 'small');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.text(oRect.get_x() + oRect.get_width() / 2.0,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ha = 'center', va = 'top', rotation = 'vertical', alpha = 0.6, fontsize = 'small');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Line graph.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __init__(self, sId, oData, oDisp = None, fErrorBarY = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # oData must be a WuiHlpGraphDataTableEx like object.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync WuiHlpGraphMatplotlibBase.__init__(self, sId, oData, oDisp);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Enables or Disables error bars, making this work like a line graph. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.errorbar(oSeries.aoXValues, oSeries.aoYValues, color = sColor);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.errorbar(oSeries.aoXValues, oSeries.aoYValues, color = sColor);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.errorbar(oSeries.aoXValues, oSeries.aoYValues,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync yerr = [oSeries.aoYErrorBarBelow, oSeries.aoYErrorBarAbove],
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync errorevery = len(oSeries.aoXValues) / self._cMaxErrorBars,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSubPlot.errorbar(oSeries.aoXValues, oSeries.aoYValues,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync yerr = [oSeries.aoYErrorBarBelow, oSeries.aoYErrorBarAbove],
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oLegend = oSubPlot.legend([oSeries.sName for oSeries in aoSeries], loc = 'best', fancybox = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # oSubPlot.axis('off');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oSubPlot.grid(True, 'major', axis = 'none');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oSubPlot.grid(True, 'both', axis = 'none');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync matplotlib.pyplot.setp(oSubPlot, xticks = [], yticks = []);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Line graph with an errorbar for the Y axis.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync WuiHlpLineGraph.__init__(self, sId, oData, fErrorBarY = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass WuiHlpMiniSuccessRateGraph(WuiHlpGraphMatplotlibBase):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Mini rate graph.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oData must be a WuiHlpGraphDataTableEx like object, but only aoSeries,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoSeries[].aoXValues, and aoSeries[].aoYValues will be used. The
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync values are expected to be a percentage, i.e. values between 0 and 100.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync WuiHlpGraphMatplotlibBase.__init__(self, sId, oData, oDisp);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #self.setWidth(512);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #self.setHeight(128);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync from mpl_toolkits.axes_grid.axislines import SubplotZero;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Disable all the normal axis.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Use the zero axis instead.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oAxis.plot(oSeries.aoXValues, oSeries.aoYValues, '.-', color = sColor, linewidth = 3);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oAxis.fill_between(oSeries.aoXValues, oSeries.aoYValues, facecolor = sColor, alpha = 0.5)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #oAxis.set_yticklabels([]);