73 votes

Histogramme avec échelle logarithmique

Je suis en train d'essayer de générer un histogramme dans la R sur une échelle logarithmique, mais je n'ai pas la moindre idée par où commencer. J'ai regardé sur Google mais aucun des trucs que j'ai vu vraiment ce que je veux.

Pour tracer l'histogramme je suis en utilisant:

hist(mydata$V3, breaks=c(0,1,2,3,4,5,25))

Cela me donne un histogramme, mais la densité est comprise entre 0 et 1 est tellement grand (environ un million de valeurs de différence) que vous pouvez à peine faire un quelconque des autres bars.

Alors j'ai essayé de faire:

mydata_hist <- hist(mydata$V3, breaks=c(0,1,2,3,4,5,25), plot=FALSE)
plot(rpd_hist$counts, log="xy", pch=20, col="blue")

Il me donne sorta ce que je veux, mais le fond me montre les valeurs de 1 à 6 plutôt que de 0, 1, 2, 3, 4, 5, 25. Sa montre également les données comme un point plutôt que d'un bar. barplot fonctionne mais je n'ai pas tout en bas de l'axe.

TIA,

Weegee

60voto

Dirk Eddelbuettel Points 134700

Un histogramme est un pauvre densité de l'estimation. Notez que votre appel à l' hist() en utilisant des arguments par défaut, vous obtenez des fréquences pas probabilités -- add ,prob=TRUE de l'appeler si vous souhaitez des probabilités.

Comme pour le journal de l'axe de problème, n'utilisez pas de 'x' si vous ne voulez pas de l'axe des x transformée:

plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)

vous obtient des bars sur un journal-y à l'échelle-le look-and-feel est encore un peu différent, mais peut probablement être modifié.

Enfin, vous pouvez aussi le faire hist(log(x), ...) pour obtenir un histogramme de le journal de vos données.

47voto

Thierry Points 6246

Une autre option serait d'utiliser le paquetage ggplot2.

 ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log()
 

10voto

hadley Points 33766

La question que vous posez n’est pas tout à fait claire si vous voulez un axe x enregistré ou un axe y enregistré. Lorsque vous utilisez des barres, l’axe des ordonnées enregistré n’est pas une bonne idée, car ils sont ancrés à zéro, ce qui devient un infini négatif lorsqu’il est enregistré. Vous pouvez contourner ce problème en utilisant un polygone de fréquence ou un tracé de densité.

10voto

Quinn Taylor Points 29688

La réponse de Dirk est excellente. Si vous voulez une apparence semblable à celle que produit hist , vous pouvez également essayer ceci:

 buckets <- c(0,1,2,3,4,5,25)
mydata_hist <- hist(mydata$V3, breaks=buckets, plot=FALSE)
bp <- barplot(mydata_hist$count, log="y", col="white", names.arg=buckets)
text(bp, mydata_hist$counts, labels=mydata_hist$counts, pos=1)
 

La dernière ligne est facultative, elle ajoute des étiquettes de valeur juste en haut de chaque barre. Cela peut être utile pour les graphiques à échelle logarithmique, mais peut également être omis.

Je passe également les paramètres main , xlab et ylab pour fournir un titre de tracé, une étiquette d’axe x et une étiquette d’axe y.

3voto

chrispy Points 3678

J'ai mis en place une fonction qui se comporte de manière identique à l'hist dans le cas par défaut, mais accepte le journal argument. Il utilise plusieurs astuces d'autres affiches, mais ajoute un peu de son propre. hist(x) et myhist(x) ont l'air identiques.

L'origine du problème serait résolu avec:

myhist(mydata$V3, breaks=c(0,1,2,3,4,5,25), log="xy")

La fonction:

myhist <- function(x, ..., breaks="Sturges",
                   main = paste("Histogram of", xname),
                   xlab = xname,
                   ylab = "Frequency") {
  xname = paste(deparse(substitute(x), 500), collapse="\n")
  h = hist(x, breaks=breaks, plot=FALSE)
  plot(h$breaks, c(NA,h$counts), type='S', main=main,
       xlab=xlab, ylab=ylab, axes=FALSE, ...)
  axis(1)
  axis(2)
  lines(h$breaks, c(h$counts,NA), type='s')
  lines(h$breaks, c(NA,h$counts), type='h')
  lines(h$breaks, c(h$counts,NA), type='h')
  lines(h$breaks, rep(0,length(h$breaks)), type='S')
  invisible(h)
}

Exercice pour le lecteur: Malheureusement, pas tout ce qui fonctionne avec hist fonctionne avec myhist tel qu'il est. Qui devrait être résolu avec un peu plus d'effort, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X