Ajout d'une ligne verticale dans le tracé ggplot

Je trace un graphique en utilisant le morceau de code suivant:

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

entrez la description de l'image ici

1-Comment ajouter une ligne verticale dans le tracé qui se croise à une valeur particulière de y (par exemple 2)?

2-Comment faire pour que l'axe des y commence à 0.5 au lieu de 1?

33
demandé sur Shahzad 2013-10-27 22:55:07

2 réponses

, Vous pouvez ajouter une ligne verticale avec geom_vline(). Dans votre cas:

+ geom_vline(xintercept=2)

Si vous voulez voir aussi le nombre 0.5 sur votre axe y, ajoutez scale_y_continuous() et définissez limits= et breaks=

+ scale_y_continuous(breaks=c(0.5,1,2,3,4,5),limits=c(0.5,6))
51
répondu Didzis Elferts 2013-10-27 18:59:54

En ce qui concerne la première question:

Cette réponse suppose que la valeur de Y que vous désirez est spécifiquement dans votre ensemble de données. Tout d'abord, créons un exemple reproductible car je ne peux pas accéder à votre ensemble de données:

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

de la parcelle initiale

Ce que vous devez faire est d'utiliser la colonne y dans votre cadre de données pour rechercher la valeur spécifique. Essentiellement, vous devrez utiliser

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

En utilisant les données que j'ai générées ci-dessus, voici un exemple. Puisque mon cadre de données n'est pas probable contient la valeur exacte 2, je vais utiliser la fonction trunc pour la rechercher:

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

Maintenant, nous savons où sont toutes les valeurs de 2. Puisque ce graphique diminue, nous l'inverserons, alors la valeur la plus proche de 2 sera au début:

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

#           y  x
# 26 2.067315 26

Et nous pouvons utiliser cette valeur pour spécifier où l'ordonnée à l'origine doit être:

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

tracé avec ligne verticale

J'espère que ça aide!

15
répondu ZNK 2013-10-27 20:11:04