Standart girdiden bir sayı dizisinin grafiksel bir grafiğini nasıl yapabilirim?


38

Uzun bir metin dosyasına sahipseniz ve verilen bir desenin oluştuğu tüm satırları görüntülemek isterim:

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

Şimdi, bir numara sırasına sahibim (her satıra bir numara)

X ekseni ve y eksenindeki çizgi numarası ile birlikte 2 boyutlu grafiksel bir gösterim yapmak istiyorum. Bunu nasıl başarabilirim?

görüntü tanımını buraya girin


1
Ne demek istediğini ortaya çıkarır mısın? Dosyada belirli bir sayının kaç kez bulunduğunu mu kastediyorsunuz? Yoksa sadece x ekseni üzerindeki sayının gerçek değerini ve y ekseni üzerinde bulunan sayının satır numarasını mı istiyorsunuz?
terdon

Demek istediğim, sadece hangi düzende bir düzen bulunduğunu ortaya çıkarmak. örneğin: ilk satırda 400, ikinci satırda 410, üçüncü satırda 412 ...
Abdul Al Hazred

Yanıtlar:


44

Bunun için kullanabilirsiniz gnuplot:

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

gibi bir şey üretir

görüntü tanımını buraya girin

Grafiğin görünümünü, kalbinizin zevkine göre konfigüre edebilirsiniz, çeşitli görüntü formatlarında çıktılar vb.


2
Gnuplot'u indirdim ve girerek test etmeye çalıştım: seq 100 | gnuplot -p -e 'arsa "/ dev / stdin"'. garip bir şekilde hiçbir grafik görünmedi, ancak çıkış kodu (echo $?) 0 idi, bu yüzden hiçbir hata görünmedi.
Abdul Al Hazred

@AbdulAlHazred yüklediniz mi gnuplotveya gnuplot-x11? eski, afaik ise, doğrudan ekrana etkileşimli çizimlerden ziyade sadece dosya çıktısını (pdf, png vb. dosya oluşturma ) sağlar.
Steeldriver

@AbdulAlHazred: Eğer sadece bunu ne olur seq 100 >seq.dato zaman koşmak, gnuplotetkileşimli ve şunu yazınız plot "seq.dat"?
Nate Eldredge

@ steeldriver Failed to initialize wxWidgets.gnuplot-x11 ile ilgili bir hatam var ... Biri veya diğeri olması gerekir mi? veya her iki gnuplotve gnuplot-x11kurulabilir?
3kstc

1
Çok hoş; notitlebaşlık olmadan arsa eklemek .
Victoria Stuart

13

Bunu içinde yapardım R. Yüklemeniz gerekecek ancak dağıtım depolarınızda mevcut olması gerekir. Debian tabanlı sistemler için

sudo apt-get install r-base

Bu da getirmeli r-base-coreama gelmezse de koşmalı sudo apt-get install r-base-core. Kurduktan sonra R, bunun için basit bir R betiği yazabilirsiniz:

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

Yukarıdaki komut dosyası adlı bir dosya oluşturacaktır output.pdf. Aşağıdaki şekilde test ettim:

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

Kullandığım rastgele verilerde, şöyle ki:

görüntü tanımını buraya girin

Ne çizmek istediğinizi tam olarak bilmiyorum ama bu en azından sizi doğru yöne işaret etmelidir.


Benim rscript v3.4.4 ggplot veya arsa kullanıyor olsanız da, varsayılan olarak plots.pdf oluşturur.
Vorac

@Vorac başka bir cevapla ilgili yorum yapmak mı istedi? Ggplot'un bununla ne alakası var? Ve neden varsayılan çıktı dosya adı alakalı?
terdon

Debian sistemimde, betiğinizin bu alt kümesi #!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");aynı dizinde bir Rplots.pdf oluşturmak için yeterlidir.
Vorac

1
@Vorac evet, elbette. Ancak çıktı dosyasının adını seçmek istiyorum. Ve daha da önemlisi, nasıl yapılabileceğini göstererek betiklenebilsin. Aksi takdirde, bir RScript'i her çalıştırdığınızda, aynı adı kullanır ve değerli bir çalışmanın çıktısının üzerine yazar.
terdon

11

Çok basit bir terminal çıktısının yeterli olabileceği ve ters çevrilmiş eksenlerden memnun olabileceğiniz durumlarda, aşağıdakileri göz önünde bulundurun:

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

Yukarıdaki grafik , çıkışın 11 örneğinin her meydana gelmesi için% 10 ölçeğinde ters bir eğilim göstermektedir seq 1000.

Bunun gibi, böyle:

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

Noktalar ve oluşum sayılarıyla şunlar olabilir:

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

... hangi baskılar ...

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

Sen çok daha fazla çalışması ile örnekteki gibi eksenleri almak ve olabilir tput- yapmanız gereken istediğiniz \033[Akaçış (veya terminal emülatörü ile uyumludur olarak eşdeğeri) her bir oluşumda bir çizgi yukarı imleci hareket ettirmek için.

Eğer awkbireyin printfPOSIX kabuğu gibi destekleri uzay-dolgu printfolasılıkla çok daha verimli yanı ve - yapar, o zaman aynı şeyi kullanabilirsiniz. Ancak, nasıl kullanılacağını bilmiyorum awk.


1

Nate'in cevabını PDF çıktısı almak ve çizgiler çizmek için geliştirmek (gerektirir 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

Veya stdout verilerini yöneltme yoluyla özel bir python betiğine yönlendirebilirsiniz. Bu, verilerin ayrıştırılması, ön işlenmesi ve görselleştirilmesinde büyük miktarda özelleştirme ve esneklik sağlayacaktır.

İşte bu konuda tam olarak istediğiniz gibi yapmak için yazdığım bir öğretici. bağlantı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.