1
votes

I'm trying to plot with ggplot and it was working perfectly fine but when I add in tooltip modifiers it breaks the ggplot. Here's the code for ggplot:

ggplot() +
      # mean in blue, must have label in both geom_point and geom_line to show up??
      geom_point(data = sumsd, aes(x = Year, y = Mean, text = paste("Income Required Mean:", round(meanir, 2))), color = "blue") +
      geom_line(data = sumsd, aes(x = Year, y = Mean, text = paste("Income Required Mean:", round(meanir, 2))), color = "blue") +

      # median in red
      geom_point(data = sumsd, aes(x = Year, y = Median, text = paste("Income Required Median:", round(medianir, 2))), color = "red") +
      geom_line(data = sumsd, aes(x = Year, y = Median, text = paste("Income Required Median:", round(medianir, 2))), color = "red") +

      # BMR Mean in green
      geom_point(data = sumbmr, aes(x = sumbmr$year, y = BMRMean, text = paste("Income Required Mean:", round(meanir, 2))), color = "green") +
      geom_line(data = sumbmr, aes(x = sumbmr$year, y = BMRMean, text = paste("Income Required Mean:", round(meanir, 2))), color = "green") +

      # BMR Median in Orange
      geom_point(data = sumbmr, aes(x = sumbmr$year, y = BMRMedian, text = paste("Income Required Median:", round(medianir, 2))), color = "orange")  +
      geom_line(data = sumbmr, aes(x = sumbmr$year, y = BMRMedian, text = paste("Income Required Median:", round(medianir, 2))), color = "orange") +

      xlab('Date') +
      ylab('Affordability (%)')  

When you plot this, not only do lines not work, but there is double of everything.

enter image description here

The moment you remove the "text =" portion, it works perfectly fine.

enter image description here

I'm trying to use solutions from other SO questions but the issue is my situation is unique since I'm plotting from two different data frames. I am thinking one solution is combining the data frames and using group but I am unsure how to use group correctly in this situation.

dput(sumsd) looks like this:

structure(list(year = c(1998, 1999, 2000, 2001, 2002, 2003, 2004, 
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 
2016, 2017), Mean = c(93.7169512394609, 99.2423930840141, 121.481331406585, 
126.775399601736, 112.466413730831, 103.986381539689, 122.373342680171, 
150.048597477934, 160.564554366089, 155.500390025812, 125.850336953549, 
103.448554350041, 107.25827986955, 100.606707776528, 105.998796554414, 
122.709555550239, 136.83930367275, 152.282460118587, 160.071088660241, 
154.14808421977), Median = c(85.4917695475731, 91.2054228882549, 
109.098207512634, 110.406161651376, 104.009081592691, 97.4604892752744, 
115.880140364587, 136.170512471096, 143.124069920242, 146.579045544699, 
116.696166130696, 96.5748315397845, 99.3163207081357, 89.8676706522828, 
97.8773119273362, 117.628144815457, 124.999783492508, 139.339479286517, 
147.437503023617, 142.066431589906), meanir = c(75858.7132682999, 
86152.0494420347, 111134.855904496, 115687.697423248, 113855.557186688, 
115393.107622111, 135534.013451155, 164724.526543259, 177908.848180357, 
174125.940380747, 140992.212450383, 116111.239666518, 117619.195974371, 
110479.184428429, 118090.047869615, 135916.239598085, 152767.827229155, 
172914.018516023, 181629.609510369, 184693.920051047), medianir = c(70291.4599746587, 
80490.2933468334, 98809.4765667835, 99746.8318817087, 103924.176219962, 
107999.634110941, 129599.560933129, 150791.941966219, 160980.586693667, 
163018.315639156, 129905.220274953, 105961.905165452, 107490.201874569, 
97301.5571471213, 108610.952794588, 129799.258369787, 138565.568293283, 
158535.311959079, 165056.044584646, 169131.502475625)), class = c("tbl_df", 
"tbl", "data.frame"), .Names = c("year", "Mean", "Median", "meanir", 
"medianir"), row.names = c(NA, -20L), na.action = structure(11492L, .Names = "11492", class = "omit"))

