Làm cách nào tôi có thể tạo một biểu đồ đồ họa của một chuỗi số từ đầu vào tiêu chuẩn?


38

Nếu có một tệp văn bản dài và tôi muốn hiển thị tất cả các dòng trong đó một mẫu nhất định xảy ra, tôi làm:

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

Bây giờ, tôi có một chuỗi số (một số trên mỗi dòng)

Tôi muốn tạo một biểu diễn đồ họa 2D với sự xuất hiện trên trục x và số dòng trên trục y. Làm thế nào tôi có thể đạt được điều này?

nhập mô tả hình ảnh ở đây


1
Bạn có thể giải thích những gì bạn có nghĩa là xảy ra? Bạn có nghĩa là bao nhiêu lần một số cụ thể được tìm thấy trong tập tin? Hay bạn chỉ muốn giá trị thực của số trên trục x và số dòng đó được tìm thấy trên trục y?
terdon

Ý tôi là sự xuất hiện đơn giản theo thứ tự một mẫu đã được tìm thấy. ví dụ: lần đầu tiên trong dòng 400, lần thứ hai trong dòng 410, lần thứ ba trong dòng 412 ...
Abdul Al Hazred 15/03/2015

Câu trả lời:


44

Bạn có thể sử dụng gnuplotcho việc này:

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

sản xuất một cái gì đó như

nhập mô tả hình ảnh ở đây

Bạn có thể định cấu hình sự xuất hiện của biểu đồ cho thỏa thích, xuất ra các định dạng hình ảnh khác nhau, v.v.


2
Tôi đã tải xuống gnuplot và thử kiểm tra nó bằng cách nhập: seq 100 | gnuplot -p -e 'cốt truyện "/ dev / stdin"'. Thật kỳ lạ, không có biểu đồ nào xuất hiện, nhưng mã thoát (echo $?) là 0, vì vậy cũng không có lỗi nào xuất hiện.
Abdul Al Hazred

@AbdulAlHazred bạn đã cài đặt gnuplothay gnuplot-x11? nếu trước đây, AFAIK nó chỉ cung cấp sản lượng tập tin (ví dụ tạo pdf, png, vv file ) chứ không phải là âm mưu tương tác trực tiếp vào màn hình.
steeldriver

@AbdulAlHazred: Điều gì xảy ra nếu bạn chỉ làm seq 100 >seq.dat, sau đó chạy gnuplottương tác và ở loại dấu nhắc plot "seq.dat"?
Nate Eldredge

@steel ấn Tôi có lỗi Failed to initialize wxWidgets.với gnuplot-x11 ... Tôi có cần phải có cái này hay cái khác không? hoặc có thể cả hai gnuplotgnuplot-x11được cài đặt?
3kstc 17/03/2015

1
Rất đẹp; nối notitlevào cốt truyện mà không có tiêu đề.
Victoria Stuart

13

Tôi sẽ làm điều này trong R. Bạn sẽ phải cài đặt nó nhưng nó sẽ có sẵn trong kho phân phối của bạn. Đối với các hệ thống dựa trên Debian, hãy chạy

sudo apt-get install r-base

Điều đó cũng sẽ mang lại r-base-corenhưng nếu không, hãy chạy sudo apt-get install r-base-core. Khi bạn đã Rcài đặt, bạn có thể viết một tập lệnh R đơn giản cho việc này:

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

Kịch bản trên sẽ tạo ra một tập tin gọi là output.pdf. Tôi đã thử nghiệm như sau:

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

Trên dữ liệu ngẫu nhiên tôi đã sử dụng, nó tạo ra:

nhập mô tả hình ảnh ở đây

Tôi không hoàn toàn chắc chắn những gì bạn muốn âm mưu nhưng điều đó ít nhất nên chỉ cho bạn đi đúng hướng.


Theo mặc định, phiên bản v3.4.4 của tôi tạo plots.pdf, bất kể sử dụng ggplot hay cốt truyện.
Vorac

@Vorac ý bạn là bình luận về câu trả lời khác? Ggplot phải làm gì với nó? Và tại sao tên tệp đầu ra mặc định có liên quan?
terdon

Trên hệ thống debian của tôi, tập hợp con tập lệnh này của bạn đủ #!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");để tạo Rplots.pdf trong cùng thư mục.
Vorac

1
@Vorac vâng, tất nhiên rồi. Nhưng tôi muốn chọn tên tập tin đầu ra. Và, quan trọng hơn là chỉ ra làm thế nào nó có thể được thực hiện để nó có thể được viết kịch bản. Mặt khác, mỗi lần bạn chạy RScript, nó sẽ sử dụng cùng tên và ghi đè lên đầu ra của một lần chạy quý giá.
terdon

11

Nếu có thể là một bản in thiết bị đầu cuối rất đơn giản sẽ đủ, và bạn có thể hài lòng bởi các trục đảo ngược, hãy xem xét những điều sau:

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

Các biểu đồ trên một xu hướng đảo ngược trên thang điểm 10% cho mỗi lần xuất hiện của mẫu 11 trong đầu ra của seq 1000.

Như thế này:

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

Với số chấm và số lần xuất hiện, nó có thể là:

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

... mà in ...

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

Bạn có thể lấy các trục như ví dụ của bạn với nhiều công việc hơn và tput- bạn cần thực hiện \033[Athoát (hoặc tương đương với trình giả lập thiết bị đầu cuối của bạn) để di chuyển con trỏ lên một dòng cho mỗi lần xuất hiện.

Nếu awk's printfhỗ trợ không gian đệm như POSIX vỏ printfkhông, sau đó bạn có thể sử dụng nó để làm như vậy - và có khả năng xa hiệu quả hơn là tốt. Tôi, tuy nhiên, không biết làm thế nào để sử dụng awk.


1

Nâng cao câu trả lời của Nate để có đầu ra PDF và vẽ các đường kẻ (yêu cầu 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

Hoặc bạn có thể chuyển hướng dữ liệu xuất chuẩn thông qua đường ống đến tập lệnh python tùy chỉnh. Điều này sẽ cho phép bạn có lượng tùy chỉnh và tính linh hoạt cao trong việc phân tích cú pháp, xử lý trước và trực quan hóa dữ liệu.

Đây là một hướng dẫn về điều này tôi đã viết để làm chính xác như bạn dự định. liên kết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.