0
votes

I have the following dataset:

       dput(head(table_age))
structure(list(Age = c("0-19", "20-24", "25-29", "30-34", "35-39", 
"40-44"), Freq_nominal = c(1321, 3446, 5354, 7233, 7471, 6623
), Freq_percent = c(1.92, 5.01, 7.79, 10.52, 10.86, 9.63), Percent = c("1.92%", 
"5.01%", "7.79%", "10.52%", "10.86%", "9.63%"), Nominal = c(1321, 
3446, 5354, 7233, 7471, 6623), female = c(655L, 1473L, 2275L, 
2929L, 3081L, 2830L), male = c(665L, 1918L, 3002L, 4258L, 4347L, 
3762L), female_percent = c(2.2, 4.94, 7.63, 9.82, 10.33, 9.49
), female_percent_label = c("2.2%", "4.94%", "7.63%", "9.82%", 
"10.33%", "9.49%"), male_percent = c(1.73, 4.99, 7.8, 11.07, 
11.3, 9.78), male_percent_label = c("1.73%", "4.99%", "7.8%", 
"11.07%", "11.3%", "9.78%")), .Names = c("Age", "Freq_nominal", 
"Freq_percent", "Percent", "Nominal", "female", "male", "female_percent", 
"female_percent_label", "male_percent", "male_percent_label"), row.names = c(NA, 
6L), class = "data.frame")

I used ggplotly to interactivly plot the Age as a barchart, and display custom labels in the tooltip with the text parametar.

This is the working code:

t <- ggplot(table_age, aes(as.factor(Age), Freq_percent, text1 = Nominal, 
                           text = paste0("Age group: ", Age), text2 = Percent))  +

  geom_bar(position="dodge",stat="identity", fill = "deepskyblue4", width = 0.5) +

  theme(legend.title=element_blank()) +
  xlab("") + ylab("") +
  theme_minimal()

ggplotly(t, tooltip = c("text1", "text2"))

I want to overlay a line/point for each gender on top of the age barchart. In that respect, I have two problems:

  1. geom_point gets plotted through plotly, but not geom_line (when static plot it works fine)
  2. i don't know how to label the geom_points seperately from the geom_bar

This is my attempt code:

t <- ggplot(table_age, aes(as.factor(Age), Freq_percent, text1 = Nominal, 
                           text = paste0("Age group: ", Age), text2 = Percent))  +

  geom_bar(position="dodge",stat="identity", fill = "deepskyblue4", width = 0.5) +

  theme(legend.title=element_blank()) +
  xlab("") + ylab("") +
  theme_minimal()

t <- t + geom_point(data=table_age, aes(x=Age, y=female_percent), size = 2, color="magenta")
t <- t + geom_line(data=table_age, aes(x=Age, y=female_percent), colour="magenta")

ggplotly(t, tooltip = c("text1", "text2", "female"))

Any ideas?

1
Can you please make your code reproducible by adding the result of dput(table_age) to the question?GGamba
Thank you for the comment. I just updated the question.Prometheus

1 Answers

2
votes

geom_line() needs (usually) a group aesthetic, which we can set to a constant to have a single group of obs. This will display geom_line.

To display different tooltip we can use a single 'hidden' text aesthetic (as you already did) and override it.

In this case is better to define the aess inside each geom instead of defining inside the initial ggplot() call.

On to the code:

library(ggplot2)
library(plotly)

t <- ggplot(table_age)  +
    geom_bar(aes(as.factor(Age), 
                 Freq_percent, 
                 #text = paste0("Age group: ", Age), 
                 text1 = Nominal, 
                 text2 = Percent), 
             position = "dodge",
             stat = "identity",
             fill = "deepskyblue4",
             width = 0.5) +
    geom_point(aes(as.factor(Age), 
                   female_percent,
                   text1 = female), 
               size = 2, 
               color="magenta") +
    geom_line(aes(as.factor(Age), 
                  female_percent,
                  group = 1), 
              color = "magenta") +
    theme(legend.title = element_blank()) +
    xlab("") + 
    ylab("") +
    theme_minimal()
#> Warning: Ignoring unknown aesthetics: text1, text2
#> Warning: Ignoring unknown aesthetics: text1

t

ggplotly(t, tooltip = c("text1", "text2"))

enter image description here