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


38

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

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

これで、一連の数字(1行に1つの数字)ができました

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

ここに画像の説明を入力してください


1
発生の意味を説明してもらえますか?ファイル内で特定の数が見つかった回数を意味しますか?または、x軸の数値の実際の値と、y軸の数値が見つかった行番号だけが必要ですか?
テルドン

つまり、パターンが見つかった順番で発生するということです。例えば:...ライン412にライン410、第三の時間ライン400、第二時間で初めて
アブドゥルアルHazred

回答:


44

gnuplotこれに使用できます:

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

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

ここに画像の説明を入力してください

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


2
gnuplotをダウンロードし、次のように入力してテストを試みました。gnuplot -p -e 'plot "/ dev / stdin"'。奇妙なことに、グラフは表示されませんでしたが、終了コード(echo $?)は0であったため、エラーも表示されませんでした。
アブドゥルアルハズレッド

@AbdulAlHazredをインストールしましたgnuplotgnuplot-x11?前者の場合、対話型のプロットを直接画面に表示するのではなく、ファイル出力(つまり、pdf、pngなどのファイルを生成する)のみを提供します。
スチールドライバー

@AbdulAlHazred:ただ実行してseq 100 >seq.datから、gnuplot対話形式でプロンプトタイプで実行するとplot "seq.dat"どうなりますか?
ネイト・エルドレッジ

@steeldriver Failed to initialize wxWidgets.gnuplot-x11でエラーが発生しました...どちらかが必要ですか?または両方gnuplotgnuplot-x11インストールできますか?
3kstc

1
非常に素晴らしい; notitleタイトルなしでプロットに追加します。
ビクトリアスチュアート

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

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

ここに画像の説明を入力してください

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


My Rscript v3.4.4は、ggplotとplotのどちらを使用するかに関係なく、デフォルトでplots.pdfを生成します。
ヴォラック

@Vorac別の答えにコメントするつもりでしたか?ggplotはそれと何の関係がありますか?そして、なぜデフォルトの出力ファイル名が関連するのですか?
テルドン

私のdebianシステムでは、スクリプトのこのサブセット#!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");で、同じディレクトリにRplots.pdfを生成できます 。
ヴォラック

1
@Voracはい、もちろん。しかし、出力ファイル名を選択したいと思います。そして、より重要なこととして、スクリプトを作成できるようにする方法を示します。そうしないと、RScriptを実行するたびに同じ名前が使用され、貴重な実行の出力が上書きされます。
テルドン

11

非常に単純な端末印刷で十分であり、逆軸で満足できる場合は、次のことを考慮してください。

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

上記のチャートは、の出力でパターン11が出現するたびに10%スケールで反転した傾向を示していますseq 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を行うことで、例のような軸を取得できます。また、発生するたびにカーソルを1行上に移動する\033[Aために、エスケープ(またはターミナルエミュレータと互換性のある同等のもの)を行う必要があります。

場合awkprintfPOSIXシェルのようなサポートスペースパディングを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.