dput(summer) looks like this:

structure(list(year = c(1998, 1999, 2000, 2001, 2002, 2003, 2004, 
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 
2016, 2017), Mean = c(35.5975039642586, 40.4455188619846, 35.7695849667396, 
37.1825436379744, 45.4697841345466, 35.71278205506, 32.8176166454225, 
34.8607395091664, 47.9769662900546, 40.1449272824002, 62.0633765342318, 
73.5812934677564, 61.3025427925627, 65.1843431889166, 63.0657096256395, 
61.9985219499782, 73.9313965758768, 59.0247038824931, 61.6204148196363, 
67.2245622451913), Median = c(33.3902476171523, 33.398651550511, 
32.6622247899155, 33.1914067114214, 33.680900044327, 29.3944814757642, 
29.4066908397235, 34.1874903650837, 37.0654203449693, 36.8544480044624, 
65.1026513371994, 80.6104753594162, 63.4793583608239, 65.3828352952037, 
65.2586468365118, 60.3592697123653, 68.8351812023184, 50.305834291634, 
59.2415687112354, 69.2928997343465), meanir = c(28551.9072419551, 
35059.1694067028, 33357.0651434246, 32833.0548035115, 45225.3426313333, 
39719.5872679614, 36100.1651757794, 38597.8771598172, 52338.4936958301, 
45002.9992336611, 62802.4596860642, 73434.1474408398, 59915.0792794635, 
64350.8687798733, 61140.2935901313, 63757.2783380522, 82978.0660506505, 
64859.9174437382, 67598.7321700551, 72403.9056481494), medianir = c(26337.6466204512, 
29791.5971830558, 30686.1601901257, 29831.1291245983, 33724.4140478504, 
32395.8147753913, 33497.2072704284, 38716.8499642996, 39495.2624214766, 
41977.2162770827, 62018.1785695242, 76539.6463537657, 63807.6102430058, 
66778.9247048712, 61669.4212605037, 61720.3644841409, 78437.6889800418, 
57270.3720129811, 59623.9489450214, 62814.0136091851)), class = c("tbl_df", 
"tbl", "data.frame"), .Names = c("year", "Mean", "Median", "meanir", 
"medianir"), row.names = c(NA, -20L), na.action = structure(c(12L, 
13L, 14L, 15L, 16L, 17L, 18L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 
81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 
94L, 95L, 96L, 97L, 98L, 99L, 100L, 101L, 102L, 103L, 104L, 105L, 
106L, 107L, 108L, 109L, 110L, 111L, 112L, 113L, 114L, 115L, 116L, 
117L, 118L, 250L, 251L, 252L, 253L, 254L, 255L, 256L, 257L, 258L, 
259L, 260L, 261L, 262L, 263L, 264L, 265L, 266L, 267L, 268L, 269L, 
270L, 271L, 272L, 273L, 274L, 275L, 276L, 277L, 278L, 279L, 280L, 
281L, 282L, 283L, 284L, 285L, 286L, 287L, 288L, 289L, 290L, 291L, 
292L, 293L, 294L, 295L, 296L, 297L, 298L, 299L, 300L, 301L, 302L, 
303L, 304L, 305L, 306L, 307L, 308L, 309L, 310L, 311L, 312L), .Names = c("12", 
"13", "14", "15", "16", "17", "18", "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", "250", "251", "252", "253", "254", "255", "256", 
"257", "258", "259", "260", "261", "262", "263", "264", "265", 
"266", "267", "268", "269", "270", "271", "272", "273", "274", 
"275", "276", "277", "278", "279", "280", "281", "282", "283", 
"284", "285", "286", "287", "288", "289", "290", "291", "292", 
"293", "294", "295", "296", "297", "298", "299", "300", "301", 
"302", "303", "304", "305", "306", "307", "308", "309", "310", 
"311", "312"), class = "omit"))

Please help!

2
I've had lots of problems using the ggplotly function, sometimes using the development versions has helped, but it is far from perfect. If you really want the interactivity, you may be better off fully jumping into plotly. Quite happy to offer a solution using plot_ly if that would be acceptable to you.Kevin Arseneau

