Качество изображения линейной диаграммы PChart

Я использую PChart для создания линейных диаграмм. Все хорошо сочетается с качеством фактических линий.

Конечно, сглаживание не выключается и даже явно включено.

Вот пример фактического изображения, которое выглядит совершенно уродливым со всеми этими шагами.

введите описание изображения здесь

Есть ли способ сделать линии более плавными, без шага?

Используемый код:

public function linearTwoAxis($data, $fileName, $startColor = 0)
{
    $pData = new \pData();

    $i = 0;
    foreach ($data as $key => $row)
    {
        $serie = $this->translator->trans("pages.reportDefault.$key");
        $pData->addPoints($row, $serie);
        $pData->setSerieOnAxis($serie, $i);
        $pData->setSerieWeight($serie, 1);
        $pData->setAxisName($i, $serie);
        $pData->setPalette($serie, $this->colors[$startColor++]);
        $pData->setAxisDisplay($i, AXIS_FORMAT_METRIC);
        $i++;
    }
    $monthNames = array_keys($row);

    $pData->setAxisPosition(1, AXIS_POSITION_RIGHT);
    $pData->addPoints($monthNames, "Labels");
    $pData->setAbscissa("Labels");

    $pChart = new \pImage(750, 200, $pData);

    $pChart->setFontProperties(array(
        "FontName" => $this->fonts_dir . "arial.ttf",
        "FontSize" => 8)
    );

    $pChart->setGraphArea(50, 10, 700, 150);
    $pChart->Antialias = TRUE;
    $pChart->drawScale(["Mode"  => SCALE_MODE_START0]);
    $pChart->drawLineChart();
    $pChart->drawLegend(325,180,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL, "BoxWidth"=>30,"Family"=>LEGEND_FAMILY_LINE,"Alpha" => 0));

    $pChart->render($this->target_dir . $fileName);

    return $this->target_dirname . $fileName;
}

Ответы

Ответ 1

Если ничто иное не помогает рисовать диаграмму намного больше, а затем уменьшать результирующее изображение с помощью ImageMagick. Это последнее решение, которое имеет очевидные дополнительные вычислительные затраты.

Что пример строки:

convert chart.png -resize 750×200 chart.jpg

Если исходное изображение в два раза больше (просто удваивая оба измерения, которые у вас есть в вашем коде), такой размер будет сворачивать четыре пиксела в один, сглаживая jaggies на пяти уровнях (0%, 25%, 50% 75%, 100%). Если вы рисуете изображение еще больше, вы можете отключить сглаживание при рисовании линий, потому что изменение размера все равно сгладит.

Шрифты и читаемость могут стать проблемой, поэтому, возможно, вы хотите нарисовать два изображения:

  • просто линии в большем масштабе;
  • остальные легенды/линейки и т.д. в оригинальной шкале.

После изменения размера изображения линии вам необходимо объединить оба изображения, наложив их на одно изображение. Это можно сделать и с ImageMagick.

Ответ 2

Если вы удалите setSerieWeight, это приведет к значительно лучшему сглаживанию. Например.

<?php 

require_once "class/pDraw.class.php"; require_once "class/pImage.class.php"; require_once "class/pData.class.php";

$pData = new \pData();

$data = array(array(0,100),array(100,200),array(200,500)); 



    $i = 0;
    foreach ($data as $key => $row)
    {
        $serie = 'test';
        $pData->addPoints($row, $serie);
        $pData->setSerieOnAxis($serie, $i);

        $pData->setAxisName($i, $serie);
        $pData->setPalette($serie,  array("R"=>74,"G"=>42,"B"=>112,"Alpha"=>100));
        $pData->setAxisDisplay($i, AXIS_FORMAT_METRIC);
        $i++;
    }
    $monthNames = array_keys($row);



    $pChart = new \pImage(750, 200, $pData);

    $pChart->setFontProperties(array(
        "FontName" =>  "arial.ttf",
        "FontSize" => 8)
    );

    $pChart->setGraphArea(50, 10, 700, 150);
    $pChart->Antialias = TRUE;
    $pChart->drawScale(["Mode"  => SCALE_MODE_START0]);
    $pChart->drawLineChart();
    $pChart->drawLegend(325,180,array("Style"=>LEGEND_BOX,"Mode"=>LEGEND_HORIZONTAL, "BoxWidth"=>30,"Family"=>LEGEND_FAMILY_LINE,"Alpha" => 0));

    $pChart->render('test.png');

введите описание изображения здесь