2016-09-27 7 views
16

PChart를 사용하여 선형 차트를 만듭니다. 실제로 그려지는 선의 품질 옆에는 모든 것이 잘 어울립니다.PChart 선형 차트 이미지 품질

물론 안티 앨리어싱은 이 아니며이 아니며 명시 적으로 켜져 있습니다.

다음은 실제 이미지의 예입니다.이 모든 단계에서 상당히보기 흉하게 보입니다.

enter image description here

선이 스테핑없이, 부드럽게 그려 만들 수있는 방법이 있습니까? 사용

코드 :

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; 
} 
+0

http://pchart.sourceforge.net/documentation.php?topic=advexemple16. 이게 도움이 되겠습니까 –

+0

'$ pData-> setSerieWeight ($ serie, 1);를 제거하면 문제가 지속됩니까? – simon

답변

4

아무것도가 훨씬 더 큰 차트를 그릴 다음 ImageMagick이와 결과 이미지를 축소 할 수 없을 경우. 이는 명백한 추가 계산 비용이있는 최후의 해결책입니다. 원본 이미지가 두 배 큰 경우 계단 현상을 부드럽게, 하나에 네 개의 픽셀을 축소 것 같은 크기를 조정 (단순히 코드에서 당신이 두 차원을 두 배로)

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

: 예를 들어 라인의

5 단계 (0 %, 25 %, 50 %, 75 %, 100 %) 이미지를 더 크게 그릴 경우 선을 그릴 때 앤티 앨리어싱을 끌 수도 있습니다. 크기를 조정하면 어쨌든 모든 것이 부드럽게 처리되기 때문입니다.

글꼴 및 가독성 그래서 아마 두 개의 이미지를 그리려는, 문제가 될 수 있습니다 더 큰 규모

  • 단지 라인을;
  • 원래 범례의 나머지 범례/눈금자 등.

라인 이미지의 크기를 조정 한 후 두 이미지를 하나의 이미지로 겹쳐서 결합해야합니다. 이것은 ImageMagick으로도 가능합니다.

+0

예. 보고서에 30 개 이상의 이미지가있는 것을 감안할 때 ... –

+0

크기 조정의 문제가 아닙니다. 그것은 초기 이미지를 생성하는 문제입니다. pChart는 더 큰 이미지를 생성하는 데 많은 시간이 필요합니다. JFYI –

+0

그게 내가 생각한거야. 그러나 나는 그것에게 시도를 줘야했다 :) – pid

3

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'); 

enter image description here