G|Translate: English EN Français FR Deutsch DE Italiano IT Русский RU Español ES

Используем PHP и псевдографику для простой гистограммы

5/5 - (1 голос)

Вот такой вывод «гистограммы» на основе данных массива

Используем PHP и псевдографику для простой гистограммы 

Нет никаких графических библиотек, чистый PHP и символ псевдографики (ASCII 2593). Разная насыщенность:

  • значение более 70% от размера ячейки
  • значение менее полного размера ячейки
  • нет значения — фон

Для построения используется цифровой массив — могут быть положительные и отрицательные данные.

Массив ниже — данные вначале более актуальные по времени, поэтому в коде используется реверс (что бы эти данные оказались справа на гистограмме)

$arr_count = array (150,145,20,10,5,0,99,85,41,34,21,56,75,46,78,34,125,130,128,10,15,24,50,30,20,0,10,20,30,50,30,20,10,5,0,5,10,20,30,50,150,145);

Да  — точность не особо высокая, но это гистограмма для оценки ситуации. Можно использовать в админке для служебных целей или для простого вывода на странице.

Вот еще «график» при наличии отрицательных значений в массиве

Используем PHP и псевдографику для простой гистограммы

Сами данные ниже, есть отрицательные значения

$arr_count = array (150,145,20,10,5,0,99,85,41,34,21,56,75,46,78,34,125,130,128,10,15,24,50,30,20,0,-10,-20,-30,-50,-30,-20,-10,-5,0,5,10,20,30,50,150,145);

 

Код PHP — функция вызывается с передачей ей цифрового массива.

Параметры:

  • массив
  • необходимость реверса массива (по умолчанию False)
  • высота вывода в строках, по умолчанию 20.
echo tsl_graph ($arr_count);

/////----------------------------------------------------------------
function tsl_graph ($arr_count, $revesr_arr = FALSE, $high_star = 20) {
	//$arr_count - числовой массив для вывода с использованием псевдографики
	//$revesr_arr - необходимость реверса массива, по умолчанию FALSE
	//$high_star - число строк для вывода "графики", по умолчанию 20
	
	$count_total = array_sum($arr_count) ; 	//сумма данных в массиве
	$arr_count_new = ($revesr_arr ? array_reverse($arr_count) : $arr_count); //реверс	
	$len_count_total = count($arr_count_new); 	//число элементов массива

	$max_array = max($arr_count_new); 
	$min_array_var = min($arr_count_new);
	$min_array = ($min_array_var < 0 ? $min_array_var : 0); //диапазон с учетом отрицательных значений
	$pik_arr = ($max_array - $min_array)/$high_star; 	//значение одного "деления" по вертикали
		
	$graph_line = '';
	$num_line = $high_star; 	//самая верхняя строка графика
	//сверху вниз
    while ($num_line > 0) {
		
		//формируем строку, используем одинаковый символ с разным цветом - иначе разная ширина
		$star_line = '';
		$num_element = 0;
		$shift = $min_array/$pik_arr ;  //смещение при наличии отрицательных чисел
		while ($num_element < $len_count_total) {
			$virt_line = $num_line + $shift ; //для 0 без изменений, для отрицательного будет вычитаться
					
			if ( ($arr_count_new[$num_element] > 0) && ($virt_line > 0 ) ) { //для положительных чисел и положительных строк
				$tail = $arr_count_new[$num_element] - ($pik_arr*($virt_line-1)); //хвост
				if ($tail >= ($pik_arr*0.7)){ // красим полностью при 70%
					$star_line .= '▓'; 
				}elseif ($tail >0 && $tail < $pik_arr) {
					$star_line .= ''; // слабый серый для мелких показаний
				}else{
					$star_line .= ''; //фон
				}
			}elseif ( ($arr_count_new[$num_element] < 0) && ($virt_line <= 0 ) ){ //для отрицательных чисел и линии 0, -1, -2
				$tail = abs($arr_count_new[$num_element]) + ($pik_arr*($virt_line)); //хвост
				if ($tail >= ($pik_arr*0.7)){ // красим полностью при 70%
					$star_line .= '▓'; 
				}elseif ($tail >0 && $tail < $pik_arr) {
					$star_line .= ''; // слабый серый для мелких показаний
				}else{
					$star_line .= ''; //фон
				}
			}else{ // ноль - делать черту не работает = ширина разная и график разваливается
				$star_line .= '';				
			}
			
			$num_element = $num_element + 1;
		}	
		//сборка элементов массива в одну строку с переводами строк
		$graph_line .= $star_line.'
';
		$num_line = $num_line - 1;
	}
return '
'.$graph_line.'
Total '.$count_total.'
';
}

