jeron jeron - 3 years ago 116
R Question

geom_line not plotting when setting tooltip argument with ggplotly

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!

Answer Source

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 (%)")
  )
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download