Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > График в виде картинки


Автор: igorold 23.5.2007, 07:01
Необходимо в Perl-скрипте создать график в виде картинки и потом ее показывать в HTML-шаблоне.

ОС - Линукс ... 

каким пакетом оптимальнее воспользоваться и можно привести ссылочку или кусок работающего кода ... плиииз ...

Автор: amg 23.5.2007, 07:45
Обычно, насколько знаю, для этого обычно используют GD. Но мне не приходилось.
У меня есть пример с gnuplot (д.б. в любом линуксе). Создается gif с графиком.
Код

$label_color = 'xadd8e6';
$line_color  = 'xff0000';
#       xffffff white     #     xffa500 orange              #   x0000ff blue 
#       x000000 black           #       x66cdaa medium aquamarine       #      
#       x404040 gray            #       xcdb5cd thistle 3                      
#       xff0000 red                     #       xadd8e6 light blue 
$line_style  = 'lines'; # 'linespoints'
$smooth = 'smooth csplines'; # ''
$no_axes = 'set noborder; set noarrow; set noxtics; set noytics';
#$no_axes = ''; #Раскоментировать, если нужны оси координат

$sizeX = 800; $sizeY = 700;

open GR, ">g_r_a_f_i_k.tmp" or die "$!\n";
print GR $_, "\t", $_**2, "\n" for -3..3;
close GR;

open GP, "| gnuplot" or die "$!\n";
print GP "set terminal gif medium transparent size $sizeX,$sizeY \\
          xffffff $label_color x404040 $line_color\n";
print GP "set output 'g_r_a_f_i_k.gif'\n";
print GP "set autoscale; set nokey; $no_axes\n";
print GP "set label 'O' at 1,1 center\n";
print GP "plot 'g_r_a_f_i_k.tmp' $smooth with $line_style";
close GP;

unlink 'g_r_a_f_i_k.tmp' if -f 'g_r_a_f_i_k.tmp';


Автор: GoodBoy 23.5.2007, 10:50
igorold
use Image::Magick;

Добавлено через 1 минуту и 14 секунд
http://imagemagick.org/script/perl-magick.php

Автор: Nab 23.5.2007, 13:46
А я бы SVG заюзал.... smile

По моему самое многообещающее внедрение...

Автор: igorold 25.5.2007, 08:22
Скрипт при запуске выдал ошибку:
Код

Can't load '/usr/lib/perl5/site_perl/5.8.8/i386-linux/auto/Image/Magick/Magick.so' for module Image::Magick: libMagick.so.10: невозможно открыть разделяемый объектный файл: Нет такого файла или каталога at /usr/lib/perl5/5.8.8/i386-linux/DynaLoader.pm line 230.
 at go.pl line 3
Compilation failed in require at go.pl line 3.
BEGIN failed--compilation aborted at go.pl line 3.

[1]+  Stopped                 perl go.pl


хотя такой файл есть :  /usr/lib/perl5/site_perl/5.8.8/i386-linux/auto/Image/Magick/Magick.so
Код

#!/usr/bin/perl

use Image::Magick; #используем модуль
my($image, $x); #переменные
$image = Image::Magick->new; #новый проект
$x = $image->Read("img_0013.jpg"); #открываем файл
($ox,$oy)=$image->Get('base-columns','base-rows'); #определяем ширину и высоту изображения

$nx=int(($ox/$oy)*150); #вычисляем ширину, если высоту сделать 150
$image->Resize(geometry=>geometry, width=>$nx, height=>150); #Делаем resize (изменения размера)
if($nx>200) { #Если ширина получилась больше 200
$nnx=int(($nx-200)/2); #Вычисляем откуда нам резать
$image->Crop(x=>$nnx, y=>0); #Задаем откуда будем резать
$image->Crop('200x150'); #С того места вырезаем 200х150
}
$x = $image->Write("photo.jpg"); #Сохраняем изображение.

1;


Автор: amg 25.5.2007, 08:49
igorold, нужно график функции нарисовать или просто работа с графикой? Для последнего ImageMagick подходит отлично, но нарисовать там какую-то хитрую линию - что-то я не помню, чтоб было легко.

Автор: igorold 25.5.2007, 09:03
ну да, именно графики рисовать, с графикой работать не надо ... 

Твой пример вылетает на строке 
open GP, "| gnuplot" or die "$!\n"

