14

我正在使用 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;
}
4

2 回答 2

4

如果没有其他帮助将图表绘制得更大,然后使用 ImageMagick 缩小生成的图像。这是最后的解决方案,具有明显的额外计算成本。

这是一个示例行:

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

如果原始图像是两倍大(通过简单地将代码中的两个尺寸加倍),这样的调整大小会将四个像素合并为一个,从而在五个级别(0%、25%、50%、75%、 100%)。如果您将图像绘制得更大,您可以在绘制线条时关闭抗锯齿,因为调整大小无论如何都会使所有内容变得平滑。

字体和可读性可能会成为问题,所以也许你想画两张图:

  • 只是更大规模的线条;
  • 其余的图例/标尺等按原始比例。

调整线条图像的大小后,您必须通过将它们重叠成一个图像来组合这两个图像。这也可以使用 ImageMagick 来完成。

于 2016-10-14T19:31:54.003 回答
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');

在此处输入图像描述

于 2016-10-18T11:21:25.370 回答