Качество изображения линейной диаграммы 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;
}

person Your Common Sense    schedule 27.09.2016    source источник
comment
pchart.sourceforge.net/documentation.php?topic=advexemple16 . может это тебе поможет   -  person Anant Kumar Singh    schedule 27.09.2016
comment
Проблема сохраняется после удаления $pData->setSerieWeight($serie, 1);?   -  person simon    schedule 18.10.2016


Ответы (2)


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

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

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

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

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

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

После изменения размера линейного изображения вам нужно объединить оба изображения, перекрывая их в одно изображение. Это также можно сделать с помощью ImageMagick.

person pid    schedule 14.10.2016
comment
Дело не в изменении размера. Это вопрос создания начального изображения. pChart требует ОЧЕНЬ много времени, чтобы создать увеличенное изображение. JFYI - person Your Common Sense; 14.10.2016
comment
Это то, о чем я думал. Но надо было попробовать :) - person pid; 14.10.2016

Если вы удалите 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');

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

person Pawel Dubiel    schedule 18.10.2016