DOBEERMAN NETPORT SYSTEMS

DOBEERMAN NETPORT SYSTEMS

.
: +15.. +17 C
: +12.. +14 C
: +18.. +20 C
: +21.. +23 C
. : 753
: 75 %
: 408
: 313
Ñàëîí ñâÿçè

Ïîñòðîåíèå ïñåâäîîáúåìíûõ ãðàôèêîâ â PHP

Ïîñòðîåíèå ïñåâäîîáúåìíûõ ãðàôèêîâ â PHP

 ýòîì óðîêå ìû ðàññìîòðèì ïðèìåð ïîñòðîåíèÿ óíèâåðñàëüíîé ïñåâäî-îáúåìíîé ãèñòîãðàììû. Åå ðàçìåð è ðàçìåð ïîäïèñè áóäåò çàâèñåòü îò ðàçìåðà èçîáðàæåíèÿ. (ñì. ðèñóíêè). Åäèíñòâåííîå, ÷òî íå áóäåò èçìåíÿòñÿ - ýòî êîëè÷åñòâî ðÿäîâ ãèñòîãðàììû.

×òî òàêîå ãèñòîãðàììà?

Ãèñòîãðàììà - (îò ãðå÷. histos, çäåñü - ñòîëá è ...ãðàììà), ñòîëá÷àòàÿ äèàãðàììà, îäèí èç âèäîâ ãðàôè÷åñêîãî èçîáðàæåíèÿ ñòàòèñòè÷åñêîãî ðàñïðåäåëåíèè êàêèõ-ëèáî âåëè÷èí ïî êîëè÷åñòâåííîìó ïðèçíàêó. Ã. ïðåäñòàâëÿåò ñîáîé ñîâîêóïíîñòü ñìåæíûõ ïðÿìîóãîëüíèêîâ, ïîñòðîåííûõ íà ïðÿìîé ëèíèè. Ïëîùàäü êàæäîãî ïðÿìîóãîëüíèêà ïðîïîðöèîíàëüíà ÷àñòîòå íàõîæäåíèÿ äàííîé âåëè÷èíû â èçó÷àåìîé ñîâîêóïíîñòè. Ïóñòü, íàïðèìåð, èçìåðåíèå äèàìåòðîâ ñòâîëîâ 624 ñîñåí äàëî ñëåäóþùèå ðåçóëüòàòû:

Äèàìåòð, ñì 14-22 22-30 30-38 38-62
×èñëî ñòâîëîâ 57 232 212 123


Ðèñóíîê 1


Ðèñóíîê 2

Íà ãîðèçîíòàëüíîé îñè îòêëàäûâàþòñÿ ãðàíèöû ãðóïï, íà êîòîðûå ñòâîëû ðàçáèòû ïî èõ äèàìåòðó, è íà îòðåçêå, ñîîòâåòñòâóþùåì êàæäîé ãðóïïå, ñòðîèòñÿ êàê íà îñíîâàíèè ïðÿìîóãîëüíèê ñ ïëîùàäüþ, ïðîïîðöèîíàëüíîé ÷èñëó ñòâîëîâ, ïîïàâøèõ â äàííóþ ãðóïïó (ðèñ. 1).

 âèäå Ã. ÷àñòî èçîáðàæàþò ãðàíóëîìåòðè÷åñêèé ñîñòàâ ãîðíûõ ïîðîä.  ýòîì ñëó÷àå íà âåðòèêàëüíîé îñè îòêëàäûâàþò ïðîöåíòíîå ñîäåðæàíèå ïîëó÷åííûõ ãðóïï ÷àñòèö ò. í. ôðàêöèé, à íà ãîðèçîíòàëüíîé îñè - ëîãàðèôìû èõ ãðàíè÷íûõ ðàçìåðîâ (ðèñ. 2). Èñïîëüçîâàíèå ëîãàðèôìîâ âûçâàíî òåì, ÷òî ïðè ãðàíóëîìåòðè÷åñêîì àíàëèçå ÷àñòèöû ïîäðàçäåëÿþòñÿ íà ôðàêöèè, ðàçìåðû êîòîðûõ óáûâàþò â ãåîìåòðè÷åñêîé ïðîãðåññèè. Èíîãäà Ã. ñòðîÿòñÿ íà ïðîèçâîëüíî âûáðàííûõ ðàâíûõ îòðåçêàõ, íåçàâèñèìî îò ðàçíîñòè ãðàíè÷íûõ ðàçìåðîâ ôðàêöèé. Òîãäà âûñîòû ñòîëáèêîâ ïðîïîðöèîíàëüíû ñîäåðæàíèþ ðàçìåðîâ ôðàêöèé.