Комментарии:

  • используется символ псевдографики (ASCII 2593)
  • символ используется и для гистограммы и для фона (серым цветом)
  • разные символы использовать нельзя, т.к. шрифты в разных браузерах могут быть разными и толщина их тоже может быть разной
  • можно использовать реверс массива, т.к. обычно более свежие данные в начале массива (в начале таблицы), а на графике они должны оказаться справа — при желании можно отключить, код простой
  • функция возвращает строку html с графиком и суммой элементов массива
  • гистограмма использована вместо точек графики из-за того, что эти символы «прилипают» друг к другу, использование «звездочек» дает некрасивую картинку
  • никакой защиты от некорректных данных в функции нет — можно при желании доработать

 

ВАЖНО: если WordPress что-то испортил в коде на этой странице — пишите через обратную связь (или site_post@bk.ru), вышлю файл PHP.

Можно, например, использовать для визуализации результатов логов по месяцам

Используем PHP и псевдографику для простой гистограммы

Как собрать информацию из лога по месяцам — читаем статью ниже

Алгоритм суммы одинаковых элементов массива

Вырезаем первые 7 символов из лога (как раз год-месяц) и считаем элементы по изменению этого поля. Никаких сложных формул по работе с датами.

 

Подпишитесь в VKontakte - нажмите кнопку
Подпишитесь в Telegram - нажмите кнопку
Наша группа ODNOKLASSNIKI

Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла




Пишите на электронную почту (тема и email будут добавлены автоматически в письмо)

В Вашем браузере должна быть настроена обработка ссылок mailto

site_post@bk.ru

или просто скопируйте адрес e-mail



Последние публикации

  • Статьи от: GoodWin
  • Рубрика: Блог
  • Сортировка: дата публикации по убыванию

Яндекс Metrika добавила кнопку на фронтенд

05.08.2022
Публикация 2 месяца назад
На сайтах появилась новая кнопка Вот она - маленькая, круглая справа внизу, рядом с кнопкой "Наверх" При нажатии появляется статистика Яндекс.Метрика. Вообще это некрасиво. Счетчик должен считать - а не добавлять что-то на сайт.  Скрипт, которые Вы установили на сайт для подсчета посетителей - начал что-то добавлять на фронтенде Вашего сайта - и Вас никто не спрашивал. Да - конечно, статистика показывается только владельцу счетчика (т.е. он зарегистрирован в текущей сессии в Яндексе под своим логином). Модуль статистики на сайте Показывать статистику прямо на сайте для владельца счетчика. Статистика будет отображаться только при условиях: ваш браузер...
(Читать полностью...)

Пароль для внешних приложений mail.ru

