Cómo pedir geom_segment ggplot con color

Oct 19 2020

Soy nuevo en la ggplotbiblioteca. Y tratando de dibujar la trama usando lo siguiente data.frame:

library(tidyverse)
df <-tribble(~event, ~startdate,~enddate,~loc,
      "A",as.POSIXct("1984/02/10"),as.POSIXct("1987/06/10"),"1",
      "B",as.POSIXct("1984/02/11"),as.POSIXct("1990/02/12"),"2",
      "A",as.POSIXct("1992/05/15"),as.POSIXct("1999/06/15"),"3",
      "C",as.POSIXct("2003/08/29"),as.POSIXct("2015/08/29"),"4",
      "B",as.POSIXct("2002/04/11"),as.POSIXct("2012/04/12"),"5",
      "E",as.POSIXct("2000/02/10"),as.POSIXct("2005/02/15"),"6")
max_date = max(df$startdate,df$enddate)

Usando el siguiente fragmento de código:

ggplot(NULL)+
  geom_segment(data = df,aes(x=loc, xend =loc,y = startdate, yend = enddate,colour=event),size = 5,alpha=0.6) +
  geom_label(aes(label=df$event,x = df$loc,y=max_date), size=2) +
  #geom_point(data=final_df,aes(x=newspaper,y=date),color="black") + Point from other data frame
  coord_flip() + xlab("LoC") + ylab("Year") 

Puedo generar el siguiente gráfico:

¿Cómo puedo ordenar el cuadro anterior usando el color, es decir, usando el eventcampo (en otras palabras, cómo puedo realizar grupo por operación en el eventcampo para que primero muestre primero todos los eventos A, luego los eventos B, C, etc.)? Intenté usar scale_x_continuousy reorderdesde el tidyversepaquete pero no funcionó. ¿Cómo puedo mostrar más "Año" en el eje x? Traté de usar scale_x_date(mencionado aquí R: ggplot muestra todas las fechas en el eje x pero necesita as.Datey ggplot geom_segmentnecesita as.POSIXctformato). ¡No dude en corregirme!

¡Cualquier ayuda sería genial! ¡Gracias!

Respuestas

2 ArthurYip Oct 19 2020 at 04:41

Dos opciones. También he invertido su xey para que no tenga que usar coord_flip()e hice varias otras pequeñas modificaciones, incluidas las etiquetas del eje x (que estaba buscando scale_y_datetimeya que invirtió los ejes y las "fechas" estaban en POSIXct). Además, una diferencia con la respuesta de Duck es mi scale = "free" in facet_grid. De todos modos, puede decidir que sus etiquetas y su variable "loc" no tengan sentido dados estos nuevos gráficos.

library(tibble); library(ggplot2)
df <-tribble(~event, ~startdate,~enddate,~loc,
             "A",as.POSIXct("1984/02/10"),as.POSIXct("1987/06/10"),"1",
             "B",as.POSIXct("1984/02/11"),as.POSIXct("1990/02/12"),"2",
             "A",as.POSIXct("1992/05/15"),as.POSIXct("1999/06/15"),"3",
             "C",as.POSIXct("2003/08/29"),as.POSIXct("2015/08/29"),"4",
             "B",as.POSIXct("2002/04/11"),as.POSIXct("2012/04/12"),"5",
             "E",as.POSIXct("2000/02/10"),as.POSIXct("2005/02/15"),"6")
max_date = max(df$startdate,df$enddate)

ggplot(df)+
  geom_segment(aes(y=event, yend = event, x = startdate, xend = enddate, colour=event),size = 5,alpha=0.6) +
  geom_label(aes(label=event, y = event, x=max_date), size=2) +
  xlab("Year") + ylab("LoC") +
  scale_x_datetime(date_breaks = "year", date_labels = "%Y") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))


ggplot(df)+
  geom_segment(aes(y=loc, yend = loc, x = startdate, xend = enddate, colour=event),size = 5,alpha=0.6) +
  geom_label(aes(label=event, y = loc, x=max_date), size=2) +
  xlab("Year") + ylab("LoC") +
  scale_x_datetime(date_breaks = "year", date_labels = "%Y") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  facet_grid(rows = vars(event), scales = "free")

Creado el 2020-10-18 por el paquete reprex (v0.3.0)

1 Duck Oct 19 2020 at 04:36

Considere esto como una opción, como lo menciona @ArthurYip , el reorden de la configuración podría afectar el sentido de su trama. Podría evitar las etiquetas y usar facet_grid()de la siguiente manera:

library(ggplot2)
#Plot
ggplot(df)+
  geom_segment(aes(x=loc, xend =loc,y = startdate, yend = enddate,colour=event),size = 5,alpha=0.6) +
  coord_flip() + xlab("LoC") + ylab("Year")+
  facet_grid(event~.,switch = "x")

Salida: