2013-10-27 20 views
20

sto tramando un grafico utilizzando il seguente pezzo di codice:Aggiunta linea verticale nella trama ggplot

library (ggplot2) 

png (filename = "graph.png") 
stats <- read.table("processed-r.dat", header=T, sep=",") 
attach (stats) 
stats <- stats[order(best), ] 
sp <- stats$A/stats$B 
index <- seq (1, sum (sp >= 1.0)) 
stats <- data.frame (x=index, y=sp[sp>=1.0]) 
ggplot (data=stats, aes (x=x, y=y, group=1)) + geom_line() 
dev.off() 

enter image description here

1 - Come si può aggiungere una linea verticale nel grafico che interseca in un particolare valore di y (ad esempio 2)?

2 - Come si può far iniziare l'asse y a 0,5 anziché a 1?

risposta

29

È possibile aggiungere una linea verticale con geom_vline(). Nel tuo caso:

+ geom_vline(xintercept=2) 

Se volete vedere anche il numero 0.5 sul vostro sull'asse y, aggiungere scale_y_continuous() e impostare limits= e breaks=

+ scale_y_continuous(breaks=c(0.5,1,2,3,4,5),limits=c(0.5,6)) 
+1

Sembra che l'OP desideri disegnare la linea verticale "con un valore particolare di y". Saluti. – Henrik

+0

@ Henrik Sì, hai ragione, ho frainteso la domanda, ma ZNK ha già dato una risposta per quel problema –

12

Per quanto riguarda la prima domanda:

Questa risposta è partendo dal presupposto che il valore di Y che desideri sia specificamente all'interno del tuo set di dati. In primo luogo, creiamo un esempio riproducibile come non posso accedere al set di dati:

set.seed(9999) 
stats <- data.frame(y = sort(rbeta(250, 1, 10)*10 ,decreasing = TRUE), x = 1:250) 
ggplot(data=stats, aes (x=x, y=y, group=1)) + geom_line() 

initial plot

Quello che dovete fare è quello di utilizzare la colonna y nel frame di dati per cercare il valore specifico. Essenzialmente dovrai usare

ggplot(data=stats, aes (x=x, y=y, group=1)) + geom_line() + 
    geom_vline(xintercept = stats[stats$y == 2, "x"]) 

Utilizzando i dati che ho generato sopra, ecco un esempio. Dal momento che il mio telaio dati non probabile contiene il valore esatto 2, userò la funzione trunc per cercarlo:

stats[trunc(stats$y) == 2, ] 

#   y x 
# 9 2.972736 9 
# 10 2.941141 10 
# 11 2.865942 11 
# 12 2.746600 12 
# 13 2.741729 13 
# 14 2.693501 14 
# 15 2.680031 15 
# 16 2.648504 16 
# 17 2.417008 17 
# 18 2.404882 18 
# 19 2.370218 19 
# 20 2.336434 20 
# 21 2.303528 21 
# 22 2.301500 22 
# 23 2.272696 23 
# 24 2.191114 24 
# 25 2.136638 25 
# 26 2.067315 26 

Ora sappiamo dove tutti i valori di 2 sono. Dal momento che questo grafico è in diminuzione, ci sarà invertire tale tendenza, allora il valore più vicino al 2 sarà all'inizio:

rev(stats[trunc(stats$y) == 2, 1]) 

#   y x 
# 26 2.067315 26 

e possiamo usare questo valore per specificare dove la x intercetta dovrebbe essere:

ggplot(data=stats, aes (x=x, y=y, group=1)) + geom_line() + 
    geom_vline(xintercept = rev(stats[trunc(stats$y) == 2, "x"])[1]) 

plot with vertical line

Spero che questo aiuti!