2016-09-27 10 views
16

मैं रैखिक चार्ट बनाने के लिए पीसीहार्ट का उपयोग कर रहा हूं। तैयार की गई वास्तविक रेखाओं की गुणवत्ता के बगल में सब ठीक हो जाता है।पीसीहार्ट रैखिक चार्ट छवि गुणवत्ता

बेशक, एंटीअलाइजिंग बंद नहीं हुआ है, और यहां तक ​​कि स्पष्ट रूप से चालू भी है।

यहां वास्तविक छवि का एक उदाहरण है, जो इन सभी चरणों के साथ काफी बदसूरत दिखता है।

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 

एक में चार पिक्सल पतन होता है, jaggies बाहर चौरसाई पांच स्तरों पर (0%, 25%, 50%, 75%, 100%)। यदि आप छवि को और भी बड़ा खींचते हैं तो आप लाइनों को चित्रित करते समय एंटी एलियासिंग बंद कर सकते हैं, क्योंकि आकार बदलने से सबकुछ सुगम हो जाएगा।

फ़ॉन्ट्स और पठनीयता एक समस्या बन सकता है, तो हो सकता है आप दो छवियों आकर्षित करने के लिए करना चाहते हैं:

  • सिर्फ एक बड़े पैमाने पर लाइनों;
  • शेष किंवदंती/शासकों और मूल पैमाने पर।

लाइन छवि का आकार बदलने के बाद, आपको दोनों छवियों को एक ही छवि में ओवरलैप करके जोड़ना होगा। यह ImageMagick के साथ भी किया जा सकता है।

+0

हाँ। रिपोर्ट में 30+ छवियां दी गई हैं ... –

+0

यह आकार बदलने का मामला नहीं है। यह प्रारंभिक छवि उत्पन्न करने का मामला है। PChart एक बड़ी छवि उत्पन्न करने के लिए बहुत समय लगता है। जेएफवाईआई –

+0

यही मैंने सोचा था। लेकिन मुझे इसे आज़मा देना था :) – pid

3

यदि आप सेटसेरीवेइट को हटाते हैं तो यह बहुत बेहतर एंटीअलाइजिंग पैदा करता है। उदाहरण के लिए।

<?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

संबंधित मुद्दे