Home > other >  Set the number of decimals in values dipslayed in gpplotly()
Set the number of decimals in values dipslayed in gpplotly()

Time:03-09

I have the dataframe below:

dt2<-structure(list(year2 = c(1950, 1955, 1960, 1965, 1970, 1975, 
1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015), pta_count = c(2, 
4, 10, 14, 24, 18, 13, 19, 84, 100, 105, 96, 47, 15), scope_ntis_mean = c(3.5, 
9.5, 5, 9.57142857142857, 4.54166666666667, 11.7222222222222, 
6.23076923076923, 7.05263157894737, 17.1071428571429, 15.16, 
15.2761904761905, 17.6354166666667, 22.9574468085106, 26.8666666666667
), scope_ntis_sd = c(0.707106781186548, 11.7046999107196, 6.25388767976457, 
8.72409824049971, 4.56812364359683, 9.2278705436976, 5.11784209333462, 
10.7779284971676, 13.2864799994027, 12.9643801053175, 12.1295056958191, 
12.7964796077233, 12.4375963125981, 14.5791762782532), scope_ntis_se = c(0.822426813475736, 
9.62625905026287, 3.25294959458435, 3.83516264302846, 1.53376734188638, 
3.57760589505535, 2.33476117415722, 4.06710846230115, 2.38450123589789, 
2.13245076374089, 1.94704374916827, 2.14823678655809, 2.98410970181292, 
6.19176713030084), scope_ntis_cil = c(2.67757318652426, -0.12625905026287, 
1.74705040541565, 5.73626592840011, 3.00789932478029, 8.14461632716687, 
3.89600805661201, 2.98552311664622, 14.722641621245, 13.0275492362591, 
13.3291467270222, 15.4871798801086, 19.9733371066977, 20.6748995363658
), scope_ntis_ciu = c(4.32242681347574, 19.1262590502629, 8.25294959458435, 
13.406591214457, 6.07543400855305, 15.2998281172776, 8.56553040492645, 
11.1197400412485, 19.4916440930407, 17.2924507637409, 17.2232342253587, 
19.7836534532248, 25.9415565103236, 33.0584337969675)), row.names = c(NA, 
-14L), class = c("tbl_df", "tbl", "data.frame"))

and I create plot with ggplotly() in which I want every y number when you hover over plot to have only 2 decimals. I use format(round(x, 2), nsmall = 2) but I get :

Discrete value supplied to continuous scale


p<-ggplotly(ggplot(dt2, aes(x=year2))   
              
              geom_col(aes(y=pta_count/(max(dt2$pta_count)/max(dt2$scope_ntis_ciu))
                           
              ),
              fill="darkolivegreen",alpha=0.3,width=3) 
              geom_point(aes(y=scope_ntis_mean
              )) 
              geom_segment(aes(x=year2,y=scope_ntis_cil,xend=year2,yend=scope_ntis_ciu
              ),
              arrow=arrow(length=unit(0.1,"cm"),
                          ends='both'),
              lineend="square",size=0.3)  
              scale_x_continuous(n.breaks=14) 
              # Custom the Y scales:
              scale_y_continuous(
                
                # Features of the first axis
                name = "NTI Scope\n(scope measures the sum of all NTIs mentioned in a PTA,\ndot indicated mean scope per 5-year interval,\n arrows signal confidence intervals)",
                
                # Add a second axis and specify its features
                sec.axis = sec_axis( ~ . * max(dt2$pta_count)/max(dt2$scope_ntis_ciu), name="PTA Count\n(green columns indicate number of PTAs\n signed in given 5-year intervall)")
              ) 
              labs(x='') 
              theme_bw() theme(axis.title = element_text(size = 8),
                               axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
                               text=element_text( family="Montserrat") ))%>% 
  add_trace(inherit = F, x = ~year2,
            y = ~(pta_count/(max(pta_count)/ max(scope_ntis_ciu))
            ) * (max(dt2$pta_count)/max(dt2$scope_ntis_ciu)),
            data = dt2, 
            yaxis = "y2", 
            hoverinfo="skip",
            alpha = 0,                        # make it invisible
            type = "bar") %>% 
  layout(margin = list(l = 85, r = 85),
         yaxis2 = list(
           ticklen = 3.7,                     # to match other axes
           tickcolor = "rgba(51, 51, 51, 1)", # to match other axes
           tickfont = list(size = 11.7,       # to match other axes
                           color = "rgba(77, 77, 77, 1)"), # to match the others
           titlefont = list(size = 11.7),     # to match other axes
           side = "right",    
           overlaying = "y",
           showgrid = F,      # to match ggplot version
           dtick = 25,        # between ticks
           title = "PTA Count\n(green columns indicate number of PTAs\n signed in given 5-year interval)"))

