Search code examples
rggplot2pointggplotlygeom-point

ggplotly() ignores legend and produce different plot with ggplot legend


I try to use ggplotly to run ggplot graph, but the legend label not showing the same things. Why it is? Please help. Thanks And also any idea to ignore the warning of changing to numeric data, so it doesnt show too many warning when run it through shiny. Thanks a lot

GGPLOT

GGPLOTLY

The code are below

structure(list(...1 = c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", 
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", 
"31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", 
"42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", 
"53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", 
"64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", 
"75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", 
"86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", 
"97", "98", "99", "100", "101", "102", "103", "104", "105", "106", 
"107", "108", "109", "110", "111", "112", "113", "114", "115", 
"116", "117", "118", "119", "120", "121", "122", "123", "124", 
"125", "126", "127", "128", "129", "130", "131", "132", "133", 
"134", "135", "136", "137", "138", "139", "140", "141", "142", 
"143", "144", "145", "146", "147", "148", "149"), indexlist = c(1, 
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 
126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149), datainput = c("112069", 
"7377.02", "Unanswered", "675900", "Unanswered", "17323000", 
"1935328.98", "411079", "Unanswered", "38530.29", "96.5", "89268", 
"6380000", "32185.99", "102103", "Unanswered", "Question no match", 
"Unanswered", "Unanswered", "1441914.2080000001", "681325", "89340.307000000001", 
"234", "9278", "9809", "259550", "675900", "Unanswered", "168322", 
"Unanswered", "435708.78", "962.15899999999999", "681325", "81000", 
"38759", "Unanswered", "Question no match", "Unanswered", "195747", 
"Unanswered", "7070890", "10739506", "65430.91", "Unanswered", 
"61900", "Unanswered", "Unanswered", "5130068", "11556", "Unanswered", 
"Unanswered", "102364", "Unanswered", "103451.19", "9756559.5299999993", 
"16520", "644039", "16.187999999999999", "Unanswered", "Unanswered", 
"13154.44", "Question no match", "Question no match", "125131", 
"Unanswered", "Unanswered", "Unanswered", "608470.29", "Question no match", 
"Unanswered", "Unanswered", "Unanswered", "10496.82", "195747", 
"21399", "Unanswered", "214050", "1439.18", "681104", "10587765", 
"11816", "69528", "Unanswered", "26519409", "Question no match", 
"1013315", "17323000", "114016", "117723", "Unanswered", "Question no match", 
"555872.6", "8442.34", "1995000", "Unanswered", "7208", "152495", 
"372366", "132191.5", "21399", "Unanswered", "195747", "3207.89", 
"Unanswered", "77629", "195747", "Question no match", "Unanswered", 
"400", "Unanswered", "555872.6", "3291303", "110296.5", "Unanswered", 
"55715.991999999998", "186011", "Unanswered", "Question no match", 
"Unanswered", "385000", "Unanswered", "142829.75599999999", "125131", 
"Question no match", "20981", "Unanswered", "186011", "9701.8629999999994", 
"Unanswered", "102103", "5138", "4395555.97", "118398.916", "1638.58", 
"2749023", "Unanswered", "9394598", "20960", "17323000", "1232.19", 
"240468", "6963.1", "Unanswered", "348.99400000000003", "2513000", 
"4449880.6100000003", "Unanswered", "Unanswered", "27522854"), 
    verification = c("Yes", "no information", "no answer", "Yes", 
    "no answer", "Yes", "Yes", "Yes", "no information", "no information", 
    "no information", "no information", "Yes", "Yes", "Yes", 
    "no answer", "No", "no information", "no answer", "Yes", 
    "Yes", "no information", "no information", "Yes", "Yes", 
    "Yes", "Yes", "no answer", "No", "no answer", "no information", 
    "no information", "Yes", "no information", "Yes", "no answer", 
    "No", "no information", "Yes", "no answer", "Yes", "Yes", 
    "Yes", "no answer", "Yes", "no answer", "no answer", "No", 
    "No", "no answer", "no information", "Yes", "no answer", 
    "Yes", "Yes", "Yes", "Yes", "No", "no answer", "no answer", 
    "Yes", "no information", "No", "No", "no information", "no answer", 
    "no answer", "No", "no information", "no answer", "no answer", 
    "no information", "No", "Yes", "No", "no answer", "Yes", 
    "Yes", "Yes", "Yes", "no information", "Yes", "no answer", 
    "Yes", "no information", "Yes", "Yes", "Yes", "Yes", "no answer", 
    "no information", "No", "no information", "Yes", "no answer", 
    "Yes", "Yes", "Yes", "Yes", "No", "no answer", "Yes", "Yes", 
    "no answer", "No", "Yes", "no information", "no answer", 
    "no information", "no answer", "No", "Yes", "No", "no information", 
    "No", "no answer", "no answer", "no information", "no answer", 
    "Yes", "no answer", "Yes", "No", "no information", "Yes", 
    "no answer", "no answer", "No", "no answer", "Yes", "no information", 
    "Yes", "No", "Yes", "Yes", "no answer", "Yes", "Yes", "Yes", 
    "Yes", "No", "No", "no answer", "no information", "Yes", 
    "Yes", "no answer", "no answer", "Yes")), row.names = c(NA, 
-149L), class = c("tbl_df", "tbl", "data.frame"))->data_a

    p <- data_a%>%
  select(indexlist, datainput, verification) %>%
  mutate_at(c("datainput"), as.numeric)%>%
  drop_na(c("datainput"))%>%
    ggplot(aes(x=1:length(`datainput`), y=`datainput`, label= `indexlist`, color = `verification` == "Yes"))+
  scale_colour_manual(name = 'Verification',breaks = c("TRUE", "FALSE"), values = c("green", "red"), labels = c("Verified", "Non-Verified"))+
    geom_point(size=1.5, alpha = 0.4)+ 
  geom_text(aes(label= ifelse(`datainput` > quantile(`datainput`, 0.975,na.rm = T), `indexlist`,"")),  vjust = "inward", hjust = "inward", size = 2, color = "grey50")+
  theme_minimal()+
  labs(title = "datainput Details",
       x = "",
       y = "")+
  theme(
  axis.text.x = element_text(size = 5.5),
  axis.text.y = element_text(size = 5.5),
  plot.title = element_text(color = "grey40", size = 9, face = "bold"))