Автор: amg 25.5.2007, 09:25
Цитата(igorold @  25.5.2007,  09:03 Найти цитируемый пост)
ну да, именно графики рисовать
Ну тогда глянь, можно ли с помощью ImageMagick нарисовать график, прежде чем этот пакет ставить. Я, например, о такой возможности ImageMagick не знаю, хотя уважаемый GoodBoy говорит, что можно. 

Кстати, Nab, расскажи (или ссылку дай), пожалуйста, как для рисования графиком SVG использовать.

Автор: Nab 25.5.2007, 11:38
Цитата(amg @  25.5.2007,  09:25 Найти цитируемый пост)
Кстати, Nab, расскажи (или ссылку дай), пожалуйста, как для рисования графиком SVG использовать.

Ввел меня в курс, Иван Сагалаев http://softwaremaniacs.org/blog/2005/12/25/svg-experiments/, как впрочем и многое другое он мне рассказал smile вторая часть про SVG http://softwaremaniacs.org/blog/2005/12/26/svg-css-insane-mix/.

Официальный стандарт
http://www.w3.org/Graphics/SVG/

Вот здесь мне понравилось как написано, по русски и с примерами smile
http://viju.tvercity.net/articles/svgformat


И еще интересный ресурс
http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm

А вот примеры SVG, если не показывает, значит у вас нет поддержки в броузере...
http://devfiles.myopera.com/articles/76/SolarSystem2.svg
http://dev.opera.com/articles/view/drawing-hilbert-curves-with-svg/
Или поставьте плагин или пользуйтесь "нормальными" броузерами smile

Автор: amg 25.5.2007, 12:05
Цитата(igorold @  25.5.2007,  09:03 Найти цитируемый пост)
Твой пример вылетает на строке open GP, "| gnuplot" or die "$!\n"
А gnuplot стоит? Если есть шелл, то проверь: which gnuplot || locate gnuplot

Еще лучше использовать GD. По возможностям работы с изображениями эта библиотека, пожалуй, проигрывает ImageMagick, зато быстрее и в ней можно всякие графики рисовать (GD::Graph).

Опять же, SVG. Хотя тут опасность есть (насчет нормальных браузеров, см. пост Nab'а).


Автор: amg 25.5.2007, 12:27
Nab, посмотрел ссылки. Спасибо. Впечатляет. Но, насколько я понял, в SVG, все же не заложена возможность непосредственно рисовать графики функций (например, мне чаще всего требуется нарисовать график по точкам из таблицы со сглаживанием сплайнами). Для этого нужны сторонние библиотеки?

Автор: igorold 25.5.2007, 13:31
Цитата(amg @  25.5.2007,  12:05 Найти цитируемый пост)
А gnuplot стоит? Если есть шелл, то проверь: which gnuplot || locate gnuplot

... ну да .. конечно .. не было установлено ... получилось!!!
для начала пойдет ... что посложнее потом попробую ... кстати GD я устанавливал, но чего то ему не хватает и он не работает у меня ... 

Автор: amg 25.5.2007, 14:51
Ну, раз получилось, то вот простейщий пример (в предыдущем я намеренно оставил все опции gnuplot, которые были у меня, вообще же gnuplot - мощнейший пакет для рисования графиков, ручек, за которые можно подергать, великое множество, достаточно сказать, что документация к нему - http://www.gnuplot.info/docs_4.0/gnuplot.html)
Код

open GP, "| gnuplot" or die "$!\n";
print GP "
set terminal gif
set output 'g_r_a_f_i_k.gif'
plot [-3:3] x**2
";
close GP;


А про GD - эти модули - это, насколько я понимаю, лишь Perl-интерфейс к gdlibs. Т.е., чтобы модуль заработал, нужно установить сначала соответствующие библиотеки. Кстати, аналогичная ситуация с ImageMagick.

Автор: Ramirez 7.6.2007, 14:16
Я во в последнее время склоняюсь больше в варианту апплета ли еще лучше flash. на страницу вставляется флешка, которая умеет рисовать разные графики (zxChart например) и ей скармливаются циферки или ссылка на скрипт который циферки отдает. и нагрузка на сервер меньше и возможностей больше.

А если такой вариант не прокатывает - я бы не стал заморачиваться с GD а взял модули от RRDTOOL. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)