/** * Render the horizontal axis * * @param RenderContext $ctx The context to use for rendering * @param DOMElement $group The DOMElement this axis will be added to */ private function renderHorizontalAxis(RenderContext $ctx, DOMElement $group) { $steps = $this->ticksPerX($this->xUnit->getTicks(), $ctx->getNrOfUnitsX(), $this->minUnitsPerStep); $ticks = $this->ticksPerX($this->xUnit->getTicks(), $ctx->getNrOfUnitsX(), $this->minUnitsPerTick); // Steps should always be ticks if ($ticks !== $steps) { $steps = $ticks * 5; } // Check whether there is enough room for regular labels $labelRotationStyle = $this->labelRotationStyle; if ($this->labelsOversized($this->xUnit, 6)) { $labelRotationStyle = self::LABEL_ROTATE_DIAGONAL; } /* $line = new Line(0, 100, 100, 100); $line->setStrokeWidth(2); $group->appendChild($line->toSvg($ctx)); */ // contains the approximate end position of the last label $lastLabelEnd = -1; $shift = 0; $i = 0; foreach ($this->xUnit as $label => $pos) { if ($i % $ticks === 0) { /* $tick = new Line($pos, 100, $pos, 101); $group->appendChild($tick->toSvg($ctx)); */ } if ($i % $steps === 0) { if ($labelRotationStyle === self::LABEL_ROTATE_HORIZONTAL) { // If the last label would overlap this label we shift the y axis a bit if ($lastLabelEnd > $pos) { $shift = ($shift + 5) % 10; } else { $shift = 0; } } $labelField = new Text($pos + 0.5, ($this->xLabel ? 107 : 105) + $shift, $label); if ($labelRotationStyle === self::LABEL_ROTATE_HORIZONTAL) { $labelField->setAlignment(Text::ALIGN_MIDDLE)->setFontSize('2.5em'); } else { $labelField->setFontSize('2.5em'); } if ($labelRotationStyle === self::LABEL_ROTATE_DIAGONAL) { $labelField = new Rotator($labelField, 45); } $labelField = $labelField->toSvg($ctx); $group->appendChild($labelField); if ($this->drawYGrid) { $bgLine = new Line($pos, 0, $pos, 100); $bgLine->setStrokeWidth(0.5)->setStrokeColor('#BFBFBF'); $group->appendChild($bgLine->toSvg($ctx)); } $lastLabelEnd = $pos + strlen($label) * 1.2; } $i++; } }