/ / log-skaliertes Dichtediagramm: ggplot2 und freqpoly, aber mit Punkten anstelle von Linien - r, ggplot2, Histogramm

log-skaliertes Dichtediagramm: ggplot2 und freqpoly, aber mit Punkten anstelle von Linien - r, ggplot2, Histogramm

Was ich wirklich machen möchte, ist ein Histogramm zu zeichnen, mit der y-Achse auf einer logarithmischen Skala. Offensichtlich ist das ein Problem mit der ggplot2 geom_histogram, da die untere os der Balken bei Null ist, und das Protokoll davon gibt Ihnen Ärger.

Mein Workaround ist die Verwendung der freqpoly geomund das mehr oder weniger macht die Arbeit. Der folgende Code funktioniert gut:

ggplot(zcoorddist) +
geom_freqpoly(aes(x=zcoord,y=..density..),binwidth = 0.001) +
scale_y_continuous(trans = "log10")

Das Problem ist, dass ich an den Rändern meiner Daten steheein paar schrille vertikale linien, die dich wirklich visuell davon ablenken, wenn du eine reihe von freqpoly-kurven in einem plot kombinierst. Was ich gerne tun könnte, ist, Punkte an jedem Eckpunkt der Freqpoly-Kurve zu verwenden, und keine Linien, die sie verbinden. Gibt es einen Weg dazu?

Antworten:

2 für die Antwort № 1

Der einfachste Weg, das gewünschte Diagramm zu erhalten, besteht darin, Ihre Daten einfach neu zu schreiben. Dann kannst du verwenden geom_point. Da Sie kein Beispiel angeben, habe ich das Standardbeispiel für geom_histogram um dies zu zeigen:

# load packages
require(ggplot2)
require(reshape)
# get data
data(movies)
movies <- movies[, c("title", "rating")]
# here"s the equivalent of your plot
ggplot(movies) + geom_freqpoly(aes(x=rating, y=..density..), binwidth=.001) +
scale_y_continuous(trans = "log10")
# recast the data
df1 <- recast(movies, value~., measure.var="rating")
names(df1) <- c("rating", "number")
# alternative way to recast data
df2 <- as.data.frame(table(movies$rating))
names(df2) <- c("rating", "number")
df2$rating <- as.numeric(as.character(df$rating))
# plot
p <- ggplot(df1, aes(x=rating)) + scale_y_continuous(trans="log10", name="density")
# with lines
p + geom_linerange(aes(ymax=number, ymin=.9))
# only points
p + geom_point(aes(y=number))