2 Answers

2
votes

You need to use label and not text in your geoms.

enter image description here

However, you may find challenges (as I have) in producing production quality plots using plotly::ggplotly, it is not quite mature and I've found issues with positioning and labels that aren't quite ready for prime time yet.

Alternate solution

Additionally, I offer a full plotly solution, which circumvents the shortcomings in the plotly::ggplotly approach. Plot output below and the reproducible source for both following at the bottom.

enter image description here

Reproducible source

library(plotly)

sumsd <- structure(

  list(
    year = c(
      1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
      2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
    ),
    Mean = c(
      93.7169512394609, 99.2423930840141, 121.481331406585, 126.775399601736,
      112.466413730831, 103.986381539689, 122.373342680171, 150.048597477934,
      160.564554366089, 155.500390025812, 125.850336953549, 103.448554350041,
      107.25827986955, 100.606707776528, 105.998796554414, 122.709555550239,
      136.83930367275, 152.282460118587, 160.071088660241, 154.14808421977
    ),
    Median = c(
      85.4917695475731, 91.2054228882549, 109.098207512634, 110.406161651376,
      104.009081592691, 97.4604892752744, 115.880140364587, 136.170512471096,
      143.124069920242, 146.579045544699, 116.696166130696, 96.5748315397845,
      99.3163207081357, 89.8676706522828, 97.8773119273362, 117.628144815457,
      124.999783492508, 139.339479286517, 147.437503023617, 142.066431589906
    ),
    meanir = c(
      75858.7132682999, 86152.0494420347, 111134.855904496, 115687.697423248,
      113855.557186688, 115393.107622111, 135534.013451155, 164724.526543259,
      177908.848180357, 174125.940380747, 140992.212450383, 116111.239666518,
      117619.195974371, 110479.184428429, 118090.047869615, 135916.239598085,
      152767.827229155, 172914.018516023, 181629.609510369, 184693.920051047
    ),
    medianir = c(
      70291.4599746587, 80490.2933468334, 98809.4765667835, 99746.8318817087,
      103924.176219962, 107999.634110941, 129599.560933129, 150791.941966219,
      160980.586693667, 163018.315639156, 129905.220274953, 105961.905165452,
      107490.201874569, 97301.5571471213, 108610.952794588, 129799.258369787,
      138565.568293283, 158535.311959079, 165056.044584646, 169131.502475625
    )
  ),
  class = c("tbl_df", "tbl", "data.frame"),
  .Names = c("year", "Mean", "Median", "meanir", "medianir"),
  row.names = c(NA, -20L),
  na.action = structure(11492L, .Names = "11492", class = "omit")

)

