Exemplo n.º 1
0
/**
* Формирование графика.
*
* Функция формирует, а затем записывает в файл ($File) изображение графика по
* переданным пользователем данным($Lines). Данная функция может рисовать как одиночные,
* так и многолинейные графики.Исходными данными является массив, элементы которого также
* является массивами исходных данных для соответствующих графиков (данная структура
* сохраняется и для одиночных графиков!). Цвет каждой линии передается в массиве
* $Colors, ключи которого совпадают с ключами массива исходных данных. Цвет задается
* шестнадцатиричным кодом цвета (например, 0x000000 для черного цвета).
*
* @param string  <заголовок диаграммы>
* @param string  <полный путь с именем файла-результата>
* @param array   <исходные данные>
* @param array   <подписи к оси Ox>
* @param array   <цвета линий>
*/
function Artichow_Line($Name, $File, $Lines, $Labels, $Colors)
{
    #-----------------------------------------------------------------------------
    $Graph = new Graph(1000, 300);
    $Graph->setDriver('gd');
    $Graph->setAntiAliasing(TRUE);
    #-----------------------------------------------------------------------------
    $Graph->title->set($Name);
    $Graph->title->setFont(new Tuffy(15));
    $Graph->title->move(0, -5);
    #-----------------------------------------------------------------------------
    if (Count($Lines) > 1) {
        #---------------------------------------------------------------------------
        $Group = new PlotGroup();
        $Group->setPadding(40, 40);
        $Group->setBackgroundColor(new Color(240, 240, 240));
    }
    #-----------------------------------------------------------------------------
    $IsSetLabel = FALSE;
    #-----------------------------------------------------------------------------
    foreach ($Lines as $LineID => $Line) {
        #---------------------------------------------------------------------------
        $Plot = new LinePlot($Line);
        $Color = Color_RGB_Explode($Colors[$LineID]);
        $Plot->setColor(new Color($Color['R'], $Color['G'], $Color['B']));
        $Plot->setThickness(1);
        $Plot->setBackgroundGradient(new LinearGradient(new Color(240, 240, 240), new Color(255, 255, 255), 0));
        $Plot->setFillGradient(new LinearGradient(new LightOrange(10), new VeryLightOrange(90), 90));
        $Plot->setPadding(50, 50, 50, 50);
        #---------------------------------------------------------------------------
        $Plot->mark->setType(Mark::CIRCLE);
        $Plot->mark->setSize(5);
        #---------------------------------------------------------------------------
        $Plot->label->set($Line);
        $Plot->label->move(0, -15);
        $Plot->label->setBackgroundGradient(new LinearGradient(new Color(250, 250, 250, 10), new Color(255, 200, 200, 30), 0));
        $Plot->label->border->setColor(new Color(20, 20, 20, 20));
        $Plot->label->setPadding(2, 2, 2, 2);
        #---------------------------------------------------------------------------
        if (Count($Lines) < 2) {
            #-------------------------------------------------------------------------
            $Plot->xAxis->setLabelText($Labels);
            $Plot->yAxis->setLabelPrecision(1);
        } else {
            #-------------------------------------------------------------------------
            if (!$IsSetLabel) {
                #-----------------------------------------------------------------------
                $Plot->setXAxis(Plot::BOTTOM);
                $IsSetLabel = TRUE;
            }
        }
        #---------------------------------------------------------------------------
        if (Count($Lines) > 1) {
            $Group->add($Plot);
        }
        #---------------------------------------------------------------------------
        if (Count($Lines) > 1) {
            #-------------------------------------------------------------------------
            $Graph->add($Group);
            #-------------------------------------------------------------------------
            $Group->axis->bottom->setTickStyle(0);
            $Group->axis->bottom->setLabelText($Labels);
        } else {
            $Graph->add($Plot);
        }
    }
    #-----------------------------------------------------------------------------
    $Graph->draw($File);
    #-----------------------------------------------------------------------------
    return TRUE;
}
$group->axis->bottom->title->set("Axis des X : Quarante-deux plus un");
$group->axis->bottom->title->setBackgroundColor(new Color(255, 255, 255, 25));
$group->axis->bottom->title->setPadding(1, 0, 0, 0);
$group->axis->top->title->set("Axis des X : Treize plus douze");
$group->axis->top->title->setBackgroundColor(new Color(240, 200, 197, 25));
$group->axis->top->title->setPadding(1, 0, 0, 0);
$count = mt_rand(2, 4);
for ($n = 0; $n < $count; $n++) {
    $x = array();
    for ($i = 0; $i < 10; $i++) {
        $x[] = round(cos($i * M_PI / 10) * mt_rand(-20, 100));
    }
    $plot = new LinePlot($x);
    $plot->setColor(color());
    $plot->setFillColor(color(90));
    $plot->setXAxis(mt_rand(0, 1) ? PLOT_BOTTOM : PLOT_TOP);
    $plot->setYAxis(mt_rand(0, 1) ? PLOT_LEFT : PLOT_RIGHT);
    $plot->label->set($x);
    $plot->label->setColor(color(0));
    if ($n % 2 === 0) {
        $plot->label->setBackgroundColor(new Color(mt_rand(220, 240), mt_rand(220, 240), mt_rand(220, 240), mt_rand(15, 35)));
    }
    $plot->label->setPadding(1, 0, 0, 0);
    $group->add($plot);
    $group->legend->add($plot, str_repeat("#" . ($n + 1), mt_rand(1, 2)), $n % 2 ? LEGEND_LINE : LEGEND_BACKGROUND);
}
$group->legend->setColumns(2);
$group->legend->border->hide();
$group->legend->setSpace(20);
$group->legend->setBackgroundColor(new Color(245, 255, 255));
$group->setPadding(NULL, 130, NULL, NULL);
$group = new PlotGroup();
$group->setXAxisZero(FALSE);
$group->grid->setType(LINE_DASHED);
$group->setBackgroundColor(new Color(197, 180, 210, 80));
$group->setPadding(40, NULL, 20, NULL);
$group->axis->left->setLabelNumber(8);
$group->axis->left->setLabelPrecision(1);
$group->axis->left->setTickStyle(TICK_OUT);
$x = array(NULL);
for ($i = 1; $i < 10; $i++) {
    $x[] = cos($i * M_PI / 8) - 1;
}
$plot = new LinePlot($x);
$plot->setXAxis(PLOT_TOP);
$plot->setColor(new Color(40, 40, 150, 10));
$plot->setFillColor(new Color(40, 40, 150, 90));
$plot->mark->setType(MARK_BOOK);
$plot->mark->move(mt_rand(0, 10), mt_rand(0, 10));
$group->add($plot);
$x = array(NULL, NULL, NULL);
for ($i = 8; $i < 14; $i++) {
    $x[] = cos($i * M_PI / mt_rand(2, 8)) / 2 - 0.2;
}
$x[] = NULL;
$plot = new LinePlot($x);
$plot->setXAxis(PLOT_TOP);
$plot->setColor(new Color(120, 120, 30, 10));
$plot->setFillColor(new Color(120, 120, 30, 90));
$group->add($plot);
$graph->add($group);
$graph->draw();
    return new Color(mt_rand(20, 180), mt_rand(20, 180), mt_rand(20, 180), $a);
}
function label($value)
{
    return $value . ' %';
}
$graph = new Graph(400, 400);
$graph->setTiming(TRUE);
$graph->setAntiAliasing(TRUE);
$x = array();
for ($i = 0; $i < 5; $i++) {
    $x[] = mt_rand(-20, 100);
}
$plot = new LinePlot($x);
$plot->setBackgroundColor(color(80));
$plot->setXAxis(PLOT_BOTH);
$plot->setYAxis(PLOT_BOTH);
$plot->setColor(color());
$plot->setStyle(LINE_DOTTED);
$plot->grid->hideHorizontal(TRUE);
$plot->grid->setBackgroundColor(new Color(235, 235, 180, 60));
$plot->yAxis->setLabelNumber(mt_rand(0, 10));
$plot->yAxis->setLabelPrecision(1);
$plot->xAxis->label->hideFirst(TRUE);
$plot->xAxis->label->hideLast(TRUE);
$plot->label->set($x);
$plot->label->move(0, mt_rand(0, 20));
$plot->label->setCallbackFunction('label');
$plot->label->setColor(color(0));
$plot->label->setBackgroundColor(new Color(mt_rand(200, 240), mt_rand(200, 240), mt_rand(200, 240), mt_rand(0, 20)));
$plot->label->border->setColor(color());
    $group->axis->{$axis}->setLabelNumber(mt_rand(0, 10));
    $group->axis->{$axis}->setLabelPrecision(1);
}
foreach (array('top', 'bottom') as $axis) {
    $group->axis->{$axis}->label->hideLast(TRUE);
    $group->axis->{$axis}->label->hideFirst(TRUE);
    $group->axis->{$axis}->setTickInterval(mt_rand(17, 23));
    $group->axis->{$axis}->setLabelInterval(2);
}
for ($n = 0; $n < 2; $n++) {
    $x = array();
    for ($i = 0; $i < 500; $i++) {
        $x[] = cos($i * M_PI / 500) / ($n + 1) * mt_rand(800, 1200) / 1000;
    }
    $plot = new LinePlot($x);
    $plot->setColor(color());
    $plot->setFillColor(color(40));
    $plot->setXAxis($n % 2 ? 'top' : 'bottom');
    $plot->setYAxis($n % 2 ? 'left' : 'right');
    $group->add($plot);
    $group->legend->add($plot, "Line #" . ($n + 1), $n ? LEGEND_LINE : LEGEND_BACKGROUND);
}
$group->legend->border->setColor(color(0));
$group->legend->setTextColor(color(0));
$group->legend->setTextFont(new PHPFont(mt_rand(1, 3)));
$group->legend->setPadding(3, 3, 3, 3);
$group->legend->setRows(1);
$group->legend->setAlign(LEGEND_LEFT, LEGEND_BOTTOM);
$group->legend->setPosition(0.16, 0.86);
$graph->add($group);
$graph->draw();
}
for ($n = 0; $n < 4; $n++) {
    $x = array();
    for ($i = 0; $i < 50; $i++) {
        $x[] = (cos($i * M_PI / 100) / ($n + 1) * mt_rand(700, 1300) / 1000 - 0.5) * ($n % 2 ? -0.5 : 1) + ($n % 2 ? -0.4 : 0);
    }
    $plot = new LinePlot($x, mt_rand(0, 1) ? LINEPLOT_LINE : LINEPLOT_MIDDLE);
    $plot->setColor(color());
    $plot->setFillGradient(new LinearGradient(color(60), color(60), 90));
    $y = array();
    foreach ($x as $v) {
        $y[] = sprintf("%.2f", $v);
    }
    $plot->label->set($y);
    $plot->label->setColor(color(0));
    $plot->label->setBackgroundColor(new Color(mt_rand(220, 240), mt_rand(220, 240), mt_rand(220, 240), mt_rand(10, 20)));
    $plot->label->setPadding(1, 0, 0, 0);
    $plot->label->setInterval(12);
    $plot->label->setFont(new Tuffy(6));
    $plot->setXAxis(PLOT_BOTTOM);
    $plot->setYAxis(PLOT_LEFT);
    $group->add($plot);
    $group->legend->add($plot, "Line #" . ($n + 1));
}
$group->legend->setAlign(LEGEND_CENTER, LEGEND_TOP);
$group->legend->setPosition(0.87, 0.1);
$graph->shadow->setSize(mt_rand(10, 20));
$graph->shadow->setPosition(mt_rand(1, 4));
$graph->shadow->smooth(mt_rand(0, 1) ? TRUE : FALSE);
$graph->add($group);
$graph->draw();