Èñòî÷íèê: ÁÑÝ (Áîëüøàÿ Ñîâåòñêàÿ Ýíöèêëîïåäèÿ)

Ïñåâäî-îáúåìíîñòü

Òðàäèöèîííàÿ ãèñòîãðàììà äîñòàòî÷íî ïðîñòà â ïîñòðîåíèè, ïî ýòîìó ìû íåñêîëüêî óñëîæíèì çàäà÷ó - äîáàâèì îáúåìíîñòü. Ãèñòîãðàììà, êîòîðóþ áóäåò ñòðîèòü íàøà ïðîãðàììà áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:


Ïðèìåð âûâîäà ñòîëá÷àòîé äèàãðàììû. Èñõîäíûé òåêñò ñ êîììåíòàðèÿìè:


// Íà÷àëî php
// Çàäàåì âõîäíûå äàííûå ############################################
// Âõîäíûå äàííûå - òðè ðÿäà, ñîäåðæàùèå ñëó÷àéíûå äàííûå.
// Äåëåíèå íà 2 è 3 âçÿòî äëÿ òîãî ÷òîáû ïåðåäíèå ðÿäû íå
// çàãîðàæèâàëè çàäíèå.
// Ìàññèâ $DATA["x"] ñîäåðæèò ïîäïèñè ïî îñè "X"

$DATA=Array();

for ($i=0;$i<20;$i++) {
$DATA[0][]=rand(0,100*$i);
$DATA[1][]=rand(0,100*$i)/2;
$DATA[2][]=rand(0,100*$i)/3;
$DATA["x"][]=$i;
}

// Ôóíêöèÿ âûâîäà ïñåâäî-òðåõìåðíîãî êóáà ###########################
// $im - èäåíòèôèêàòîð èçîáðàæåíèÿ
// $x,$y - êîîðäèíàòû âåðõíåãî ëåâîãî óãëà êóáà
// $w - øèðèíà êóáà
// $h - âûñîòà êóáà
// $dx - ñìåùåíèå çàäíåé ãðàíè êóáà ïî îñè X
// $dy - ñìåùåíèå çàäíåé ãðàíè êóáà ïî îñè Y
// $c1,$c2,c3 - öâåòà âèäèìûõ ãðàíåé êóáà

function imagebar($im,$x,$y,$w,$h,$dx,$dy,$c1,$c2,$c3) {
if ($dx>0) {
imagefilledpolygon($im,
Array(
$x-1, $y-$h,
$x+$w-1, $y-$h,
$x+$w+$dx+1, $y-$h-$dy,
$x+$dx+1, $y-$dy-$h
), 4, $c1);

imagefilledpolygon($im,
Array(
$x+$w-1, $y-$h,
$x+$w-1, $y,
$x+$w+$dx+1, $y-$dy,
$x+$w+$dx+1, $y-$dy-$h
), 4, $c3);
}
imagefilledrectangle($im, $x, $y-$h, $x+$w, $y, $c2);
}

// Çàäàåì èçìåíÿåìûå çíà÷åíèÿ #######################################

// Ðàçìåð èçîáðàæåíèÿ
$W=500;
$H=300;

// Ïñåâäî-ãëóáèíà ãðàôèêà
$DX=30;
$DY=20;

// Îòñòóïû
$MB=20; // Íèæíèé
$ML=10; // Ëåâûé
$M=5; // Âåðõíèé è ïðàâûé îòñòóïû. Îíè ìåíüøå, òàê êàê òàì íåò òåêñòà

// Øèðèíà îäíîãî ñèìâîëà
$LW=imagefontwidth(2);

// Ïîäñ÷èòàåì êîëè÷åñòâî ýëåìåíòîâ (ñòîëáèêîâ) íà ãðàôèêå
$count=count($DATA[0]);
if (count($DATA[1])>$count) $count=count($DATA[1]);
if (count($DATA[2])>$count) $count=count($DATA[2]);