10.07.2022
Публикация 3 месяца назад
Упс... А что случилось? Пришло письмо на почту. А что это? А это Вы используется сервер SMTP Вашего почтового ящика от mail.ru на своем сайте - и он перестал работать :( Читаем статью  Как отправить e-mail с сайта? И теперь всё перестало работать - где-то с июня 2022 г. Почта mail.ru ввела дополнительную защиту аккаунта Теперь Ваш пароль от почтового ящика работает только для Вас. Для входа в аккаунт и для использования почты. Если Вы хотите использовать сервер SMTP для отправки почты с сайта - Вам теперь нужен отдельный пароль для приложений. Если враги его узнают - они не получат доступа к аккаунту,  с его помощью можно только получать и оправлять письма с помощью...
(Читать полностью...)

Как выбрать регистратора доменов в 2022 году

14.06.2022
Публикация 3 месяца назад
Простой вопрос. Выбираем подешевле - и вперед? Какая разница? Цена за регистрацию и за продление обычно разная Да, есть такое дело. Цена может отличаться в 4 раза. Срок регистрации для доменов в зоне .RU один год, первый год - дешево, потом дороже. Но это не является совсем уж ключевым параметром. Есть другая проблема - часть регистраторов занимается "продажей" услуг в нагрузку.  Добавление навязанных услуг в корзину - очень плохой вариант Невозможно купить нормально домен - смотрим примеры выбираем домен и добавляем его в корзину Упс, добавилась позиция за 89 руб.  Т.е. не просто добавили товар с нулевой стоимостью в рамках акции - а добавили то, что клиент не...
(Читать полностью...)

Приключение пробелов и TAB в html

11.12.2021
Публикация 10 месяцев назад
Крайне забавная тема. Вот они. Мнемоника - специальный синтаксис для указания символов в html коде. Читаем Мнемоники в HTML Символ пробела, ASCII / UNICOD код 32 В спецификации HTML сделана интересная схема отображения пробелов: несколько пробелов между символами отображается как один несколько пробелов до символа отображаются как один один пробел на пустой строке не отображается внутри тэгов <pre> показываются все пробелы Зачем это сделано? Для удобства редактирования кода html руками :) Вот пример кода в тегах <pre> <p><b> пример текста пример текста пример текста </b></p> данный текст отобразится как пример текста...
(Читать полностью...)

Алгоритм суммы одинаковых элементов массива (на примере Python)

09.12.2021
Публикация 10 месяцев назад
Простая задача - посчитать количество одинаковых элементов массива Глазами легко видеть, что суммы правильные :) Попробуем теперь сделать тоже самое программно. Используем  Python.  Логика кажется очень простой: делаем счетчик складываем при смене элемента счетчик обнуляем выводим то, что насчитали Поехали. Будет картинками, правильный код в виде текста будет в конце статьи. Используем интерпретатор Питона по ссылке https://www.online-python.com/ Варианты неправильного кода для подсчета числа элементов массива Конечно, массив надо сначала отсортировать, что бы одинаковые элементы были рядом. Будем считать, что это сделано заранее. Позвольте, а где элемент...
(Читать полностью...)

В Debian 11 нет команды iptables

09.10.2021
Публикация 12 месяцев назад
При вводе команды iptables получаем “command not found”. Это  как? А вот так :) По умолчанию теперь есть nftables. Включена в ядро Linux, начиная с версии 3.13, выпущенной 19 января 2014 года. Является заменой четырех команд: iptables ip6tables arptables ebtables Базовых отличий два: в одной команде объедена работа с протоколами IPv4 и IPv6 теперь нет изначально созданных таблиц - нужно создавать самостоятельно Таблицы могут быть одного из 6-ти семейств (families): ip — для обработки пакетов IPv4 ip6 — IPv6 inet — обрабатывает сразу и IPv4 и IPv6 (чтобы не дублировать одинаковые правила) arp — пакеты протокола ARP bridge — пакеты, проходящие через мост netdev...
(Читать полностью...)

Использование тройного === в программировании (PHP)

05.05.2021
Публикация 1 год назад
Любопытный пример. Программисты знают, что есть несколько вариантов "равно": присваивание $a = 10 сравнение if ($a == $b) {........} тождественное сравнение if ($a === $b) {........} Если с первыми двумя вариантами достаточно понятно, то третий вариант вызывает вопросы.  Тождественно равно - должны совпадать не только значения, но и типы переменных. Основные типы в PHP: число $a = 10; строка $b = '10'; // кавычки показывают, что внутри строка логическая переменная $c = FALSE; И например, условие $a == $b будет верным, т.к. сравниваются значения и интерпретатор PHP "понимает", что это десять. А вот условие $a === $b будет ложным, т.к....
(Читать полностью...)

X

    Please prove you are human by selecting the Cup.