7
votes

Normaliser les bacs d'histogramme dans gnuplot

J'essaie de tracer un histogramme dont les bacs sont normalisés par le nombre d'éléments dans la corbeille.

J'utilise le suivant xxx

pour obtenir un histogramme de base, mais je veux que la valeur de chaque corbeille soit divisée par la taille de la corbeille. Comment puis-je y aller dans Gnuplot ou utiliser des outils externes si nécessaire?


0 commentaires

5 Réponses :


4
votes

Voici comment je ferais que je ferais, avec N = 500 variables gaussiennes aléatoires générées à partir de R avec la commande suivante: xxx

J'utilise une fois la même idée que la vôtre pour définir un histogramme normalisé, où y est défini comme 1 / (binwidth * n), sauf que j'utilise int au lieu de étage et je n'ai pas contenant de la valeur de la corbeille. En bref, il s'agit d'une adaptation rapide du Smooth.DEM script de démonstration et un Une approche similaire est décrite dans le manuel de Janert, gnuplot en action ( Chapitre 13 , p. 257, disponible librement). Vous pouvez remplacer mon exemple de fichier de données avec points aléatoires qui est disponible dans le dossier démo à venir avec gnuplot. Notez que nous devons spécifier le nombre de points comme gnuplot comme aucune installation de comptage pour les enregistrements dans un fichier. xxx

Voici le résultat, avec deux bacs largeur

Entrez la description de l'image ici

En outre, c'est vraiment une approche approximative de l'histogramme Et plus de solutions élaborées sont facilement disponibles dans R. En effet, le problème est de définir une bonne largeur des bacs, et ce problème a déjà été discuté sur STATS.STACKEXCHANGE.COM : Utilisation Freedman-DiaConis règle binning ne doit pas être trop difficile à mettre en œuvre, même si vous devez calculer la gamme inter-quartiles.

Voici comment r conduiterait avec le même ensemble de données, avec l'option par défaut (règle des voleurs, car dans ce particulier c ASE, cela ne fera pas une différence) et une corbeille également espacée comme celles utilisées ci-dessus.

Entrez la description de l'image ici

Le code R utilisé est donné ci-dessous: xxx

Vous pouvez même regarder comment r fait son travail, En inspectant les valeurs renvoyées lorsque vous appelez hist () : xxx

tout cela pour dire que vous pouvez utiliser r résultat pour traiter vos données avec gnuplot si Vous aimez (bien que je recommande d'utiliser R directement: -).


0 commentaires

9
votes

dans GNUPLOT 4.4, les fonctions prennent sur une propriété différente, en ce sens qu'ils peuvent exécuter plusieurs commandes successives, puis renvoyer une valeur (voir Guzeuplot astuces ) Cela signifie que vous pouvez réellement calculer le nombre de points, n, dans le fichier gnuplot sans avoir à le connaître à l'avance. Ce code fonctionne pour un fichier, "out.dat", contenant une colonne: une liste de n échantillons à partir d'une distribution normale: xxx

La première instruction de parcelle se lit sur le Datafile et les augmentations une fois Pour chaque point, traçage d'un zéro.

La deuxième instruction de parcelle utilise en fait la valeur de la somme pour normaliser l'histogramme.


1 commentaires

Vous pouvez améliorer cela encore plus en laissant la deuxième valeur de s (x) être nan et ajout notele au premier commande - de cette façon, la sommation sera complètement invisible sur la figure, car Gnuplot ignore les valeurs nan lors du tracé =)



8
votes

Dans GNUPLOT 4.6, vous pouvez compter le nombre de points de STATS , qui est plus rapide que tracé . En réalité, vous n'avez pas besoin d'une telle astuce s (x) = ((somme = somme + 1), 0) , mais comptez directement le numéro par variable statisse_records après avoir exécuté de statistiques 'out.dat' u 1 .


0 commentaires

2
votes

Une autre façon de compter le nombre de points de données dans un fichier consiste à utiliser une commande système. Cela se révèle utile si vous traçage plusieurs fichiers et que vous ne connaissez pas au préalable le nombre de points. J'ai utilisé: xxx pré>

Les points de vue code> Les fonctions évite les lignes de comptage qui commencent par "#". Vous utiliseriez ensuite les fonctions déjà mentionnées pour tracer l'histogramme normalisé. P>

Voici un exemple complet: P>

n=100
xmin=-50.
xmax=50.
binwidth=(xmax-xmin)/n

bin(x,width)=width*floor(x/width)+width/2.0
countpoints(file) = system( sprintf("grep -v '^#' %s| wc -l", file) )

file1count = countpoints (file1)
file2count = countpoints (file2)
file3count = countpoints (file3)

plot file1 using (bin(($1),binwidth)):(1.0/(binwidth*file1count)) smooth freq with boxes,\
     file2 using (bin(($1),binwidth)):(1.0/(binwidth*file2count)) smooth freq with boxes,\
     file3 using (bin(($1),binwidth)):(1.0/(binwidth*file3count)) smooth freq with boxes
...


0 commentaires

-2
votes

Tout simplement xxx


2 commentaires

Pouvez-vous s'il vous plaît ajouter un contexte autour de votre réponse. Cela aidera l'Astucieux et les lecteurs.


Quoi dire? C'est la réponse directe à la question de Shivknight. En utilisant (4 $ 4/4 $) ou (1) au lieu de (4 $) on obtient le nombre des éléments au lieu de sa somme.