ฉันจะทำพล็อตกราฟิกในลำดับของตัวเลขจากอินพุตมาตรฐานได้อย่างไร


38

หากมีไฟล์ข้อความยาวและฉันต้องการที่จะแสดงทุกบรรทัดที่มีรูปแบบที่กำหนดเกิดขึ้นฉันจะ:

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

ตอนนี้ฉันมีลำดับของตัวเลข (หนึ่งหมายเลขต่อบรรทัด)

ฉันต้องการสร้างการแสดงกราฟิก 2D ด้วยการเกิดขึ้นบนแกน x และหมายเลขบรรทัดบนแกน y ฉันจะบรรลุสิ่งนี้ได้อย่างไร

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณช่วยอธิบายความหมายของเหตุการณ์ที่เกิดขึ้นได้ไหม คุณหมายถึงจำนวนครั้งที่พบจำนวนเฉพาะในไฟล์หรือไม่? หรือคุณแค่ต้องการค่าที่แท้จริงของตัวเลขบนแกน x และหมายเลขบรรทัดที่พบบนแกน y?
terdon

ฉันหมายถึงสิ่งที่เกิดขึ้นตามลำดับที่พบรูปแบบ เช่น: ครั้งแรกในบรรทัด 400, ครั้งที่สองในบรรทัด 410, ครั้งที่สามในบรรทัด 412 ...
Abdul Al Hazred

คำตอบ:


44

คุณสามารถใช้gnuplotสิ่งนี้:

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

ผลิตสิ่งที่ต้องการ

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถกำหนดค่าลักษณะที่ปรากฏของกราฟตามความพอใจของหัวใจส่งออกในรูปแบบภาพต่าง ๆ ฯลฯ


2
ฉันดาวน์โหลด gnuplot แล้วและพยายามทดสอบโดยป้อน: seq 100 | gnuplot -p -e 'plot "/ dev / stdin"' ไม่มีกราฟปรากฏตัว แต่รหัสทางออก (echo $?) เป็น 0 จึงไม่มีข้อผิดพลาดปรากฏขึ้น
Abdul Al Hazred

@AbdulAlHredred คุณติดตั้งgnuplotหรือgnuplot-x11ไม่ ถ้าอดีต AFAIK มันเพียง แต่ให้การส่งออกไฟล์ (เช่นไฟล์ PDF สร้าง, PNG ฯลฯไฟล์ ) มากกว่าแปลงโต้ตอบโดยตรงไปยังหน้าจอ
ขับรถเหล็ก

@AbdulAlHazred: จะเกิดอะไรขึ้นถ้าคุณทำseq 100 >seq.datแล้วเรียกใช้gnuplotการโต้ตอบและประเภทพรอมต์plot "seq.dat"?
Nate Eldredge

@steeldriver ฉันมีข้อผิดพลาดFailed to initialize wxWidgets.กับ gnuplot-x11 ... ฉันต้องมีอันใดอันหนึ่งหรือไม่? หรือทั้งสองอย่างgnuplotและgnuplot-x11สามารถติดตั้งได้?
3kstc

1
ดีมาก; ผนวกnotitleกับพล็อตที่ไม่มีชื่อ
Victoria Stuart

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 หรือพล็อต
Vorac

@Vorac คุณหมายถึงแสดงความคิดเห็นในคำตอบอื่นหรือไม่? ggplot เกี่ยวข้องกับอะไรบ้าง? และทำไมชื่อไฟล์เอาต์พุตเริ่มต้นจึงเกี่ยวข้อง?
terdon

ในระบบเดเบียนของฉันชุดย่อยของสคริปต์ของคุณก็เพียงพอที่ #!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");จะสร้าง Rplots.pdf ในไดเรกทอรีเดียวกัน
Vorac

1
@Vorac ใช่แน่นอน แต่ฉันต้องการเลือกชื่อไฟล์ที่ส่งออก และที่สำคัญแสดงให้เห็นว่ามันสามารถทำได้เพื่อให้สามารถสคริปต์ ไม่เช่นนั้นทุกครั้งที่คุณเรียกใช้ RScript จะใช้ชื่อเดียวกันและเขียนทับเอาต์พุตของการรันที่มีค่า
terdon

11

หากเป็นไปได้ว่าการพิมพ์เทอร์มินัลที่ง่ายมากเพียงพอแล้วและคุณสามารถตอบสนองได้ด้วยแกนคว่ำให้พิจารณาสิ่งต่อไปนี้:

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

แผนภูมิข้างต้นแนวโน้มคว่ำในระดับ 10% สำหรับการเกิดขึ้นของรูปแบบทุก11seq 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's printfสนับสนุนพื้นที่ padding เช่น POSIX เปลือกprintfไม่แล้วคุณสามารถใช้มันเพื่อทำแบบเดียวกัน - และมีแนวโน้มมากขึ้นได้อย่างมีประสิทธิภาพเช่นกัน ผม awkแต่ไม่ทราบวิธีการใช้งาน


1

การปรับปรุงคำตอบของเนทเพื่อให้ได้ผลลัพธ์ 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 แบบกำหนดเอง สิ่งนี้จะช่วยให้คุณสามารถกำหนดเองได้อย่างมากมายและมีความยืดหยุ่นในการแยกวิเคราะห์ประมวลผลล่วงหน้าและแสดงข้อมูลเป็นภาพ

นี่คือการสอนเกี่ยวกับเรื่องนี้ผมเขียนให้ทำตามที่คุณตั้งใจ ลิงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.