Question

Je suis en train de générer un histogramme en R avec une échelle logarithmique pour y. Actuellement, je fais:

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

Cela me donne un histogramme, mais la densité de 0 à 1 est si grand (environ un million de différence de valeurs) que vous pouvez à peine faire sortir l'un des autres barres.

Je l'ai essayé de le 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 1-6 plutôt que 0, 1, 2, 3, 4, 5, 25. Il y a également les données montrent que les points plutôt que des barres. travaux barplot mais je ne reçois aucun axe inférieur.

Était-ce utile?

La solution

Un histogramme est l'estimation de la densité d'un pauvre homme. Notez que dans votre appel à l'aide d'arguments hist() par défaut, vous obtenez fréquences non probabilités - ajouter ,prob=TRUE à l'appel si vous voulez des probabilités.

En ce qui concerne le problème de l'axe du journal, ne pas utiliser « x » si vous ne voulez pas l'axe x transformé:

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

vous obtient des barres sur une échelle log-y -. Le look and feel est encore un peu différent, mais peut probablement être peaufinés

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

Autres conseils

Une autre option serait d'utiliser le paquet ggplot2.

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

Il est pas tout à fait claire de votre question de savoir si vous voulez un axe x connecté ou un axe y connecté. Un axe y est connecté pas une bonne idée lors de l'utilisation des barres parce qu'ils sont ancrés à zéro, ce qui devient infini négatif lorsque vous êtes connecté. Vous pouvez contourner ce problème en utilisant un polygone de fréquence ou de la parcelle de densité.

La réponse de Dirk est un grand. Si vous voulez une apparence comme ce que hist produit, vous pouvez aussi 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, il ajoute des étiquettes de valeur juste sous la partie supérieure de chaque barre. Cela peut être utile pour les graphiques d'échelle logarithmique, mais peut aussi être omis.

Je passe également main, xlab et les paramètres de ylab pour fournir un titre du tracé, l'étiquette x-axe, et l'étiquette y axe.

Exécuter la fonction hist () sans faire un graphique, log-transformer les comptes, puis dessiner la figure.

hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)

Il devrait ressembler comme l'histogramme régulier, mais l'axe y sera log2 Fréquence.

Je l'ai mis en place une fonction qui se comporte de manière identique à Hist dans le cas par défaut, mais accepte l'argument journal. Il utilise plusieurs tours d'autres affiches, mais ajoute un peu de lui-même. hist(x) et myhist(x) semblent identiques.

Le problème initial 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)
}

L'exercice pour le lecteur: Malheureusement, tout ce qui fonctionne avec hist travaille avec myhist tel qu'il est. Cela devrait être fixable avec un peu plus d'efforts, cependant.

Voici une solution jolie ggplot2:

library(ggplot2)
library(scales)  # makes pretty labels on the x-axis

breaks=c(0,1,2,3,4,5,25)

ggplot(mydata,aes(x = V3)) + 
  geom_histogram(breaks = log10(breaks)) + 
  scale_x_log10(
    breaks = breaks,
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  )

Notez que pour les pauses geom_histogram, ils devaient être transformé pour travailler avec scale_x_log10

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top