Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Скрипт круговых диаграмм

В рамках подготовки скриптов для анализа логов счётчика я написал функцию, которая рисует круговые диаграммы. Передаёшь ей массив типа array("Считают, что я крутой" => 55, "Считают, что я лох" => 49), и она рисует круговую диаграммку. Вот например, такую.

30.28 КБ

Это по результатам посещаемости за воскресенье и понедельник. Собственные посещения (коих большинство) я вырезал для увеличения репрезентативности выборки. Смотрите, как всех рвёт фаерфокс! А вот Опера, походу, кэширует мой чёрный квадратик, и поэтому засчитывается в таком небольшом количестве. Да и хер с ней, говнобраузер.

Так вот, функция. Хочу ею с вами поделиться, берите, может, пригодится кому. GPL.
	/*
	  Рисует круговую диаграмму радиусом 200 пикселов и подписи к ней справа
	  @param array $_data данные для диаграммы в формате "имя" => "значение"
	  @return resource image
	  @copyright Copyright (c) 2009, Axshavan
	  @license http://www.gnu.org/licenses/gpl.html GNU GPL
	*/
	function draw_diagramm($_data)
	{
		$slice = 10; // количество нормально отображаемых элементов, всё, что больше, попадает в "Other"
		$result = imagecreatetruecolor(800, 400);
		imagefill($result, 200, 200, imagecolorallocate($result, 255, 255, 255));
		imageellipse($result, 200, 200, 399, 399, 0);	
		$summ  = 0;
		$count = 0;
		$other = 0;
		foreach($_data as $k => $v)
		{
			if($count > $slice)
			{
				$other += $v;
			}
			$summ += $v;
			$count++;
		}
		$other_sliced = $other + $_data['Other'];
		$_data = array_slice($_data, 0, $slice);
		if(!$_data['Other'] && $other_sliced)
		{
			$_data['Other'] = $other_sliced;
		}
		elseif($other)
		{
			$_data['Other'] += $other;
		}
		imageline($result, round(200 * sin(0) + 200), round(200 * cos(0) + 200), 200, 200, 0);
		$radsumm    = 0;
		$heightsumm = 0;
		foreach($_data as $k => $v)
		{
			$rad = 6.28 * ($v / $summ);
			$radsumm += $rad;
			$linex = 200 * sin($radsumm) + 200;
			$liney = 200 * cos($radsumm) + 200;
			imageline($result, 200, 200, round($linex), round($liney), 0);
			$fillx = 190 * sin($radsumm - $rad/2) + 200;
			$filly = 190 * cos($radsumm - $rad/2) + 200;
			$color = imagecolorallocate($result, rand(0, 255), rand(0, 255), rand(0, 255));
			imagefill($result, $fillx, $filly, $color);
			imagerectangle($result, 410, $heightsumm, 430, $heightsumm + 20, 0);
			imagefill($result, 412, $heightsumm + 2, $color);
			imagestring($result, 4, 435, $heightsumm, $k.' ('.round(100 * ($v/$summ), 2).'%)', 0);
			$heightsumm += 30;
		}
		return $result;	
	}
Для работы требует библиотеку GD.
Tags: web
Subscribe

  • Плёнка №199

    Всякая нудная техническая информация - что это за плёнка, чего фотографии такие контрастные, и так далее - расположена после снимка номер шесть. 1…

  • Ворчание по поводу политики

    У нас тут местное правительство ещё сильнее, чем было, ебанулось и охуело, и напринимало какие-то странные законы, которые выглядят как попытки…

  • Фотографии из мини-походика 18 июля

    На прошлой неделе мы со Славкой прошли пешком чуть больше 19 километров по южным предместьям Праги. Я выбрал маршрут таким образом, чтоб там были и…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments

  • Плёнка №199

    Всякая нудная техническая информация - что это за плёнка, чего фотографии такие контрастные, и так далее - расположена после снимка номер шесть. 1…

  • Ворчание по поводу политики

    У нас тут местное правительство ещё сильнее, чем было, ебанулось и охуело, и напринимало какие-то странные законы, которые выглядят как попытки…

  • Фотографии из мини-походика 18 июля

    На прошлой неделе мы со Славкой прошли пешком чуть больше 19 километров по южным предместьям Праги. Я выбрал маршрут таким образом, чтоб там были и…