| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Plugins\ImageGraph\StaticGraph; |
|
|
| use Piwik\Piwik; |
|
|
| class HorizontalBar extends GridGraph |
| { |
| public const INTERLEAVE = 0.30; |
| public const PADDING_CHARS = ' '; |
| public const LEGEND_SQUARE_WIDTH = 11; |
| public const MIN_SPACE_BETWEEN_HORIZONTAL_VALUES = 5; |
| public const LOGO_MIN_RIGHT_MARGIN = 3; |
|
|
| public function renderGraph() |
| { |
| $verticalLegend = false; |
|
|
| |
| foreach ($this->abscissaLogos as &$logoPath) { |
| $logoPath = $this->createResizedImageCopyIfNeeded($logoPath); |
| list($logoWidth, $logoHeight) = self::getLogoSize($logoPath); |
| $logoPathToHeight[$logoPath] = $logoHeight; |
| } |
|
|
| |
| list($maxLogoWidth, $maxLogoHeight) = self::getMaxLogoSize($this->abscissaLogos); |
|
|
| |
| $graphHeight = $this->getGraphBottom($horizontalGraph = true) - $this->getGridTopMargin($horizontalGraph = true, $verticalLegend); |
|
|
| list($abscissaMaxWidth, $abscissaMaxHeight) = $this->getMaximumTextWidthHeight($this->abscissaSeries); |
| list($ordinateMaxWidth, $ordinateMaxHeight) = $this->getMaximumTextWidthHeight($this->ordinateSeries); |
|
|
| $numberOfSeries = count($this->ordinateSeries); |
| $ordinateMaxHeight = $ordinateMaxHeight * $numberOfSeries; |
|
|
| $textMaxHeight = $abscissaMaxHeight > $ordinateMaxHeight ? $abscissaMaxHeight : $ordinateMaxHeight; |
|
|
| $minLineWidth = ($textMaxHeight > $maxLogoHeight ? $textMaxHeight : $maxLogoHeight) + (self::MIN_SPACE_BETWEEN_HORIZONTAL_VALUES * $numberOfSeries); |
| $maxNumOfValues = floor($graphHeight / $minLineWidth); |
| $abscissaSeriesCount = count($this->abscissaSeries); |
|
|
| if ($maxNumOfValues < $abscissaSeriesCount - 1) { |
| $sumOfOthers = array(); |
| $truncatedOrdinateSeries = array(); |
| $truncatedAbscissaLogos = array(); |
| $truncatedAbscissaSeries = array(); |
| foreach ($this->ordinateSeries as $column => $data) { |
| $truncatedOrdinateSeries[$column] = array(); |
| $sumOfOthers[$column] = 0; |
| } |
|
|
| $i = 0; |
| for (; $i < $maxNumOfValues; $i++) { |
| foreach ($this->ordinateSeries as $column => $data) { |
| $truncatedOrdinateSeries[$column][] = $data[$i]; |
| } |
|
|
| $truncatedAbscissaLogos[] = isset($this->abscissaLogos[$i]) ? $this->abscissaLogos[$i] : null; |
| $truncatedAbscissaSeries[] = $this->abscissaSeries[$i]; |
| } |
|
|
| for (; $i < $abscissaSeriesCount; $i++) { |
| foreach ($this->ordinateSeries as $column => $data) { |
| $sumOfOthers[$column] += $data[$i]; |
| } |
| } |
|
|
| foreach ($this->ordinateSeries as $column => $data) { |
| $truncatedOrdinateSeries[$column][] = $sumOfOthers[$column]; |
| } |
|
|
| $truncatedAbscissaSeries[] = Piwik::translate('General_Others'); |
| $this->abscissaSeries = $truncatedAbscissaSeries; |
| $this->ordinateSeries = $truncatedOrdinateSeries; |
| $this->abscissaLogos = $truncatedAbscissaLogos; |
| } |
|
|
| |
| $paddingText = ''; |
| $paddingWidth = 0; |
| if ($maxLogoWidth > 0) { |
| while ($paddingWidth < $maxLogoWidth + self::LOGO_MIN_RIGHT_MARGIN) { |
| $paddingText .= self::PADDING_CHARS; |
| list($paddingWidth, $paddingHeight) = $this->getTextWidthHeight($paddingText); |
| } |
| } |
|
|
| |
| $gridRightMargin = $this->getGridRightMargin($horizontalGraph = true); |
| $minGraphSize = ($this->width - $gridRightMargin) / 2; |
|
|
| $metricLegendWidth = 0; |
| foreach ($this->ordinateLabels as $column => $label) { |
| list($textWidth, $textHeight) = $this->getTextWidthHeight($label); |
| $metricLegendWidth += $textWidth; |
| } |
|
|
| $legendWidth = $metricLegendWidth + ((self::HORIZONTAL_LEGEND_LEFT_MARGIN + self::LEGEND_SQUARE_WIDTH) * $numberOfSeries); |
| if ($this->showLegend) { |
| if ($legendWidth > $minGraphSize) { |
| $minGraphSize = $legendWidth; |
| } |
| } |
|
|
| $gridLeftMarginWithoutLabels = $this->getGridLeftMargin($horizontalGraph = true, $withLabel = false); |
| $labelWidthLimit = |
| $this->width |
| - $gridLeftMarginWithoutLabels |
| - $gridRightMargin |
| - $paddingWidth |
| - $minGraphSize; |
|
|
| |
| foreach ($this->abscissaSeries as &$label) { |
| $label = $this->truncateLabel($label, $labelWidthLimit); |
| } |
|
|
| $gridLeftMarginBeforePadding = $this->getGridLeftMargin($horizontalGraph = true, $withLabel = true); |
|
|
| |
| foreach ($this->abscissaSeries as &$label) { |
| $label .= $paddingText; |
| } |
|
|
| $this->initGridChart( |
| $displayVerticalGridLines = false, |
| $bulletType = LEGEND_FAMILY_BOX, |
| $horizontalGraph = true, |
| $showTicks = false, |
| $verticalLegend |
| ); |
|
|
| $valueColor = $this->textColor; |
| $this->pImage->drawBarChart( |
| array( |
| 'DisplayValues' => true, |
| 'Interleave' => self::INTERLEAVE, |
| 'DisplayR' => $valueColor['R'], |
| 'DisplayG' => $valueColor['G'], |
| 'DisplayB' => $valueColor['B'], |
| ) |
| ); |
|
|
| |
| $graphData = $this->pData->getData(); |
| $numberOfRows = count($this->abscissaSeries); |
| $logoInterleave = $this->getGraphHeight(true, $verticalLegend) / $numberOfRows; |
| for ($i = 0; $i < $numberOfRows; $i++) { |
| if (isset($this->abscissaLogos[$i])) { |
| $currentLogoPath = $this->abscissaLogos[$i]; |
|
|
| if (isset($logoPathToHeight[$currentLogoPath])) { |
| $logoHeight = $logoPathToHeight[$currentLogoPath]; |
|
|
| $pathInfo = pathinfo($currentLogoPath); |
| $logoExtension = strtoupper($pathInfo['extension']); |
| $drawingFunction = 'drawFrom' . $logoExtension; |
|
|
| $logoYPosition = |
| ($logoInterleave * $i) |
| + $this->getGridTopMargin(true, $verticalLegend) |
| + $graphData['Axis'][1]['Margin'] |
| - $logoHeight / 2 |
| + 1; |
|
|
| if (method_exists($this->pImage, $drawingFunction)) { |
| $this->pImage->$drawingFunction( |
| $gridLeftMarginBeforePadding, |
| $logoYPosition, |
| $currentLogoPath |
| ); |
| } |
| } |
| } |
| } |
| } |
| } |
|
|