Frage

Ich versuche, ein Histogramm in R mit einer logarithmischen Skala für y zu erzeugen. Derzeit ich tun:

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

Das gibt mir ein Histogramm, aber die Dichte zwischen 0 bis 1 ist so groß (etwa eine Million Wert Differenz), dass man sich kaum einen der anderen Bars machen kann.

Dann habe ich versucht zu tun:

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

Es gibt mir sorta, was ich will, aber das Endergebnis zeigt mir die Werte 1-6 statt 0, 1, 2, 3, 4, 5, 25. Es ist auch die Daten als Punkte statt als Balken zeigt. barplot funktioniert, aber dann bekomme ich keine untere Achse.

War es hilfreich?

Lösung

Ein Histogramm ist ein Arme-Leute-Dichteschätzung. Beachten Sie, dass in Ihrem Aufruf zum hist() Standardargumente verwenden, erhalten Sie Frequenzen nicht Wahrscheinlichkeiten - addieren ,prob=TRUE auf den Aufruf, wenn Sie Wahrscheinlichkeiten wollen.

Wie für das Log-Achse Problem, verwenden Sie nicht ‚x‘, wenn Sie nicht wollen, die x-Achse umgewandelt:

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

bekommt man Balken auf einer log-y-Skala -. Das Look-and-Feel noch ein wenig anders ist, aber wahrscheinlich gezwickt werden

Schließlich können Sie auch hist(log(x), ...) tun ein Histogramm des Protokolls Ihrer Daten zu erhalten.

Andere Tipps

Eine andere Möglichkeit wäre das Paket ggplot2 zu verwenden.

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

Es ist nicht ganz klar, aus Ihrer Frage, ob Sie eine protokollierte x-Achse oder protokolliert y-Achse wollen. A angemeldet y-Achse ist keine gute Idee, wenn Stäbe verwendet, weil sie bei Null verankert sind, die, wenn sie angemeldet negativ unendlich wird. Sie können durch die Verwendung einer Frequenz Polygon oder Dichteplot, um dieses Problem zu umgehen.

Dirks Antwort ist ein großer. Wenn Sie ein Aussehen wie wollen, was hist produziert, können Sie auch versuchen, diese:

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)

Die letzte Zeile ist optional, es fügt Wert Etikett nur unter der Oberseite jeder Bar. Dies kann für die Log-Skala Graphen nützlich sein, kann aber auch weggelassen werden.

I main, xlab und ylab Parameter auch einen Plot-Titel zu schaffen passieren, x-Achsenbeschriftung und y-Achsenbeschriftung an.

Führen Sie das hist () Funktion ohne eine Grafik zu machen, Log-Transformation der Zählungen, und dann die Figur ziehen.

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

Es sollte ebenso wie das regelmäßige Histogramm aussehen, aber die y-Achse wird log2 Frequenz sein.

Ich habe eine Funktion zusammen, die identisch mit hist im Standardfall verhält, akzeptiert aber das Protokoll Argument. Es verwendet einige Tricks von anderen Plakaten, sondern fügt ein paar seiner eigenen. hist(x) und myhist(x) identisch aussehen.

Das ursprüngliche Problem wäre gelöst:

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

Die Funktion:

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

Übung für den Leser: Leider nicht alles, was mit hist arbeitet arbeitet mit myhist, wie es steht. Das sollte mit etwas mehr Aufwand, obwohl fixierbar sein.

Hier ist eine ziemlich ggplot2 Lösung:

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

Beachten Sie, dass die Pausen in geom_histogram zu setzen, mussten sie transformiert werden mit scale_x_log10 arbeiten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top