// Ïîäñ÷èòàåì ìàêñèìàëüíîå çíà÷åíèå
$max=0;
for ($i=0;$i<$count;$i++) {
$max=$max<$DATA[0][$i]?$DATA[0][$i]:$max;
$max=$max<$DATA[1][$i]?$DATA[1][$i]:$max;
$max=$max<$DATA[2][$i]?$DATA[2][$i]:$max;
}

// Óâåëè÷èì ìàêñèìàëüíîå çíà÷åíèå íà 10% (äëÿ òîãî, ÷òîáû ñòîëáèê
// ñîîòâåòñòâóþùèé ìàêñèìàëüíîìó çíà÷åíèå íå óïèðàëñÿ â â ãðàíèöó
// ãðàôèêà
$max=intval($max+($max/10));

// Ðàáîòà ñ èçîáðàæåíèåì ############################################

// Ñîçäàäèì èçîáðàæåíèÿ
$im=imagecreate($W,$H);

// Çàäàåì îñíîâíûå öâåòà

// Öâåò ôîíà (áåëûé)
$bg[0]=imagecolorallocate($im,255,255,255);

// Öâåò çàäíåé ãðàíè ãðàôèêà (ñâåòëî-ñåðûé)
$bg[1]=imagecolorallocate($im,231,231,231);

// Öâåò ëåâîé ãðàíè ãðàôèêà (ñåðûé)
$bg[2]=imagecolorallocate($im,212,212,212);

// Öâåò ñåòêè (ñåðûé, òåìíåå)
$c=imagecolorallocate($im,184,184,184);

// Öâåò òåêñòà (òåìíî-ñåðûé)
$text=imagecolorallocate($im,136,136,136);

// Öâåòà äëÿ ñòîëáèêîâ
$bar[2][0]=imagecolorallocate($im,255,128,234);
$bar[2][1]=imagecolorallocate($im,222,95,201);
$bar[2][2]=imagecolorallocate($im,191,65,170);
$bar[0][0]=imagecolorallocate($im,222,214,0);
$bar[0][1]=imagecolorallocate($im,181,187,65);
$bar[0][2]=imagecolorallocate($im,161,155,0);
$bar[1][0]=imagecolorallocate($im,128,234,255);
$bar[1][1]=imagecolorallocate($im,95,201,222);
$bar[1][2]=imagecolorallocate($im,65,170,191);

// Êîëè÷åñòâî ïîäïèñåé è ãîðèçîíòàëüíûõ ëèíèé
// ñåòêè ïî îñè Y.
$county=10;

// Ïîäðàâíÿåì ëåâóþ ãðàíèöó ñ ó÷åòîì øèðèíû ïîäïèñåé ïî îñè Y
$text_width=strlen($max)*$LW;
$ML+=$text_width;

// Âûâîä ôîíà ãðàôèêà
imageline($im, $ML, $M+$DY, $ML, $H-$MB, $c);
imageline($im, $ML, $M+$DY, $ML+$DX, $M, $c);
imageline($im, $ML, $H-$MB, $ML+$DX, $H-$MB-$DY, $c);
imageline($im, $ML, $H-$MB, $W-$M-$DX, $H-$MB, $c);
imageline($im, $W-$M-$DX, $H-$MB, $W-$M, $H-$MB-$DY, $c);
imagefilledrectangle($im, $ML+$DX, $M, $W-$M, $H-$MB-$DY, $bg[1]);
imagerectangle($im, $ML+$DX, $M, $W-$M, $H-$MB-$DY, $c);
imagefill($im, $ML+1, $H/2, $bg[2]);

// Âûâîä íåèçìåíÿåìîé ñåòêè (ãîðèçîíòàëüíûå ëèíèè íà
// íèæíåé ãðàíè è âåðòèêàëüíûå ëèíèè ñåòêè íà ëåâîé
// ãðàíè
for ($i=1;$i<3;$i++) {
imageline($im, $ML+$i*intval($DX/3),
$M+$DY-$i*intval($DY/3),
$ML+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$c);
imageline($im, $ML+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$W-$M-$DX+$i*intval($DX/3),
$H-$MB-$i*intval($DY/3),
$c);
}

