web-dev-qa-db-ja.com

標準入力から一連の数値のグラフィカルプロットを作成するにはどうすればよいですか?

長いテキストファイルがあり、特定のパターンが発生するすべての行を表示したい場合は、次のようにします。

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

今、私は一連の数字を持っています(1行に1つの数字)

X軸にオカレンス、y軸に行番号を使用して、2Dグラフィック表現を作成したいと思います。どうすればこれを達成できますか?

enter image description here

42
Abdul Al Hazred

これには gnuplot を使用できます:

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

のようなものを生成します

enter image description here

グラフの外観を思いのままに設定したり、さまざまな画像形式で出力したりできます。

47
Nate Eldredge

これは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

私が使用したランダムデータでは、次の結果が生成されます。

enter image description here

私はあなたが何をプロットしたいのか完全にはわかりませんが、それは少なくともあなたを正しい方向に向けるべきです。

14
terdon

非常に単純なターミナルプリントアウトで十分であり、逆転した軸で満足できる場合は、以下を検討してください。

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

上記のグラフは、seq 1000の出力でパターン11が発生するたびに、10%のスケールで反転傾向を示しています。

このような:

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を使用して、例のようなAxesを取得できます-\033[Aエスケープを実行する必要があります(または、端末エミュレータと互換性があるので、同等のもの)発生ごとにカーソルを1行上に移動します。

awkprintfがPOSIX-Shell printfのようにスペースパディングをサポートしている場合は、それを使用して同じことを行うことができます。しかし、私はawkの使い方を知りません。

11
mikeserv

PDF出力を持ち、線をプロットするためにNateの答えを強化する(rsvg-convert):

| gnuplot -p -e 'set term svg; set output "|rsvg-convert -f pdf -o out.pdf /dev/stdin"; plot "/dev/stdin" with lines'
1
feuerstein

または、パイプを介してstdoutデータをカスタムのpythonスクリプトにリダイレクトできます。これにより、データの解析、前処理、および視覚化のカスタマイズと柔軟性が大幅に向上します。

これは私があなたが意図したとおりに正確に行うために書いたこのチュートリアルです。 リンク

0
quartzfun