Alby
Alby

Reputation: 5742

How to add multiple line segments between two associated points in ggplot2?

I have some sequence feature information I want to visualize. Here is some toy data(the specific r code to regenerate the data is at the end)

          type index variable position
...
14         CDS    14    start 31129
15        exon    15    start 32196
16         CDS    16    start 32196
17  stop_codon    17    start 32247
18        exon     1      end 12166
19         CDS     2      end 12166
...

The command I used to generate the following plot is

qplot(position,type,data=m2data,color=type)+xlim(11950,15000)

what I have so far

But I want to add the line segments between "start" and "end" that share the same "index" like following, which I made with the paint.

What I want

How can I achieve this with ggplot2 in R?

The following is the data

m2data<-structure(list(type = structure(c(2L, 1L, 3L, 2L, 1L, 2L, 1L, 
4L, 2L, 2L, 1L, 3L, 2L, 1L, 2L, 1L, 4L, 2L, 1L, 3L, 2L, 1L, 2L, 
1L, 4L, 2L, 2L, 1L, 3L, 2L, 1L, 2L, 1L, 4L), class = "factor", .Label = c("CDS", 
"exon", "start_codon", "stop_codon")), index = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
"11", "12", "13", "14", "15", "16", "17"), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L), .Label = c("start", "end"), class = "factor"), position= c(11955L, 
12026L, 12026L, 16677L, 16677L, 17745L, 17745L, 17787L, 18309L, 
28587L, 28658L, 28658L, 31129L, 31129L, 32196L, 32196L, 32247L, 
12166L, 12166L, 12028L, 16841L, 16841L, 17814L, 17786L, 17789L, 
18898L, 28798L, 28798L, 28660L, 31299L, 31299L, 32270L, 32246L, 
32249L)), .Names = c("type", "index", "variable", "position"), row.names = c(NA, 
-34L), class = "data.frame")

Upvotes: 2

Views: 3992

Answers (1)

bdemarest
bdemarest

Reputation: 14667

Here is a solution to your problem. Although your question is quite similar to a previous one, I think that providing an answer specific to your data set is still useful.

library(ggplot2)
library(reshape2)

# Use dcast (in reshape2 package) to create separate columns for start and end.
dat = dcast(m2data, type + index ~ variable, value.var="position")

plot_1 = ggplot(dat, aes(x=start, xend=end, y=type, yend=type, colour=type)) +
         geom_segment(size=3) +
         geom_point(size=3) +
         geom_point(aes(x=end), size=3)

ggsave(filename="plot_1.png", plot_1, width=10, height=2.5)

enter image description here

Upvotes: 8

Related Questions