web-dev-qa-db-fra.com

Comment puis-je faire un tracé graphique d'une séquence de nombres à partir de l'entrée standard?

Si j'ai un long fichier texte et que je veux afficher toutes les lignes dans lesquelles un motif donné se produit, je fais:

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

Maintenant, j'ai une séquence de chiffres (un numéro par ligne)

Je voudrais faire une représentation graphique 2D avec l'occurrence sur l'axe des x et le numéro de ligne sur l'axe des y. Comment puis-je atteindre cet objectif?

enter image description here

42
Abdul Al Hazred

Vous pouvez utiliser gnuplot pour cela:

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

produit quelque chose comme

enter image description here

Vous pouvez configurer l'apparence du graphique à votre guise, la sortie dans différents formats d'image, etc.

47
Nate Eldredge

Je le ferais dans R. Vous devrez l'installer mais il devra être disponible dans vos référentiels de distributions. Pour les systèmes basés sur Debian, exécutez

Sudo apt-get install r-base

Cela devrait également apporter r-base-core mais si ce n'est pas le cas, exécutez Sudo apt-get install r-base-core ainsi que. Une fois que vous avez installé R, vous pouvez écrire un simple script R pour cela:

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

Le script ci-dessus créera un fichier appelé output.pdf. J'ai testé comme suit:

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

Sur les données aléatoires que j'ai utilisées, cela produit:

enter image description here

Je ne suis pas tout à fait sûr de ce que vous voulez tracer mais cela devrait au moins vous orienter dans la bonne direction.

14
terdon

S'il se peut qu'une impression de terminal très simple suffise et que vous puissiez être satisfait par des axes inversés, considérez ce qui suit:

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

Le graphique ci-dessus montre une tendance inversée sur une échelle de 10% pour chaque occurrence du modèle 11 dans la sortie de seq 1000.

Comme ça:

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

Avec les points et le nombre d'occurrences, cela pourrait être:

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

... qui imprime ...

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

Vous pourriez obtenir les axes comme votre exemple avec beaucoup plus de travail et tput - vous auriez besoin de faire le \033[A escape (ou son équivalent compatible avec votre émulateur de terminal) pour déplacer le curseur d'une ligne vers le haut pour chaque occurrence.

Si awk de printf prend en charge le remplissage d'espace comme le POSIX-Shell printf, alors vous pouvez l'utiliser pour faire de même - et probablement beaucoup plus efficacement également. Cependant, je ne sais pas comment utiliser awk.

11
mikeserv

Améliorer la réponse de Nate pour avoir PDF et tracer des lignes (nécessite le 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

Ou vous pouvez rediriger les données standard via le canal vers un script python personnalisé. Cela vous permettra une immense quantité de personnalisation et de flexibilité dans l'analyse, le prétraitement et la visualisation des données.

Voici un tutoriel sur ce que j'ai écrit pour faire exactement comme vous le souhaitez. lien

0
quartzfun