// Ïåðåñ÷èòàåì ðàçìåðû ãðàôèêà ñ ó÷åòîì ïîäïèñåé è îòñòóïîâ
$RW=$W-$ML-$M-$DX;
$RH=$H-$MB-$M-$DY;

// Êîîðäèíàòû íóëåâîé òî÷êè ãðàôèêà
$X0=$ML+$DX;
$Y0=$H-$MB-$DY;

// Âûâîä èçìåíÿåìîé ñåòêè (âåðòèêàëüíûå ëèíèè ñåòêè íà íèæíåé ãðàíè ãðàôèêà
// è âåðòèêàëüíûå ëèíèè íà çàäíåé ãðàíè ãðàôèêà)
for ($i=0;$i<$count;$i++) {
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count)-$DX,$Y0+$DY,$c);
imageline($im,$X0+$i*($RW/$count),$Y0,$X0+$i*($RW/$count),$Y0-$RH,$c);
}

// Ãîðèçîíòàëüíûå ëèíèè ñåòêè çàäíåé è ëåâîé ãðàíåé.
$step=$RH/$county;
for ($i=0;$i<=$county;$i++) {
imageline($im,$X0,$Y0-$step*$i,$X0+$RW,$Y0-$step*$i,$c);
imageline($im,$X0,$Y0-$step*$i,$X0-$DX,$Y0-$step*$i+$DY,$c);
imageline($im,$X0-$DX,$Y0-$step*$i+$DY,
$X0-$DX-($ML-$text_width)/4,$Y0-$step*$i+$DY,$text);
}

// Âûâîä êóáîâ äëÿ âñåõ òðåõ ðÿäîâ
for ($i=0;$i<$count;$i++)
imagebar($im, $X0+$i*($RW/$count)+4-1*intval($DX/3),
$Y0+1*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[0][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[0][0], $bar[0][1], $bar[0][2]);

for ($i=0;$i<$count;$i++)
imagebar($im, $X0+$i*($RW/$count)+4-2*intval($DX/3),
$Y0+2*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[1][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[1][0], $bar[1][1], $bar[1][2]);

for ($i=0;$i<$count;$i++)
imagebar($im, $X0+$i*($RW/$count)+4-3*intval($DX/3),
$Y0+3*intval($DY/3),
intval($RW/$count)-4,
$RH/$max*$DATA[2][$i],
intval($DX/3)-5,
intval($DY/3)-3,
$bar[2][0], $bar[2][1], $bar[2][2]);

// Âûâîä ïîäïèñåé ïî îñè Y
for ($i=1;$i<=$county;$i++) {
$str=intval(($max/$county)*$i);
imagestring($im,2, $X0-$DX-strlen($str)*$LW-$ML/4-2,
$Y0+$DY-$step*$i-imagefontheight(2)/2,
$str,$text);
}

// Âûâîä ïîäïèñåé ïî îñè X
$prev=100000;
$twidth=$LW*strlen($DATA["x"][0])+6;
$i=$X0+$RW-$DX;

while ($i>$X0-$DX) {
if ($prev-$twidth>$i) {
$drawx=$i+1-($RW/$count)/2;
if ($drawx>$X0-$DX) {
$str=$DATA["x"][round(($i-$X0+$DX)/($RW/$count))-1];
imageline($im,$drawx,$Y0+$DY,$i+1-($RW/$count)/2,$Y0+$DY+5,$text);
imagestring($im,2, $drawx+1-(strlen($str)*$LW)/2 ,$Y0+$DY+7,$str,$text);
}
$prev=$i;
}
$i-=$RW/$count;
}

header("Content-Type: image/png");

// Ãåíåðàöèÿ èçîáðàæåíèÿ
ImagePNG($im);
imagedestroy($im);
// Êîíåö php

Ðåçóëüòàò ðàáîòû ýòîé ïðîãðàììû âûãëÿäèò ñëåäóþùèì îáðàçîì:


$W=500; $H=350; $DX=30; $DY=20;


$W=500; $H=150; $DX=30; $DY=20;


$W=200; $H=500; $DX=30; $DY=20;
Íà ñåãîäíÿ âñå...
: 14 2009 | : 2195 | [ + ]   [ - ]   |
2018 DOBEERMAN NETPORT SYSTEMS [ PG.t : 0.44 | DB.q : 13 | DB.t : 0.00 ]