Добавление вертикальной линии в график 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 - Как можно добавить вертикальную линию на графике, которая пересекается при определенном значении y (например, 2)?
2 - Как сделать начало оси y равным 0,5 вместо 1?
Ответы
Ответ 1
Вы можете добавить вертикальную линию с помощью geom_vline()
. В вашем случае:
+ geom_vline(xintercept=2)
Если вы хотите увидеть также число 0.5 на вашей оси y, добавьте scale_y_continuous()
и установите limits=
и breaks=
+ scale_y_continuous(breaks=c(0.5,1,2,3,4,5),limits=c(0.5,6))
Ответ 2
Относительно первого вопроса:
В этом ответе предполагается, что значение Y, которое вы желаете, конкретно находится в вашем наборе данных. Во-первых, позвольте создать воспроизводимый пример, поскольку я не могу получить доступ к вашему набору данных:
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]()
Что вам нужно сделать, так это использовать столбец y
в вашем фрейме данных для поиска определенного значения. По существу вам нужно будет использовать
ggplot(data=stats, aes (x=x, y=y, group=1)) + geom_line() +
geom_vline(xintercept = stats[stats$y == 2, "x"])
Используя приведенные выше данные, приведу пример. Поскольку мой кадр данных, скорее всего, не содержит точного значения 2
, я буду использовать функцию trunc
для его поиска:
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
Теперь мы знаем, где все значения 2. Поскольку этот график уменьшается, мы его поменяем, тогда значение, ближайшее к 2, будет в начале:
rev(stats[trunc(stats$y) == 2, 1])
# y x
# 26 2.067315 26
И мы можем использовать это значение, чтобы указать, где должен быть x-перехват:
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]()
Надеюсь, что это поможет!