Як я можу зробити графічний графік з послідовності чисел із стандартного вводу?


38

Якщо у вас довгий текстовий файл, і я хочу відобразити всі рядки, в яких зустрічається даний шаблон, я роблю:

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

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

Я хотів би зробити 2D графічне зображення із виникненням на осі x та номером рядка на осі y. Як я можу цього досягти?

введіть тут опис зображення


1
Чи можете ви пояснити, що ви маєте на увазі під настанням? Ви маєте на увазі, скільки разів певне число знайдено у файлі? Або ви просто хочете, щоб фактичне значення числа на осі x та номер рядка було знайдено на осі y?
тердон

Я маю на увазі під виникненням просто того, в якому порядку був знайдений шаблон. наприклад: перший раз у рядку 400, другий раз у рядку 410, третій раз у рядку 412 ...
Абдул Аль Хазред

Відповіді:


44

Ви можете використовувати gnuplotдля цього:

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

виробляє щось подібне

введіть тут опис зображення

Ви можете налаштувати зовнішній вигляд графіка на насолоду серця, вивести його у різних форматах зображень тощо.


2
Я завантажив gnuplot і спробував перевірити його, ввівши: seq 100 | gnuplot -p -e 'сюжет "/ dev / stdin"'. дивним чином не з’явився графік, але код виходу (echo $?) був 0, тому помилка також не з’явилася.
Абдул Аль Хазред

@AbdulAlHazred ви встановили gnuplotчи gnuplot-x11? якщо перший, afaik, він забезпечує лише вихід файлів (тобто генерування файлів pdf, png тощо ), а не інтерактивні сюжети безпосередньо на екран.
steeldriver

@AbdulAlHazred: Що станеться, якщо ви просто зробите це seq 100 >seq.dat, а потім запустіть gnuplotінтерактивно та за типом запиту plot "seq.dat"?
Нейт Елдредж

@steeldriver У мене помилка Failed to initialize wxWidgets.з gnuplot-x11 ... Чи потрібно мені мати те чи інше? чи можна gnuplotі gnuplot-x11встановити?
3kstc

1
Дуже хороша; додавати notitleдо сюжету без назви.
Вікторія Стюарт

13

Я б це зробив у 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

На випадкових даних, які я використав, вони видають:

введіть тут опис зображення

Я не зовсім впевнений, що ви хочете побудувати, але це повинно принаймні вказати на вас у правильному напрямку.


Мій Rscript v3.4.4 генерує plots.pdf за замовчуванням, незалежно від використання ggplot чи plot.
Ворак

@Vorac Ви мали намір прокоментувати іншу відповідь? Що стосується ggplot? І чому відповідне ім'я вихідного файлу за замовчуванням доречне?
тердон

У моїй системі debian цього підмножини вашого сценарію достатньо #!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");для створення Rplots.pdf у тому самому каталозі.
Ворак

1
@Vorac так, звичайно. Але я хочу вибрати ім'я вихідного файлу. І, що ще важливіше, покажіть, як це можна зробити, щоб можна було писати сценарії. В іншому випадку, кожного разу, коли ви запускаєте RScript, він використовує те саме ім'я та замінить вихід з дорогоцінного запуску.
тердон

11

Якщо може бути досить простої роздруківки терміналу, і щоб вас могли задовольнити перевернуті осі, врахуйте наступне:

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втечу (або його еквівалент, який сумісний з вашим емулятором терміналу), щоб перемістити курсор вгору по рядку для кожного події.

Якщо awkвін printfпідтримує пробіл, як і оболонка POSIX printf, ви можете використовувати його для того ж - і, швидше за все, набагато ефективніше. Я, однак, не знаю, як користуватися awk.


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'

0

Або ви можете перенаправити дані stdout через трубу до користувацького сценарію python. Це дозволить вам отримати величезну кількість налаштування та гнучкості при аналізі, попередній обробці та візуалізації даних.

Ось підручник з цього питання, який я писав, робити саме так, як ви маєте намір. посилання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.