p

CodePudding user response:

If you want to round your data before graphing, round the data in the data frame before making the ggplot object, as @benson23 advised.

Like @Bas advised, you can modify the hovertemplate. You will need to do this for each trace (one for each geom). It doesn't have to be exactly as he has written this, you could write "Year: %{x}<br>Count of Issues: %{y}" for p$x$data[[2]], which is the geom_point layer (or trace when it is plotly).

enter image description here

I benefit from knowing that you wanted custom labels, either way. If you're going to round the labels, especially custom labels, round them when you create the labels.

I've added text to each geom_. (I used round, but format would have worked there, as well.)

I also added tooltip = "text" to the ggplotly() call (easy to forget that part!).

(p <- ggplotly(
  ggplot(dt2, aes(x = year2))   
    geom_col(aes(y = pta_count/(max(pta_count)/max(scope_ntis_ciu)), 
                 text = paste0("Year: ", year2,
                               "\nCount of Issues: ",      # rounded
                               round(pta_count/(max(pta_count)/max(scope_ntis_ciu)), 2)) 
                 ), 
             fill = "darkolivegreen", alpha = 0.3, width = 3)  
    geom_point(aes(y = scope_ntis_mean,
                   text = paste0("Year: ", year2,
                                 "\nCount of Issues: ",     # rounded
                                 round(scope_ntis_mean, 2))
                   ))  
    geom_segment(aes(x = year2, y = scope_ntis_cil, 
                     xend = year2, yend = scope_ntis_ciu,
                     text = paste0("Year: ", year2,
                                   "\nCount of Issues: ",   # rounded
                                   round(scope_ntis_cil, 2),
                                   "\nThe other issues?: ", # rounded
                                   round(scope_ntis_ciu, 2))
                     ), 
                 arrow = arrow(length = unit(0.1, "cm"), ends = 'both'), 
                 lineend = "square", size = 0.3)   
    scale_x_continuous(n.breaks = 14)  
    # Custom the Y scales:
    scale_y_continuous(
      # Features of the first axis
      name = "NTI Scope\n(scope measures the sum of all NTIs mentioned in a PTA, \ndot indicated mean scope per 5-year interval, \n arrows signal confidence intervals)", 
      # Add a second axis and specify its features
      sec.axis = sec_axis( 
        ~ . * max(dt2$pta_count)/max(dt2$scope_ntis_ciu), 
        name = "PTA Count\n(green columns indicate number of PTAs\n signed in given 5-year intervall)"))  
    labs(x = '')  
    theme_bw()  
    theme(axis.title = element_text(size = 8), 
          axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)), 
          text = element_text( family = "Montserrat")),
  tooltip = "text") %>%                        # <<<----- tooltip = "text"
   add_trace(inherit = F, x = ~year2, 
             y = ~(pta_count/(max(pta_count)/ max(scope_ntis_ciu))
             ) * (max(dt2$pta_count)/max(dt2$scope_ntis_ciu)), 
             data = dt2, 
             yaxis = "y2", 
             hoverinfo = "skip", 
             alpha = 0,                        # make it invisible
             type = "bar") %>% 
   layout(margin = list(l = 85, r = 85), 
          yaxis2 = list(
            ticklen = 3.7,                     # to match other axes
            tickcolor = "rgba(51, 51, 51, 1)", # to match other axes
            tickfont = list(size = 11.7,       # to match other axes
                            color = "rgba(77, 77, 77, 1)"), # to match the others
            titlefont = list(size = 11.7),     # to match other axes
            side = "right",    
            overlaying = "y", 
            showgrid = F,      # to match ggplot version
            dtick = 25,        # between ticks
            title = "PTA Count\n(green columns indicate number of PTAs\n signed in given 5-year interval)")))

enter image description here enter image description here enter image description here

  • Related