Bastien
Bastien

Reputation: 3178

Adding independent title to each subplot in plotly R

I'm trying to produce in R a similar plotly plot as the one described in this website and produced using Python. It's a horizontal barplot which was created by stacking multiple subplot onto of each other.

The plot looks like:

enter image description here

I'm getting close but I can't fully manage to reproduce it. The way the plot is program is roughly by:

The biggest problem I'm facing so far is the fact I'm not able to repeat the title of each individual subplots within the main plot.

Here is my code. Notice that there is a different title for each plot:

library(plotly)

# preparing bogus data
d <- data.frame(question = paste0("Question ", 1:10),
                value = seq(20, 1, -2))

# setting up a list to store the plots
ls_p <- NULL

# Create one plot (subplot) for each categories in my data
for(i in 1:nrow(d)){
  ls_p[[i]] <- plot_ly(d[i,], x=~value, y=~question) |>
    add_bars(orientation='h') |> #
    add_text(x=~value, y=~question, text=~value) |>
    layout(title = list(text=d$question[i],
                        xanchor = "left",
                        align = "left"),
           showlegend=F,
           grid=list(showgrid=F),
           xaxis=list(range=c(0,max(d$value)),
                      showticklabels =F),
           yaxis=list(showticklabels = F)
           )
}

# regroup all the subplots together
subplot(ls_p, nrows= nrow(d), shareX = T, which_layout = 1, titleX = F, titleY = F)

This code produces:

enter image description here

It is wrong a multiple ways:

It's there a way to produce this kind of graph in ploty-R or are we limited to plotly-python?

Upvotes: 2

Views: 628

Answers (1)

Quinten
Quinten

Reputation: 41533

You could use annotations in layout with text instead of a title. Here is a reproducible example:

library(plotly)

# preparing bogus data
d <- data.frame(question = paste0("Question ", 1:10),
                value = seq(20, 1, -2))

# setting up a list to store the plots
ls_p <- NULL

# Create one plot (subplot) for each categories in my data
for(i in 1:nrow(d)){
  ls_p[[i]] <- plot_ly(d[i,], x=~value, y=~question) |>
    add_bars(orientation='h') |> #
    add_text(x=~value, y=~question, text=~value) |>
    layout(annotations = list(text = d$question[i],
                              showarrow = FALSE),
           showlegend=F,
           grid=list(showgrid=F),
           xaxis=list(range=c(0,max(d$value)),
                      showticklabels =F),
           yaxis=list(showticklabels = F)
    )
}

# regroup all the subplots together
subplot(ls_p, nrows= nrow(d), shareX = T, which_layout = 1, titleX = F, titleY = F) 

Created on 2023-01-19 with reprex v2.0.2


Edit:

You could add an x coordinates to have the title on the left side like this:

library(plotly)

# preparing bogus data
d <- data.frame(question = paste0("Question ", 1:10),
                value = seq(20, 1, -2))

# setting up a list to store the plots
ls_p <- NULL

# Create one plot (subplot) for each categories in my data
for(i in 1:nrow(d)){
  ls_p[[i]] <- plot_ly(d[i,], x=~value, y=~question) |>
    add_bars(orientation='h') |> #
    add_text(x=~value, y=~question, text=~value) |>
    layout(annotations = list(text = d$question[i],
                              showarrow = FALSE,
                              x = 1.5),
           showlegend=F,
           grid=list(showgrid=F),
           xaxis=list(range=c(0,max(d$value)),
                      showticklabels =F),
           yaxis=list(showticklabels = F)
    )
}

# regroup all the subplots together
subplot(ls_p, nrows= nrow(d), shareX = T, which_layout = 1, titleX = F, titleY = F) 

Created on 2023-01-20 with reprex v2.0.2

Upvotes: 1

Related Questions