Как я могу сделать графический график последовательности чисел из стандартного ввода?

Если у вас длинный текстовый файл, и я хочу отобразить все строки, в которых происходит данный шаблон, я делаю:

grep -n form innsmouth.txt | cut -d : -f1

Теперь у меня есть последовательность чисел (по одному числу на строку)

Я хотел бы сделать 2D-графическое представление с вхождением на оси x и номером строки на оси y. Как я могу это достичь?

введите описание изображения здесь>> </p></body></html>

27 голосов | спросил Abdul Al Hazred 15 MarpmSun, 15 Mar 2015 22:54:26 +03002015-03-15T22:54:26+03:0010 2015, 22:54:26

5 ответов


34

Вы можете использовать gnuplot для это:

 primes 1 100 |gnuplot -p -e 'plot "/dev/stdin"'

создает что-то вроде

введите описание изображения здесь>> </p>

<p> Вы можете настроить внешний вид графика в восторге от вашего сердца, вывести его в различные форматы изображений и т. д. </p></body></html>

ответил Nate Eldredge 16 MaramMon, 16 Mar 2015 00:35:01 +03002015-03-16T00:35:01+03:0012 2015, 00:35:01
11

Я бы сделал это в R. Вам нужно будет установить его, но он будет доступен в ваших репозиториях дистрибутивов. Для систем на базе Debian запустите

sudo apt-get install r-base

Это также должно привести к r-base-core, но если это не так, запустите sudo apt-get install r-base-core. Как только у вас установлен R, вы можете написать для этого простой скрипт R:

#!/usr/bin/env Rscript
args <- commandArgs(TRUE)
## Read the input data
a<-read.table(args[1])
## Set the output file name/type
pdf(file="output.pdf")
## Plot your data
plot(a$V2,a$V1,ylab="line number",xlab="value")
## Close the graphics device (write to the output file)
dev.off()

В приведенном выше скрипте будет создан файл с именем output.pdf. Я протестировал следующим образом:

## Create a file with 100 random numbers and add line numbers (cat -n)
for i in {1..100}; do echo $RANDOM; done | cat -n > file 
## Run the R script
./foo.R file

В случайных данных, которые я использовал, это производит:

введите описание изображения здесь>> </p>

<p> Я не совсем уверен, что вы хотите построить, но это должно по крайней мере указать вам в правильном направлении. </p></body></html>

ответил terdon 15 MarpmSun, 15 Mar 2015 23:29:54 +03002015-03-15T23:29:54+03:0011 2015, 23:29:54
9

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

seq 1000   |
grep -n 11 |
while IFS=: read -r n match
do  printf "%0$((n/10))s\n" "$match"
done

В приведенных выше диаграммах показан инвертированный тренд в масштабе 10% для каждого появления шаблона 11 в выводе seq 1000.

Вот так:

11
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
                  211
                            311
                                      411
                                                511
                                                          611
                                                                    711
                                                                              811
                                                                                        911

С точками и количеством встречаемости это может быть:

seq 1000    |
grep -n 11  | {
i=0
while IFS=: read -r n match
do    printf "%02d%0$((n/10))s\n" "$((i+=1))" .
done; }

... который печатает ...

01 .
02           .
03           .
04           .
05           .
06           .
07           .
08           .
09           .
10           .
11           .
12                     .
13                               .
14                                         .
15                                                   .
16                                                             .
17                                                                       .
18                                                                                 .
19                                                                                           .

Вы можете получить оси как ваш пример с гораздо большим объемом работы и tput - вам нужно будет сделать \033[A escape (или его эквивалент, совместимый с вашим эмулятором терминала) , чтобы переместить курсор вверх по строке для каждого события.

Если awk 's printf поддерживает пробел, такой как POSIX-shell printf, то вы можете использовать его для того же - и, вероятно, намного эффективнее, , Я, однако, не знаю, как использовать awk.

ответил mikeserv 16 MaramMon, 16 Mar 2015 00:19:50 +03002015-03-16T00:19:50+03:0012 2015, 00:19:50
1

Усиление ответа Nate для вывода PDF и построения линий (требуется rsvg-convert):

| gnuplot -p -e 'set term svg; set output "|rsvg-convert -f pdf -o out.pdf /dev/stdin"; plot "/dev/stdin" with lines'
ответил feuerstein 23 PMpSat, 23 Apr 2016 18:50:01 +030050Saturday 2016, 18:50:01
0

Или вы можете перенаправить данные stdout через канал в собственный скрипт python. Это позволит вам получить огромное количество настроек и гибкости при анализе, предварительной обработке и визуализации данных.

Вот учебник по этому поводу, который я написал, чтобы делать то, что вы намереваетесь. ссылка

ответил quartzfun 18 MonEurope/Moscow2017-12-18T17:32:08+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 17:32:08 +0300 2017, 17:32:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132