sumbmr <- structure(

  list(
    year = c(
      1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
      2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
    ),
    Mean = c(
      35.5975039642586, 40.4455188619846, 35.7695849667396, 37.1825436379744,
      45.4697841345466, 35.71278205506, 32.8176166454225, 34.8607395091664,
      47.9769662900546, 40.1449272824002, 62.0633765342318, 73.5812934677564,
      61.3025427925627, 65.1843431889166, 63.0657096256395, 61.9985219499782,
      73.9313965758768, 59.0247038824931, 61.6204148196363, 67.2245622451913
    ),
    Median = c(
      33.3902476171523, 33.398651550511, 32.6622247899155, 33.1914067114214,
      33.680900044327, 29.3944814757642, 29.4066908397235, 34.1874903650837,
      37.0654203449693, 36.8544480044624, 65.1026513371994, 80.6104753594162,
      63.4793583608239, 65.3828352952037, 65.2586468365118, 60.3592697123653,
      68.8351812023184, 50.305834291634, 59.2415687112354, 69.2928997343465
    ),
    meanir = c(
      28551.9072419551, 35059.1694067028, 33357.0651434246, 32833.0548035115,
      45225.3426313333, 39719.5872679614, 36100.1651757794, 38597.8771598172,
      52338.4936958301, 45002.9992336611, 62802.4596860642, 73434.1474408398,
      59915.0792794635, 64350.8687798733, 61140.2935901313, 63757.2783380522,
      82978.0660506505, 64859.9174437382, 67598.7321700551, 72403.9056481494
    ),
    medianir = c(
      26337.6466204512, 29791.5971830558, 30686.1601901257, 29831.1291245983,
      33724.4140478504, 32395.8147753913, 33497.2072704284, 38716.8499642996,
      39495.2624214766, 41977.2162770827, 62018.1785695242, 76539.6463537657,
      63807.6102430058, 66778.9247048712, 61669.4212605037, 61720.3644841409,
      78437.6889800418, 57270.3720129811, 59623.9489450214, 62814.0136091851
    )
  ),
  class = c("tbl_df", "tbl", "data.frame"),
  .Names = c("year", "Mean", "Median", "meanir", "medianir"),
  row.names = c(NA, -20L),
  na.action = structure(
    c(
      12L, 13L, 14L, 15L, 16L, 17L, 18L, 61L, 62L, 63L, 64L, 65L, 66L, 67L,
      68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L,
      82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L,
      96L, 97L, 98L, 99L, 100L, 101L, 102L, 103L, 104L, 105L, 106L, 107L,
      108L, 109L, 110L, 111L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 250L,
      251L, 252L, 253L, 254L, 255L, 256L, 257L, 258L, 259L, 260L, 261L, 262L,
      263L, 264L, 265L, 266L, 267L, 268L, 269L, 270L, 271L, 272L, 273L, 274L,
      275L, 276L, 277L, 278L, 279L, 280L, 281L, 282L, 283L, 284L, 285L, 286L,
      287L, 288L, 289L, 290L, 291L, 292L, 293L, 294L, 295L, 296L, 297L, 298L,
      299L, 300L, 301L, 302L, 303L, 304L, 305L, 306L, 307L, 308L, 309L, 310L,
      311L, 312L
    ),
    .Names = c(
      "12", "13", "14", "15", "16", "17", "18", "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", "250", "251", "252",
      "253", "254", "255", "256", "257", "258", "259", "260", "261", "262",
      "263", "264", "265", "266", "267", "268", "269", "270", "271", "272",
      "273", "274", "275", "276", "277", "278", "279", "280", "281", "282",
      "283", "284", "285", "286", "287", "288", "289", "290", "291", "292",
      "293", "294", "295", "296", "297", "298", "299", "300", "301", "302",
      "303", "304", "305", "306", "307", "308", "309", "310", "311", "312"
    ),
    class = "omit"
  )

)

# ggplotly solution

sumsd <- sumsd %>%
  mutate(
    `Income Required Mean` = round(meanir, 2),
    `Income Required Median` = round(medianir, 2)
  )

sumbmr <- sumbmr %>%
  mutate(
    `Income Required Mean` = round(meanir, 2),
    `Income Required Median` = round(medianir, 2)
  )

gg <- ggplot() +
  # mean in blue, must have label in both geom_point and geom_line to show up??
  geom_point(data = sumsd, aes(x = year, y = Mean, label = `Income Required Mean`), color = "blue") +
  geom_line(data = sumsd, aes(x = year, y = Mean, label = `Income Required Mean`), color = "blue") +

  # median in red
  geom_point(data = sumsd, aes(x = year, y = Median, label = `Income Required Median`), color = "red") +
  geom_line(data = sumsd, aes(x = year, y = Median, label = `Income Required Median`), color = "red") +

  # BMR Mean in green
  geom_point(data = sumbmr, aes(x = year, y = Mean, label = `Income Required Mean`), color = "green") +
  geom_line(data = sumbmr, aes(x = year, y = Mean, label = `Income Required Mean`), color = "green") +

  # BMR Median in Orange
  geom_point(data = sumbmr, aes(x = year, y = Median, label = `Income Required Median`), color = "orange")  +
  geom_line(data = sumbmr, aes(x = year, y = Median, label = `Income Required Median`), color = "orange") +

  xlab('Date') +
  ylab('Affordability (%)')

ggplotly(gg)

# full plotly

