@Спокойную ваш комментарий подразумевает, но я думаю, что это должно быть явно указано, что биометрические паспорта не являются обязательными для тех, кто въезжает в США по визе. Поэтому предпосылкой вопроса не совсем корректна. Спасибо за ваш ответ . Это работает. Что означает $NF в вышеуказанной команды ? Есть ли возможность сделать это с VI поиска и замены? -1 за голоса, пользователя Windows, который "вроде" Ubuntu на сайте Убунту? Серьезно? Если вы хотели бы отправить ваш комментарий оставаясь анонимным, вы также можете использовать анонимный сервис электронной почты. Или открыть новую учетную запись электронной почты специально для этой цели. Просто объясните ситуацию в письме. Авторы, наверное, будут счастливы, чтобы иметь возможность исправить ошибки, которые вы нашли.

Как Джозеф Р. упомянул, это старый классический его, плюс множество более современных предложений, которые могут создавать всевозможные графики в различные форматы, как векторные, так и растровые. Но такие программы, как правило, должна быть настолько универсальна, что она занимает некоторое время, чтобы научиться правильно их использовать, который может быть немного сложной, когда вы хотите быстро построить простой график.

Я преподаю сам о недавно формат 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(точки, ширина, высота)


если __имя__ == '__главный__':
главная()