mantenga las líneas seleccionadas en el eje x y etiquete en un segmento particular en Y

Aquí está mi parcela

dat <- data.frame(
  pos = c(1, 3, 5, 8, 10, 12),
  start = c(1,3, 6, 7, 10, 11),
  end = c(5, 6, 9, 9, 13, 12)
)

library(ggplot2)
p <- ggplot(dat) + geom_segment(aes(x=start, y=pos, xend=end, yend=pos), 
       color="blue", size=2) + ylab("Fragments)") +  xlab("Position")
    scale_y_reverse() + theme_bw()

p1 <- p + opts(legend.position="left",
        panel.background=theme_blank(),panel.border=theme_blank(),
        panel.grid.major=theme_blank(),
        panel.grid.minor=theme_blank(),plot.background=theme_blank())


p1

enter image description here

La versión deseada en mapa de bits es, con línea de eje y etiquetas cerca de los segmentos. [solo nota adicional: tenga en cuenta que el mapa de bits cambió la línea a un final redondo (sería interesante ver si podemos hacerlo en el ggplot2)]

enter image description here

preguntado el 03 de mayo de 12 a las 16:05

Se puede hacer en ggplot2, incluso con los extremos de la línea redonda. -

2 Respuestas

Curiosamente, en realidad creo que esto es más fácil en los gráficos base:

plot(c(0,13),c(1,12),type = "n",axes = FALSE,xlab = "Position",ylab = "")
segments(x0 = dat$start,
         y0 = dat$pos,
         x1 = dat$end,
         y1 = dat$pos,
         col = "blue",
         lwd = 6,
         lend = 2)
text(x = dat$start - 0.5,y = dat$pos,labels = dat$pos,font = 2)
axis(1)
axis(1,at = c(0,12),labels = FALSE,tcl = 0.5)

Editar Añadido adicional axis llame para obtener la marca más externa en ambas direcciones.

enter image description here

contestado el 03 de mayo de 12 a las 16:05

EDIT: Actualización de código para ggplot2 Versión 0.9.3.1.

La tarea es mucho más fácil con las versiones recientes de ggplot2. El siguiente código lo hace todo:

# Load required packages
library(ggplot2)

# Your data
dat <- data.frame(
  pos = c(1, 3, 5, 8, 10, 12),
  start = c(1,3, 6, 7, 10, 11),
  end = c(5, 6, 9, 9, 13, 12) )

# Get the  plot
p <- ggplot(dat) + 
   geom_segment(aes(x=start, y=pos, xend=end, yend=pos), 
         color="blue", size=2, lineend = "round") + 
   ylab("Fragments") +  xlab("Position") + 
   theme_bw() +
   geom_text(aes(label = pos, x = start, y = pos), hjust = 1.7) +
   scale_x_continuous(breaks = seq(0,14,2), labels = seq(0,14,2), expand = c(0,0)) +
   scale_y_continuous(limits = c(-1, 14), expand = c(0,0))  +
   geom_hline(yintercept = -1) +
   geom_segment(aes(x = 0, y = -1, xend = 0, yend = -0.9)) +
   geom_segment(aes(x = 14, y = -1, xend = 14, yend = -0.9)) +
   theme(panel.grid.major=element_blank(),
       panel.grid.minor=element_blank(),
       panel.border=element_blank(),
       axis.ticks.y = element_blank(), 
       axis.title.y = element_blank(),
       axis.text.y = element_blank())
p

Respuesta original:

Se puede hacer en ggplot2, con un poco de manipulación. Funciones de la grid() paquete son necesarios para eliminar las marcas de verificación del eje y.

# Load required packages
library(ggplot2)
library(grid)

# Your data
dat <- data.frame(
  pos = c(1, 3, 5, 8, 10, 12),
  start = c(1,3, 6, 7, 10, 11),
  end = c(5, 6, 9, 9, 13, 12) )

# Get the base plot
p <- ggplot(dat) + 
   geom_segment(aes(x=start, y=pos, xend=end, yend=pos), 
   color="blue", size=2) + ylab("Fragments") +  xlab("Position") + theme_bw() +
   geom_text(aes(label = pos, x = start, y = pos), hjust = 1.7) +
   scale_x_continuous(breaks = seq(0,14,2), labels = seq(0,14,2), expand = c(0,0)) +
   scale_y_continuous(limits = c(-1, 14), expand = c(0,0))  +
   geom_hline(yintercept = -1) +
   geom_segment(aes(x = 0, y = -1, xend = 0, yend = -0.9)) +
   geom_segment(aes(x = 14, y = -1, xend = 14, yend = -0.9)) +
   opts(panel.grid.major=theme_blank(),
       panel.grid.minor=theme_blank(),
       panel.border=theme_blank(),
       axis.title.y = theme_blank(),
       axis.text.y = theme_blank())
p

# Remove the y-axis tick marks
g <- ggplotGrob(p)# Save plot as a grob
#grid.ls(g) 
grid.remove(grid.get("axis.ticks", grep=T, global = TRUE)[[1]]$name)

El resultado:

enter image description here

Con un poco más de manipulación, puede obtener extremos redondos en los segmentos de línea. necesita el proto paquete instalado. Luego, para ejecutar un código obtenido de aquí para habilitar una nueva geom geom_segment2 que se utilizará que toma un argumento de "fin de línea".

    # To create the new `geom_segment2`
library(proto)
GeomSegment2 <- proto(ggplot2:::GeomSegment, {
 objname <- "geom_segment2"
 draw <- function(., data, scales, coordinates, arrow=NULL, ...) {
   if (is.linear(coordinates)) {
     return(with(coord_transform(coordinates, data, scales),
       segmentsGrob(x, y, xend, yend, default.units="native",
       gp = gpar(col=alpha(colour, alpha), lwd=size * .pt,
         lty=linetype, lineend = "round"),
       arrow = arrow)
     ))
   }

}})

geom_segment2 <- function(mapping = NULL, data = NULL, stat =
"identity", position = "identity", arrow = NULL, ...)  {
  GeomSegment2$new(mapping = mapping, data = data, stat = stat,
        position = position, arrow = arrow, ...)
} 

    # The base plot
p <- ggplot(dat) + 
       geom_segment2(aes(x=start, y=pos, xend=end, yend=pos), 
       color="blue", size=2, lineend = "round") + ylab("Fragments") +  xlab("Position") + theme_bw() +
       geom_text(aes(label = pos, x = start, y = pos), hjust = 1.7) +
       scale_x_continuous(breaks = seq(0,14,2), labels = seq(0,14,2), expand = c(0,0)) +
       scale_y_continuous(limits = c(-1, 14), expand = c(0,0))  +
       geom_hline(yintercept = -1) +
       geom_segment(aes(x = 0, y = -1, xend = 0, yend = -0.9)) +
       geom_segment(aes(x = 14, y = -1, xend = 14, yend = -0.9)) +
       opts(panel.grid.major=theme_blank(),
           panel.grid.minor=theme_blank(),
           panel.border=theme_blank(),
           axis.title.y = theme_blank(),
           axis.text.y = theme_blank())
p

## Remove the y-axis tick marks
g <- ggplotGrob(p)
#grid.ls(g) 
grid.remove(grid.get("axis.ticks", grep=T, global = TRUE)[[1]]$name)

El resultado:

enter image description here

Respondido 23 Jul 13, 01:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.