plot_ly(type = "scatter", mode = "markers+lines") %>%
  add_trace(
    x = ~year,
    y = ~Mean,
    line = list(color = "blue"),
    marker = list(color = "blue"),
    hoverinfo = "text",
    text = ~paste(
      " Year: ", year, "<br>",
      "Mean: ", Mean, "<br>",
      "Income Required Mean: ", round(meanir, 2)
    ),
    showlegend = FALSE,
    name = "Mean",
    data = sumsd
  ) %>%
  add_trace(
    x = ~year,
    y = ~Median,
    line = list(color = "red"),
    marker = list(color = "red"),
    hoverinfo = "text",
    text = ~paste(
      " Year: ", year, "<br>",
      "Mean: ", Mean, "<br>",
      "Income Required Median: ", round(medianir, 2)
    ),
    showlegend = FALSE,
    name = "Median",
    data = sumsd
  ) %>%
  add_trace(
    x = ~year,
    y = ~Mean,
    line = list(color = "green"),
    marker = list(color = "green"),
    hoverinfo = "text",
    text = ~paste(
      " Year: ", year, "<br>",
      "Mean: ", Mean, "<br>",
      "Income Required Mean: ", round(meanir, 2)
    ),
    showlegend = FALSE,
    name = "BMR Mean",
    data = sumbmr
  ) %>%
  add_trace(
    x = ~year,
    y = ~Median,
    line = list(color = "orange"),
    marker = list(color = "orange"),
    hoverinfo = "text",
    text = ~paste(
      " Year: ", year, "<br>",
      "Mean: ", Mean, "<br>",
      "Income Required Median: ", round(medianir, 2)
    ),
    showlegend = FALSE,
    name = "BMR Median",
    data = sumbmr
  ) %>%
  layout(
    xaxis = list(title = ""),
    yaxis = list(title = "Affordability (%)")
  )
0
votes

The solution I found was to add a column called group and to number the first data frame as 1 in the group column and number the second data frame as 2 in the group column. Then, I merged the two data frames into one and added "group = group" in the aesthetics of ggplot. Here is the code:

Year <- sumsd$year
    Mean <- sumsd$Mean
    Median <- sumsd$Median
    sumbmr <- bmr %>% group_by(year)%>%summarise(Mean=mean(ipm), Median=median(ipm), meanir = mean(ir), medianir = median(ir))
    BMRMean <- sumbmr$Mean
    BMRMedian <- sumbmr$Median

    namevector4 <- c("group")
    sumbmr[,namevector4] <- 2

    sumsd$meanbmr = BMRMean
    sumsd$medianbmr = BMRMedian
    sumsd$meanbmrir = sumbmr$meanir
    sumsd$medianbmrir = sumbmr$medianir

ggplot(sumsd, group = group) +
      # mean in blue
      geom_point(aes(x = year, y = Mean, text = paste("Income Required Average:", round(meanir, 2))), group = 1, color = "blue") + 
      geom_line(aes(x = year, y = Mean, text = paste("Income Required Average:", round(meanir, 2))), group = 1, color = "blue") + 

      #median in red
      geom_point(aes(x = year, y = Median, text = paste("Income Required Median:", round(medianir, 2))), group = 2, color = "red") + 
      geom_line(aes(x = year, y = Median, text = paste("Income Required Median:", round(medianir, 2))), group = 2, color = "red") + 

      # BMR Mean in green
      geom_point(aes(x = year, y = meanbmr, text = paste("BMR Income Required Average:", round(meanbmrir, 2))), group = 3, color = "green") + 
      geom_line(aes(x = year, y = meanbmr, text = paste("BMR Income Required Average:", round(meanbmrir, 2))), group = 3, color = "green") + 

      # BMR Median in orange
      geom_point(aes(x = year, y = medianbmr, text = paste("BMR Income Required Median:", round(medianbmrir, 2))), group = 4, color = "orange") + 
      geom_line(aes(x = year, y = medianbmr, text = paste("BMR Income Required Median:", round(medianbmrir, 2))), group = 4, color = "orange") + 
      xlab('Date') +
      ylab('Affordability (%)') 

Chart seemed to function fine after using this code

enter image description here

Hopefully this will help someone out