Domanda

Sto cercando di generare un istogramma in R con una scala logaritmica per y. Attualmente faccio:

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

Questo mi dà un istogramma, ma la densità tra 0 a 1 è così grande (circa un milione di differenza dei valori), che si può a malapena a distinguere una qualsiasi delle altre barre.

Poi ho provato a fare:

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")

Mi dà sorta quello che voglio, ma il fondo mi mostra i valori 1-6 piuttosto che 0, 1, 2, 3, 4, 5, 25. E 'anche che mostrano i dati come punti anziché bar. opere barplot ma poi non si ottiene nessun asse in basso.

È stato utile?

Soluzione

Un istogramma è la stima della densità di un povero-uomo. Si noti che nella chiamata a hist() usando argomenti di default, si ottiene frequenze non di probabilità - aggiungi ,prob=TRUE alla chiamata se si desidera probabilità.

Per quanto riguarda il problema dell'asse del registro, non utilizzare 'x' se non si desidera che l'asse x trasformato:

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

si ottiene bar su una scala logaritmica-y -. Il look-and-feel è ancora un po 'diverso, ma probabilmente può essere ottimizzato

Infine, si può anche fare hist(log(x), ...) per ottenere un istogramma del registro dei dati.

Altri suggerimenti

Un'altra opzione sarebbe quella di utilizzare il pacchetto ggplot2.

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

Non è del tutto chiaro dalla tua domanda se si desidera un login asse X o di un asse y registrato. Un asse y è registrato non è una buona idea quando si utilizzano barre perché ancorate a zero, che diventa infinito negativo quando connesso. È possibile aggirare il problema utilizzando un poligono di frequenza o trama densità.

La risposta di Dirk è un grande. Se si desidera un aspetto simile a quello che hist produce, si può anche provare questo:

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)

L'ultima riga è opzionale, aggiunge etichette dei valori appena sotto la parte superiore di ogni bar. Ciò può essere utile per grafi scala logaritmica, ma può anche essere omessa.

passo anche main, xlab e parametri ylab per fornire un titolo trama, asse x etichetta ed etichetta y.

Eseguire il hist () funzione senza fare un grafico, di log-trasformare i conteggi, e quindi disegnare la figura.

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

Si dovrebbe apparire proprio come l'istogramma normale, ma l'asse y sarà log2 Frequenza.

Ho messo insieme una funzione che si comporta in modo identico a Hist nel caso di default, ma accetta l'argomentazione di registro. Esso utilizza alcuni trucchi da altri manifesti, ma aggiunge un paio di sua iniziativa. hist(x) e myhist(x) sembrano identici.

Il problema originale sarebbe risolto con:

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

La funzione:

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)
}

esercizio per il lettore: Purtroppo, non tutto ciò che funziona con hist lavora con myhist così com'è. Questo dovrebbe essere risolvibile con un po 'più di sforzo, però.

Ecco una soluzione abbastanza 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))
  )

Si noti che per impostare le pause in geom_histogram, dovevano essere trasformati per lavorare con scale_x_log10

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top