Описание тега zagreb
Как Джозеф Р. упомянул, это старый классический его
, плюс множество более современных предложений, которые могут создавать всевозможные графики в различные форматы, как векторные, так и растровые. Но такие программы, как правило, должна быть настолько универсальна, что она занимает некоторое время, чтобы научиться правильно их использовать, который может быть немного сложной, когда вы хотите быстро построить простой график.
Я преподаю сам о недавно формат SVG, создавая небольшие файлы SVG вручную, а также писать программы на Python, чтобы сделать различные вещи, используя SVG, поэтому, когда я увидел ваш вопрос, я думал, что это было прекрасной возможностью, чтобы сделать некоторые более СВГ практике программирования. :)
Вот программа сырая Python, который делает простой линейный график с данными в формате, указанном в вопросе. Вывод в формат SVG, напечатано в stdout, так что вы должны использовать перенаправление, чтобы сохранить его в файл. Входные данные читаются из файла, указанного в командной строке, а если нет имя файла программа считывает данные из стандартного ввода, так что программа может быть использована в трубопроводе.
Входные данные могут содержать пустые строки или строки-комментарии с #
как первый непустой символ. Значения X и Y в каждой строке должны быть разделены как минимум одним пробелом (вкладки ОК), другие пробелы в строке игнорируются, таким образом, пробелы перед или после значения x значение y игнорируются.
Программа просматривает все данные X Y, чтобы найти максимальное и минимальное значения, которые используются для расчета панели viewBox СВГ так что сюжет масштабируется и правильно центрированы.
SVGgraph.py
#! /usr/Бен/ОКР питона
"' Создать простой линейный график, как файл SVG
Написал ПМ 2Ring 2014.11.09
"'
импорт Сыс
деф bounding_box в(баллах):
xtup, ytup = зип(*баллов)
XLO по = мин(xtup)
xhi = Макс(xtup)
ыло = мин(ytup)
процедуры в yhi = Макс(ytup)
возвращение XLO по, ыло, xhi - XLO по, процедуры в yhi - йло
деф points_to_SVG(точки, ширина, высота):
#Получим график границы и отрегулировать, чтобы обеспечить рентабельность
XLO по, ыло, xsize, ysize = bounding_box в(очки)
маржа = 0.02
xmargin = xsize * маржа
ymargin = ysize * маржа
XLO по -= xmargin
xsize += 2 * xmargin
ыло -= ymargin
ysize += 2 * ymargin
strokewidth = 2.0 * мин(xsize, ysize) / поплавок(Макс(ширина, высота))
руководитель = "'<?в XML версия="1.0"?>\Н<СВГ префиксом xmlns="http://www.w3.org/2000/svg"
ширина="%д" высота="%д" панели viewBox="%ф %ф %ф %ф"
preserveAspectRatio="xMidYMid встретить">\п\п"' % (ширина, высота, XLO по, ыло, xsize, ysize)
<полилиния точек тела = ' ="\н' + '\н'.присоединить(["%е, %е" % т т в точках]) + '\н"\н -
стиль хвост = '="заполнить:нет; инсульт-ширина:%Ф; высота подъема:#006600;"/>\п</СВГ>' % strokewidth
возврат головка + тело + хвост
деф главным образом():
имя_экземпляра = Сыс.аргумент argv[1] Если LEN(sys файла.из argv) > 1 еще нет
Ф = открыть(имя_экземпляра, 'РТ') если имя_экземпляра-то sys файла.устройства stdin
данные = Ф.читать().splitlines()
если имя_экземпляра нет ни у кого:
Ф.закрыть()
очки = []
для сведения:
#Пропустить пустые строки
если не строку: дальше
Х, Y = линия.сплит()
#Пропустить комментарии: строки '#' в качестве первой непустой Чаре
если x.как startswith('#'): далее
очков.дописать((поплавка(х), поплавка(г)))
ширина, высота = 800, 600
печать points_to_SVG(точки, ширина, высота)
если __имя__ == '__главный__':
главная()
Вот пример вывода:
graphtest.СВГ
<?в XML версия="1.0"?>
<СВГ префиксом xmlns="http://www.w3.org/2000/svg"
ширина="800" высота="600" панели viewBox="-0.240855 -3.881333 12.524483 7.762666"
preserveAspectRatio="xMidYMid встретиться">
<полилиния точки="
0.000000, 0.000000
0.523599, 3.732051
1.047198, 2.598076
1.570796, -0.500000
2.094395, -0.866025
2.617994, 0.267949
3.141593, 0.000000
3.665191, -0.267949
4.188790, 0.866025
4.712389, 0.500000
5.235988, -2.598076
5.759587, -3.732051
6.283185, -0.000000
6.806784, 3.732051
7.330383, 2.598076
7.853982, -0.500000
8.377580, -0.866025
8.901179, 0.267949
9.424778, 0.000000
9.948377, -0.267949
10.471976, 0.866025
10.995574, 0.500000
11.519173, -2.598076
12.042772, -3.732051
"
стиль="заполнить:нет; инсульт-ширина:0.019407; высота подъема:#006600;"/>
</СВГ>
Чистки рядов, вот программу я использовал для генерации тестовых данных для СВГ.
SVGgraph-points.py
#! /usr/Бен/ОКР питона
"Создать список пунктов для проверки SVGgraph.py с
Написал ПМ 2Ring 2014.11.09
"'
импорт Сыс
от математики Пи импорт грех
Дэф Ф(Х):
вернуть грех(х) + 2.0 * грех(х * 2.0) + 1.5 * Sin(х * 3.0)
деф make_points(Н):
очки = н * [нет]
для меня в xrange(Н):
х = 4.0 * Пи * я / н
у = F(х)
точек[я] = (Х, Y)
возврат очков
деф главным образом():
Н = инт(Сыс.аргумент argv[1]), Если LEN(sys файла.из argv) > 1 еще 24
очки = make_points(Н)
печать '\п'.присоединить(["%е %е" % т т в точках])
если __имя__ == '__главный__':
главная()
Использование
питон SVGgraph-points.py 24 > ними
питон SVGgraph.py данных testdata > graphtest.СВГ
или
питон SVGgraph-points.py | питон SVGgraph.py > graphtest.СВГ
Дать SVGgraph-points.py аргументом 200 или выше, чтобы создать плавный график.
Как я сказал выше, это всего лишь сырой сценарий, я не чувствую, что добавление необычные командной строки обработки. :)
Возможно, вы захотите изменить ширину
и высоту
параметров, либо в скрипт Python или в SVG, но они не являются критическими, поскольку СВГ дисплей программы обычно позволяют контролировать масштаба во время просмотра изображений. И даже если вы измените эти значения в файл SVG изображения всегда будет по центру и соответствующим образом масштабированы так, что не вам отрезать.
Вы также можете поэкспериментировать с запасом
масштабирование фактор, который сегодня составляет 0.02, определяющий минимальные поля вокруг графа. Вы можете контролировать (номинальная) толщина вычерчиваемой линии, регулируя strokewidth
множитель, который в настоящее время равен 2.0.
Получайте удовольствие!
Редактировать
Вот новая версия графического скрипт, который использует обычную систему координат, а не в перевернутом виде, что СВГ (и многих других компьютерных чертежей систем) использует. Так что теперь ваши графики не будут вверх ногами. :)
#! /usr/Бен/ОКР питона
"' Создать простой линейный график, как файл SVG
Использует обычную систему координат,
не обычная перевернутая система СВГ.
Написал ПМ 2Ring 2014.11.11
"'
импорт Сыс
деф bounding_box в(баллах):
xtup, ytup = зип(*баллов)
XLO по = мин(xtup)
xhi = Макс(xtup)
ыло = мин(ytup)
процедуры в yhi = Макс(ytup)
возвращение XLO по, ыло, xhi, процедуры в yhi
деф points_to_SVG(точки, ширина, высота):
#Получим график границы и отрегулировать, чтобы обеспечить рентабельность
XLO по, ыло, xhi, процедуры в yhi = bounding_box в(очки)
xsize = xhi - XLO по
ysize = yhi, в - йло
маржа = 0.02
xmargin = xsize * маржа
ymargin = ysize * маржа
XLO по -= xmargin
xsize += 2 * xmargin
процедуры в yhi += ymargin
ysize += 2 * ymargin
strokewidth = 2.0 * мин(xsize, ysize) / поплавок(Макс(ширина, высота))
руководитель = "'<?в XML версия="1.0"?>
<СВГ префиксом xmlns="http://www.w3.org/2000/svg"
ширина="%д" высота="%д" панели viewBox="%ф %ф %ф %ф"
preserveAspectRatio="xMidYMid встретиться">
<полилиния стиль="заполнить:нет; инсульт-ширина:%Ф; высота подъема:#006600;"
преобразование="масштаба(1, -1)"
точки="\Н"' % (ширина, высота, XLO по, -Центре yhi, xsize, ysize, strokewidth)
тело = '\п'.присоединить(["%е, %е" % т т в точках])
хвост = '\п"/>\п</СВГ>'
возврат головка + тело + хвост
деф главным образом():
имя_экземпляра = Сыс.аргумент argv[1] Если LEN(sys файла.из argv) > 1 еще нет
Ф = открыть(имя_экземпляра, 'РТ') если имя_экземпляра-то sys файла.устройства stdin
данные = Ф.читать().splitlines()
если имя_экземпляра нет ни у кого:
Ф.закрыть()
очки = []
для сведения:
#Пропустить пустые строки
если не строку: дальше
Х, Y = линия.сплит()
#Пропустить комментарии: строки '#' в качестве первой непустой Чаре
если x.как startswith('#'): далее
очков.дописать((поплавка(х), поплавка(г)))
ширина, высота = 800, 600
печать points_to_SVG(точки, ширина, высота)
если __имя__ == '__главный__':
главная()