Red bipartita grafica con ggplot2

Tengo el siguiente marco de datos:

structure(list(X1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L
), .Label = c("1", "2", "3", "4", "5", "6"), class = "factor"), 
    X2 = structure(c(1L, 6L, 8L, 10L, 12L, 13L, 3L, 4L, 1L, 6L, 
    7L, 9L, 10L, 12L, 13L, 3L, 4L, 5L, 10L, 12L, 13L, 4L, 1L, 
    6L, 12L, 13L, 3L, 1L, 6L, 7L, 8L, 10L, 11L, 12L, 13L, 2L, 
    3L, 11L, 12L, 13L), .Label = c("I1", "I10", "I11", "I12", 
    "I13", "I2", "I3", "I4", "I5", "I6", "I7", "I8", "I9"), class = "factor")), .Names = c("X1", 
"X2"), row.names = c(NA, -40L), class = "data.frame")

Donde en X1 es el número de la persona y en X2 el grupo al que pertenece la persona. Una persona puede estar en diferentes grupos. Ahora quiero dibujar una línea de cada persona a cada grupo al que pertenece. Conplot() Lo resolví de esta manera:

plot(0, xlim=c(0,1), ylim=c(0,1), type="n", axes=FALSE, xlab="", ylab="")

factor.to.int <- function(f) {
  (as.integer(f) - 1) / (length(levels(f)) - 1)
}

segments(factor.to.int(data$X1), 0, factor.to.int(data$X2), 1, col=data$X1)
axis(1, at = seq(0, 1, by = 1 / (length(levels(data$X1)) - 1)), labels = levels(data$X1))
axis(3, at = seq(0, 1, by = 1 / (length(levels(data$X2)) - 1)), labels = levels(data$X2))

El resultado se ve así:

Ahora me pregunto cómo puedo hacer esto con ggplot2?

¡Gracias por tu ayuda!

Respuestas a la pregunta(1)

Su respuesta a la pregunta