2010-08-31 5 views
7

Ich habe die folgende Handlung mit dem R-Code generiert, die es folgt:Wie mache ich ggplot2-Plots schöner?

  1. Sprechen Sie die x-Achse zeigen Länge: ich die Handlung ein bisschen schöner machen möchte jetzt alt text

    ggplot(lengths, aes(length, fill = library)) + geom_density(alpha = 0.2) + coord_cartesian(xlim = c(0, 60000)) 
    

    alle 5000 Einheiten (statt alle 20000)

  2. Addieren Sie die x-Werte auf die drei Spitzen (ca. 3000, 5000 und 35000).

Wie kann ich das tun?

Update als Antwort auf James: alt text

+2

FWIW, das ist eine ziemlich sexy Handlung direkt dort. – notJim

+0

Sie könnten eine vertikale Linie von den Spitzen zur x-Achse hinzufügen. 'geom_segment (data = Peakdat, aes (x = x, xend = x, y = y, yend = 0))' sollte zum Trick, wo 'peakdat' aus Bens Antwort ist. –

Antwort

11

Wie wäre:

(zuerst ein reproduzierbares Beispiel erstellen)

set.seed(1001) 
lengths <- data.frame(length=c(rgamma(1000,shape=10,scale=500), 
        10000+rgamma(1000,shape=5,scale=700), 
        rnorm(500,mean=30000,sd=2000)), 
        library=factor(rep(2:1,c(2000,500)))) 

(nette Sachen Spitzen Standorte und Höhen zu finden)

peakfun <- function(x) { 
    d <- density(x$length) 
    peaks <- which(diff(sign(diff(d$y)))==-2) 
    data.frame(x=d$x[peaks],y=d$y[peaks]) 
} 

peakdat <- ddply(lengths,.(library),peakfun) 
peakdat <- peakdat[-1,] ## drop spurious peak 

(ziehen die Handlung)

library(ggplot2) 
ggplot(lengths, aes(length, fill = library)) + 
    geom_density(alpha = 0.2) + 
    scale_x_continuous(limits = c(0,60000), 
        breaks = seq(0,60000,by=5000))+ 
    geom_text(data=peakdat,aes(x=x,y=y,label=round(x)),vjust=1) 

Sie wahrscheinlich wollen Sie die vertikale Höhe der Etiketten ein wenig zwicken

+0

+1 Ich würde +10 geben, wenn ich könnte ... :). Vielen Dank! –

6

1: + scale_x_continuous(breaks=rep(5000,12)).

Sie könnten setzen die xlim Erklärung auch hier in, mit limits zB

+ scale_x_continuous(breaks=rep(5000,12),limits=c(0,60000)) 

2: Für die Etiketten Sie annotate() oder geom_text() nutzen könnten. Beispiele finden Sie in this. Dafür müssten Sie allerdings selbst die Werte berechnen.

+0

Hinzufügen der Xlim-Deklaration scheint nicht gut zu funktionieren. Siehe Originalbeitrag, um zu sehen, was ich bekomme. –

+0

Tut mir leid, es verwendet "Grenzen" statt "xlim" hier, editierte Original Beitrag besser zu erklären. – James