Home > Software design >  how to return the expected graph (ggplot2, ellipse in r)?
how to return the expected graph (ggplot2, ellipse in r)?

Time:09-22

Hy, I have this:


library(ggplot2)
   data.frame(obs=c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10","X11","X12","X13","X14","X15","X16","X17","X18","X19","X20","X21","X22","X23","X24"),
              V1=c(0.12299204,0.82459186,0.74426426,0.74518490,0.90235626,0.80238518,0.14670287,0.29485058,0.15263963,0.35564952,0.74018218,0.90043726,0.89870240,0.11331604,0.38224485,0.30905100,0.16173775,0.06165922,0.16236031,0.19410052,0.15621499,0.14355361,0.09841802,0.14200906),
              V2=c(-0.07667381, 0.05661226,-0.06755684, 0.24279246, 0.20566121, 0.09090093,-0.15771084, 0.68288156, 0.05995853, 0.17265401, 0.10524241, 0.28202393, 0.13269340,-0.06152291, 0.14251037, 0.32915325,-0.15536643,-0.06455349, 0.89639327, 0.25273722,-0.12570665, 0.95207149, 0.32158002, 0.93175509),
              V3=c( 0.785128638, 0.137638800, 0.413372884, 0.071252925, 0.153475018, 0.288985725,-0.003831879,-0.035310199, 0.149559691, 0.180806799,-0.011326334,-0.029067359, 0.093260484,-0.053193781,-0.068764135, 0.123221407,-0.044328208, 0.857713525, 0.104352647, 0.807427676, 0.504358226,-0.013406375, 0.751067158, 0.105874634),
              V4=c(-0.017742238, 0.216325083, 0.121780449, 0.114055328, 0.078455652, 0.218005225, 0.405876010,-0.089009642, 0.099241491, 0.107780652, 0.248500052, 0.050069182, 0.219363523,-0.094918144, 0.725727266, 0.724975094, 0.621679968,-0.118206228, 0.145886691, 0.249329008,-0.188579718, 0.049934405, 0.007372841, 0.025672350),
              V5=c( 0.01547677, 0.16555178, 0.26019454, 0.08977182, 0.21660527, 0.35163419, 0.71035498, 0.35886762, 0.87849390,-0.01351151,-0.35429053, 0.02127159,-0.05830117,-0.05454903, 0.06498632, 0.06387208, 0.21214453,-0.07420916,-0.11399133, 0.13361320, 0.17796307,-0.01886769, 0.16513371,-0.02091601),
              V6=c( 0.071459381, 0.103824145, 0.296293694, 0.318562131, 0.026584128, 0.044575715, 0.394070695, 0.301593577,-0.070145516, 0.815826736, 0.204876351,-0.006624310, 0.087139899,-0.008305995, 0.088330589, 0.229090697,-0.256193405,-0.068229882, 0.059314345, 0.163380601, 0.603980086,-0.020015746, 0.219288132,-0.040558617),
              V7=c( 0.0937721448, 0.1257961637, 0.0818954368, 0.3470549669,-0.0145647326, 0.0595075312,-0.0075184176,-0.1745364284,-0.0544797910, 0.0934216940,-0.0933605187,-0.1502702725, 0.0734903991, 0.9511026556,-0.1550272896,-0.0449080619, 0.0524177580,-0.1177789182, 0.0040840036,-0.0208707253,-0.1842557001, 0.0124933572,-0.0008850238,-0.0037866599),
              group=c("I","I","II","II","II","II","III","III","III","II","II","II","II","III","III","III","III","II","II","II","II","III","III","III")
   )->df

   ggplot(y,aes(x = V1, y = V2,label=factor(obs), color=factor(group), shape =factor(group)))  
     geom_text_repel(show_guide=F) 
     geom_point(size=2) 
     guides(
       colour = guide_legend(
         override.aes = list(shape = c(15,16,17))
       )
     ) 
     scale_shape(guide = FALSE) 
     labs(color="Legend") 
     guides(
       shape = FALSE,
       color = guide_legend(override.aes = list(shape = c(16,17,15)))) 
     theme_classic()

Output:

enter image description here

I couldn't integrate the stat_ellipse function, any idea how to make the graph below?

Expected output:

enter image description here

CodePudding user response:

You need a variable/criteria for each ellipse, here an example for two random ellipses.

Data

ellipse1 <- c("X23","X20","X16","X10","X15","X18","X14","X1","X21","X7")

df <-
  data.frame(
    obs=c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10","X11","X12","X13","X14","X15","X16","X17","X18","X19","X20","X21","X22","X23","X24"),
    V1=c(0.12299204,0.82459186,0.74426426,0.74518490,0.90235626,0.80238518,0.14670287,0.29485058,0.15263963,0.35564952,0.74018218,0.90043726,0.89870240,0.11331604,0.38224485,0.30905100,0.16173775,0.06165922,0.16236031,0.19410052,0.15621499,0.14355361,0.09841802,0.14200906),
    V2=c(-0.07667381, 0.05661226,-0.06755684, 0.24279246, 0.20566121, 0.09090093,-0.15771084, 0.68288156, 0.05995853, 0.17265401, 0.10524241, 0.28202393, 0.13269340,-0.06152291, 0.14251037, 0.32915325,-0.15536643,-0.06455349, 0.89639327, 0.25273722,-0.12570665, 0.95207149, 0.32158002, 0.93175509),
    group=c("I","I","II","II","II","II","III","III","III","II","II","II","II","III","III","III","III","II","II","II","II","III","III","III")
  ) %>% 
  as_tibble() %>% 
  mutate(
    ellipse = case_when(
      obs %in% ellipse1 ~ 1,
      TRUE ~ 2
    )
  )

How to

df %>% 
  ggplot(aes(x = V1, y = V2,label=factor(obs), color=factor(group), shape =factor(group)))  
  geom_text_repel(show.legend = FALSE) 
  geom_point(size=2) 
  guides(
    shape = FALSE,
    colour = guide_legend(
      override.aes = list(shape = c(16,17,15))
    )
  ) 
  labs(color="Legend") 
  theme_classic() 
  stat_ellipse(aes(group = ellipse), linetype = "dashed")

enter image description here

  • Related