Bagaimana saya bisa membuat plot grafis dari urutan angka dari input standar?

38

Jika memiliki file teks panjang dan saya ingin menampilkan semua baris di mana pola yang diberikan terjadi, saya lakukan:

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

Sekarang, saya memiliki urutan angka (satu angka per baris)

Saya ingin membuat representasi grafis 2D dengan kemunculan pada sumbu x dan nomor baris pada sumbu y. Bagaimana saya bisa mencapai ini?

masukkan deskripsi gambar di sini

Abdul Al Hazred
sumber
1
Bisakah Anda menjelaskan apa yang Anda maksud dengan kejadian? Maksud Anda berapa kali angka tertentu ditemukan dalam file? Atau apakah Anda hanya ingin nilai aktual dari angka pada sumbu x dan nomor baris yang ditemukan pada sumbu y?
terdon
Maksud saya dengan kejadian hanya dalam urutan pola ditemukan. misalnya: pertama kali di baris 400, kedua di baris 410, ketiga di baris 412 ...
Abdul Al Hazred

Jawaban:

44

Anda bisa menggunakan gnuplotini:

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

menghasilkan sesuatu seperti

masukkan deskripsi gambar di sini

Anda dapat mengonfigurasi tampilan grafik untuk kesenangan hati Anda, menghasilkan berbagai format gambar, dll.

Nate Eldredge
sumber
2
Saya telah mengunduh gnuplot dan mencoba mengujinya dengan memasukkan: seq 100 | gnuplot -p -e 'plot "/ dev / stdin"'. anehnya tidak ada grafik yang muncul, tetapi kode keluar (echo $?) adalah 0, jadi tidak ada kesalahan juga muncul.
Abdul Al Hazred
@AbdulAlHazred apakah Anda menginstal gnuplotatau gnuplot-x11? jika yang pertama, afaik itu hanya menyediakan output file (yaitu menghasilkan file pdf, png dll ) daripada plot interaktif langsung ke layar.
steeldriver
@AbdulAlHazred: Apa yang terjadi jika Anda baru saja melakukannya seq 100 >seq.dat, kemudian jalankan secara gnuplotinteraktif dan pada tipe prompt plot "seq.dat"?
Nate Eldredge
@steeldriver Saya memiliki kesalahan Failed to initialize wxWidgets.dengan gnuplot-x11 ... Apakah saya perlu memiliki satu atau yang lain? atau dapat keduanya gnuplotdan gnuplot-x11diinstal?
3kstc
1
Sangat bagus; tambahkan notitleplot tanpa judul.
Victoria Stuart
13

Saya akan melakukan ini R. Anda harus menginstalnya tetapi harus tersedia di repositori distribusi Anda. Untuk sistem berbasis Debian, jalankan

sudo apt-get install r-base

Itu juga harus membawa r-base-coretetapi jika tidak, jalankan sudo apt-get install r-base-corejuga. Setelah Rmenginstal, Anda dapat menulis skrip R sederhana untuk ini:

#!/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()

Script di atas akan membuat file bernama output.pdf. Saya diuji sebagai berikut:

## 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

Pada data acak yang saya gunakan, yang menghasilkan:

masukkan deskripsi gambar di sini

Saya tidak sepenuhnya yakin apa yang ingin Anda plot tetapi setidaknya harus mengarahkan Anda ke arah yang benar.

terdon
sumber
Rscript v3.4.4 saya menghasilkan plots.pdf secara default, terlepas dari menggunakan ggplot atau plot.
Vorac
@Vorac maksud Anda mengomentari jawaban lain? Apa hubungannya ggplot dengan itu? Dan mengapa nama file keluaran default relevan?
terdon
Pada sistem debian saya, bagian dari skrip Anda ini cukup #!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");untuk menghasilkan Rplots.pdf di direktori yang sama.
Vorac
1
@Vorac ya, tentu saja. Tapi saya ingin memilih nama file output. Dan, yang lebih penting menunjukkan bagaimana hal itu bisa dilakukan sehingga bisa dituliskan. Jika tidak, setiap kali Anda menjalankan RScript, itu akan menggunakan nama yang sama dan menimpa output dari proses yang berharga.
terdon
11

Jika cetakan terminal yang sangat sederhana sudah mencukupi, dan Anda bisa puas dengan sumbu terbalik, pertimbangkan hal berikut:

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

Grafik di atas tren terbalik pada skala 10% untuk setiap kemunculan pola 11 dalam output seq 1000.

Seperti ini:

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

Dengan jumlah titik dan kemunculannya bisa:

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

... yang mencetak ...

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

Anda bisa mendapatkan sumbu seperti contoh Anda dengan lebih banyak pekerjaan dan tput- Anda harus melakukan \033[Apelarian (atau yang setara dengan kompatibel dengan emulator terminal Anda) untuk memindahkan kursor ke atas garis untuk setiap kejadian.

Jika awk's printfdukungan ruang-bantalan seperti POSIX-shell printftidak, maka Anda dapat menggunakannya untuk melakukan hal yang sama - dan mungkin jauh lebih efisien juga. Namun saya tidak tahu bagaimana cara menggunakannya awk.

mikeserv
sumber
1

Meningkatkan jawaban Nate untuk mendapatkan hasil PDF dan untuk memplot baris (membutuhkan 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
sumber
0

Atau Anda dapat mengarahkan ulang data stdout melalui pipa ke skrip python khusus. Ini akan memungkinkan Anda banyak penyesuaian dan fleksibilitas dalam penguraian, pra-pemrosesan dan memvisualisasikan data.

Berikut ini adalah tutorial tentang ini saya menulis untuk melakukan persis seperti yang Anda inginkan. link

quartzfun
sumber