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 P> 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? P> P>
5 Réponses :
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: 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 Voici le résultat, avec deux bacs largeur p> p> 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. P> 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. p> p> Le code R utilisé est donné ci-dessous: p> Vous pouvez même regarder comment r fait son travail, En inspectant les valeurs renvoyées lorsque vous appelez 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: -). P> p> int code> au lieu de
étage code> 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 em> ( Chapitre 13 , p. 257, disponible librement). Vous pouvez remplacer mon exemple de fichier de données avec
points aléatoires code> qui est disponible dans le dossier code> démo code> à 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. P>
hist () code>: p>
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 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. p> La deuxième instruction de parcelle utilise en fait la valeur de la somme pour normaliser l'histogramme. P> P>
Vous pouvez améliorer cela encore plus en laissant la deuxième valeur de s (x) code> être
nan code> et ajout
notele code> au premier
code> commande - de cette façon, la sommation sera complètement invisible sur la figure, car Gnuplot ignore les valeurs
nan code> lors du tracé =)
Dans GNUPLOT 4.6, vous pouvez compter le nombre de points de STATS code>, qui est plus rapide que
tracé code>. En réalité, vous n'avez pas besoin d'une telle astuce
s (x) = ((somme = somme + 1), 0) code>, mais comptez directement le numéro par variable
statisse_records code> après avoir exécuté de
statistiques 'out.dat' u 1 code>. p>
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é: 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
...
Tout simplement
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 $) code> ou
(1) code> au lieu de
(4 $) code> on obtient le nombre des éléments au lieu de sa somme.