如何从标准输入中绘制出一系列数字的图形图?


38

如果有一个长文本文件,并且我想显示发生给定模式的所有行,请执行以下操作:

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

现在,我有一个数字序列(每行一个数字)

我想用x轴上的出现和y轴上的行号进行2D图形表示。我该如何实现?

在此处输入图片说明


1
您能解释一下发生是什么意思吗?您是说在文件中找到特定编号多少次了?还是只希望x轴上的数字的实际值和在y轴上找到该数字的行号?
terdon

我的意思是简单地按照发现模式的顺序发生。例如:第一次在400行,第二次在410行,第三次在412行...
阿卜杜勒·哈兹雷德

Answers:


44

您可以gnuplot为此:

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

产生类似

在此处输入图片说明

您可以根据自己的喜好配置图表的外观,以各种图像格式输出等。


2
我已经下载了gnuplot并尝试通过输入以下命令对其进行测试:seq 100 | gnuplot -p -e'绘制“ / dev / stdin”'。奇怪的是,没有图形出现,但是退出代码(echo $?)为0,因此也没有出现错误。
Abdul Al Hazred 2015年

@AbdulAlHazred您已安装gnuplot还是gnuplot-x11?如果是前者,则afaik仅提供文件输出(即生成pdf,png等文件),而不是直接将交互式图直接输出到屏幕。
钢铁司机

@AbdulAlHazred:如果您只是这样做seq 100 >seq.dat,然后gnuplot以提示方式交互式运行,该plot "seq.dat"怎么办?
Nate Eldredge

@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

在我使用的随机数据上,将产生:

在此处输入图片说明

我不确定您要绘制什么,但这至少应该为您指明正确的方向。


无论使用ggplot还是plot,我的Rscript v3.4.4默认都会生成plots.pdf。
沃拉克

@Vorac您是要评论另一个答案吗?ggplot与它有什么关系?为什么默认输出文件名有意义?
terdon

在我的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时,它将使用相同的名称并覆盖一次宝贵运行的输出。
terdon

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-您需要进行\033[A转义(或与终端仿真器兼容的等同操作),以将光标每次出现时向上移动一行。

如果awkprintf支持像POSIX壳空间填充printf的话,那么你可以用它做同样的-而且可能更有效地为好。但是,我不知道如何使用awk


1

增强Nate的答案以输出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

或者,您可以通过管道将标准输出数据重定向到自定义python脚本。这将使您在分析,预处理和可视化数据方面具有大量的自定义和灵活性。

这是我写的完全按照您的意愿编写的教程。 链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.