Вы можете построить диапазоны в виде отрезков:
library(ggplot2)
df$region_start <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 1)))
df$region_end <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 2)))
ggplot(df, aes(x = region_start, y = mean, colour = region)) +
geom_segment(aes(xend = region_end, yend = mean), size = 1.5) +
labs(x = "locus")
![enter image description here](https://i.stack.imgur.com/mvqPo.png)
РЕДАКТИРОВАТЬ
После дальнейшего уточнения из OP, это среднее значение в каждой точке, которое должно быть нанесено на график. Это немного сложнее, но может быть сделано в несколько строк с помощью dplyr
library(ggplot2)
library(dplyr)
df$region_start <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 1)))
df$region_end <- as.numeric(unlist(lapply(strsplit(df$region, "-"), `[`, 2)))
do.call("rbind", mapply(function(x, y, z) cbind(x:y, rep(z, 1 + y - x)),
df$region_start,
df$region_end,
df$mean)) %>%
as.data.frame() %>%
setNames(c("Locus", "Value")) %>%
group_by(Locus) %>%
summarise(mean = mean(Value)) %>%
ggplot(aes(x = Locus, y = mean)) +
geom_line() + labs(x = "Locus")
![enter image description here](https://i.stack.imgur.com/msAPL.png)
Используемые данные:
region mean
36761802-36761804 54
36761802-36761805 42
36761802-36761806 56.5
36761802-36761810 28.75
36761803-36761804 29
36761803-36761806 30
Представляет:
df <- structure(list(region = c("36761802-36761804", "36761802-36761805",
"36761802-36761806", "36761802-36761810", "36761803-36761804",
"36761803-36761806"), mean = c(54, 42, 56.5, 28.75, 29, 30)),
class = "data.frame", row.names = c(NA, -6L))