ggplotly(p)

I have tried scale_manual_fill and colour but it doesnt work


Solution

  • Try to keep data cleaning/preparation separate from plotting, see cleaned data and plot, now the ggplot and plotly look the same:

    library(tidyverse)
    library(plotly)
    
    # prepare the data
    plotData <- data_a %>%
      select(indexlist, datainput, verification) %>%
      # remove non-numeric rows before converting
      filter(!grepl("^[^0-9.]+$", datainput)) %>% 
      # prepare data for plotting
      mutate(datainput = as.numeric(datainput),
             x = seq(n()),
             Verification = factor(ifelse(verification == "Yes", "Verified", "Non-Verified"),
                                   levels = c("Verified", "Non-Verified")),
             label = ifelse(datainput > quantile(datainput, 0.975, na.rm = TRUE),
                            indexlist, ""))
    
    # then plot with clean data
    p <- ggplot(plotData, aes(x = x, y = datainput, 
                              color = Verification, label = label)) +
      scale_colour_manual(values = c("green", "red"))+
      geom_point(size = 1.5, alpha = 0.4) + 
      geom_text(vjust = "inward", hjust = "inward", size = 2, color = "grey50") +
      theme_minimal() +
      labs(title = "datainput Details", x = "", y = "") +
      theme(axis.text.x = element_text(size = 5.5),
            axis.text.y = element_text(size = 5.5),
            plot.title = element_text(color = "grey40", size = 9, face = "bold"))
    
    # now plotly
    ggplotly(p)
    

    ggplot

    enter image description here

    plotly

    enter image description here