Web → Створення кругової діаграми в SVG + PHP

Кругова діаграма

Побудовою діаграм в форматі SVG я зацікавився коли налаштовував PHP frontend для vnStat, тоді ж й бажав розібратися в принципах роботи, але згодом успішно про це забув. В цій нотатці виправлятиму дану ситуацію.

SVG (від англ. Scalable Vector Graphics — масштабована векторна графіка) мова розмітки масштабованої векторної графіки, створена W3C, яка входить до підмножина розширюваних мов розмітки XML, призначена для опису двовимірної векторної і змішаної векторно/растрової графіки в форматі XML (© Wiki).

Якщо спростити, SVG — це звичайний XML файл (текстовий), що містить опис графіки. Безпосередня генерація картинки проводиться засобами браузера на стороні клієнта.

Для початку розглянемо приклад:









Він описує ось таку картинку (точки були позначені згодом):

Приклад кругової діаграми

Я буду візуалізувати вигадану статистику популярності браузерів, кожен елемент (колір) — це один браузер. Для створення секції використовується тег <path>, що дозволяє описувати довільні фігури.

Початком фігури завжди є центр діаграми (A), обраховувати ж потрібно дві точки — початок (B) й кінець (C) сектора кола.

Як би не сумно було признавати, але шкільний курс тригонометрії я забув повністю, ніколи не думав, що мені стануть в нагоді синуси й косинуси. З наскоку розібратися в чужих скріптах теж не вдалося, тому пішов штудіювати тригонометричні функції. Знання повернулися швидко :)

Тригонометричі функції

Синусом є відношення Синус, а косинусом Косинус.

Виведемо необхідні нам координати YB = R × sin α, XB = R × cos α.

Слід врахувати, що отримані з даних формул координати, будуть достовірні для декартової системи координат. Нам прийдеться їх трохи перетворити, ібо при генерації SVG, об’єкти з від’ємними координатами не будуть відображатися.

 250,
			  'Chrome' => 80,
			  'Opera' => 150,
			  'IE' => 60,
			  'Opera Mini' => 15
			  );
$radius = 140;
//координати центру діаграми
$cx = 150;
$cy = 150;
?>



	
	
 'edd300',
			   '754f5a',
			   '3466a5',
			   '4e9a06',
			   'cc0001'
			   );

$total = array_sum($data);

//обрахунок і вивід діаграми
$i = 0;
$prev = 0;
$fangel = 0;
foreach ($data as $k => $v){

	$percent = $v / $total;
	$angel = 360 * $percent;
	$fangel += $angel;
	$rad = deg2rad($fangel);

	$dx = round($cx + $radius * cos($rad), 2);
	$dy = round($cy - $radius * sin($rad), 2);

	$dxp = round($cx + $radius * cos($prev), 2);
	$dyp = round($cy - $radius * sin($prev), 2);

	//якщо секція займає більше ніж 50% потрібно змінити тип
	$percent > 0.5 ? $sec = 1 : $sec = 0;
	echo '
',"\n\n";

	$i++;
	$prev = $rad;
}
?>

 $v){
	$x = 10;
	$y = $prev;
	$xt = $x + 15;
	$yt = $y + 9;
	echo '',"\n";
	echo ''. $k .' - '.  $v .'',"\n";
	$i++;
	$prev = $y + 15;
}
?>

Код містить коментарі, думаю проблем бути не має. Тег— дозволяє задавати певні атрибути для групи елементів.

Результат:

В SVG доволі легко працювати з JavaScript, це дозволяє придати інтерактивності діаграмі.

Звісно це все лише приклади, й в такому вигляді їх ніде не застосуєш, та загалом SVG доволі перспективна технологія й безумовно варта уваги.

Основні переваги й недоліки:
+ Текстовий формат, зручно редагувати (при необхідних навичках)
+ Масштабованість
+ Можливість створювати анімацію
+ Відкритість
– Великий розмір (але є можливість використовувати стиснутий формат SVGZ)
– Необхідність завантажувати цілий документ для роботи з його частиною (актуально для картографічних проектів)

P.S.
Для генерації різноманітних діаграм і графіків часто зручніше використовувати готові класи.

17.06.2010 10:19 Автор: Strange_V Хіти: 444

Напишіть відгук

Ваша пошт@ не публікуватиметься. Обов’язкові поля позначені *

*

Можна використовувати XHTML теґи та атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>