Reputation: 121
This question is kind of a follow-up to this one:
ggplotly dropdown menu default graph incorrect
I am opening a new one as it seems the more correct thing to do.
I need to perform a modification to my previous plotly object, by adding a fill aestetics, that will only affect 1 plot/group/Indicator out of the 8, with this desired output:
So this is the new data frame:
structure(list(Indicator = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L), levels = c("Criminalisation of torture under domestic law",
"Designation of the National Preventive Mechanism (in law)",
"Existence of National Human Rights Institution that fully complies with Paris Principles",
"Operationality of the National Preventive Mechanism", "Prohibition of torture in the constitution",
"Ratification of Optional Protocol (OPCAT)", "Ratification of the UN Convention against Torture",
"Submission of initial report to CAT"), class = "factor"), Input = c("Partially",
"Partially", "Partially", "Partially", "Partially", "Partially",
"Partially", "Partially", "Partially", "Partially", "Partially",
"Partially", "Partially", "Partially", "Partially", "Partially",
"Partially", "Partially", "Partially", "Partially", "Partially",
"Partially", "Partially", "Partially", "Partially", "Partially",
"Partially", "Partially", "Partially", "Partially", "Partially",
"Partially", "Partially", "Partially", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",
"Yes", "Yes", "Yes", "Yes"), Year = c(1984, 1986, 1987, 1990,
1991, 1992, 1993, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012, 2013, 2014, 2015,
2016, 2017, 2018, 2019, 2020, 2021, 2023, 2024, 1984, 1985, 1987,
1989, 1996, 1997, 2002, 2006, 2007, 2009, 2010, 2011, 2012, 2013,
2014, 2015, 2017, 2018, 2020, 2022, 2005, 2006, 2007, 2008, 2009,
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020,
2021, 2024, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
2019, 2020, 2021, 2022, 2024, 2006, 2007, 2008, 2009, 2010, 2011,
2012, 2013, 2014, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2024,
1984, 1985, 1986, 1987, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
2019, 2020, 2022, 2023, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2021,
2023, 2024, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
2018, 2019, 2020, 2021, 1988, 1989, 1990, 1992, 1993, 1994, 1995,
1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
2018, 2019, 2022, 2023, 2024), number = c(8L, 2L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 4L, 3L, 1L, 2L, 1L, 2L, 2L, 5L, 5L, 1L, 7L, 5L,
1L, 3L, 4L, 2L, 2L, 1L, 5L, 6L, 6L, 3L, 5L, 3L, 1L, 2L, 1L, 1L,
1L, 1L, 2L, 1L, 1L, 1L, 3L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L,
2L, 2L, 1L, 9L, 3L, 9L, 4L, 6L, 7L, 7L, 5L, 3L, 2L, 5L, 7L, 2L,
1L, 2L, 3L, 16L, 7L, 6L, 2L, 4L, 2L, 2L, 4L, 3L, 2L, 2L, 2L,
3L, 1L, 1L, 2L, 2L, 3L, 3L, 2L, 2L, 5L, 3L, 5L, 2L, 1L, 3L, 5L,
7L, 4L, 4L, 9L, 3L, 7L, 6L, 2L, 7L, 5L, 1L, 1L, 1L, 1L, 21L,
1L, 3L, 6L, 1L, 3L, 10L, 9L, 5L, 5L, 8L, 8L, 2L, 2L, 4L, 1L,
2L, 5L, 3L, 3L, 1L, 2L, 6L, 1L, 6L, 7L, 5L, 4L, 2L, 4L, 5L, 3L,
4L, 2L, 1L, 1L, 1L, 3L, 3L, 11L, 14L, 3L, 8L, 7L, 7L, 5L, 4L,
5L, 6L, 4L, 3L, 4L, 1L, 2L, 1L, 2L, 1L, 14L, 13L, 10L, 10L, 7L,
8L, 7L, 8L, 7L, 7L, 8L, 3L, 6L, 7L, 4L, 6L, 5L, 2L, 5L, 2L, 3L,
1L, 2L, 1L, 2L, 4L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 2L, 2L, 1L, 5L,
2L, 12L, 11L, 6L, 3L, 13L, 3L, 8L, 7L, 6L, 7L, 4L, 1L, 3L, 7L,
1L, 2L, 3L, 3L, 3L, 4L, 3L, 3L, 3L, 1L, 2L, 3L, 3L, 3L, 1L, 1L,
1L), `Number of States` = c(8L, 10L, 11L, 12L, 13L, 14L, 16L,
18L, 20L, 24L, 27L, 28L, 30L, 31L, 33L, 35L, 40L, 45L, 46L, 53L,
58L, 59L, 62L, 66L, 68L, 70L, 71L, 76L, 82L, 88L, 91L, 96L, 99L,
100L, 2L, 3L, 4L, 5L, 6L, 8L, 9L, 10L, 11L, 14L, 16L, 17L, 18L,
19L, 21L, 23L, 24L, 25L, 26L, 28L, 2L, 3L, 12L, 15L, 24L, 28L,
34L, 41L, 48L, 53L, 56L, 58L, 63L, 70L, 72L, 73L, 75L, 78L, 16L,
23L, 29L, 31L, 35L, 37L, 39L, 43L, 46L, 48L, 50L, 52L, 55L, 56L,
57L, 59L, 61L, 64L, 67L, 69L, 71L, 76L, 79L, 84L, 86L, 1L, 4L,
9L, 16L, 20L, 24L, 33L, 36L, 43L, 49L, 51L, 58L, 63L, 64L, 65L,
66L, 67L, 21L, 22L, 25L, 31L, 32L, 35L, 45L, 54L, 59L, 64L, 72L,
80L, 82L, 84L, 88L, 89L, 91L, 96L, 99L, 102L, 103L, 105L, 111L,
112L, 118L, 125L, 130L, 134L, 136L, 140L, 145L, 148L, 152L, 154L,
155L, 156L, 157L, 3L, 6L, 17L, 31L, 34L, 42L, 49L, 56L, 61L,
65L, 70L, 76L, 80L, 83L, 87L, 88L, 90L, 91L, 93L, 94L, 14L, 27L,
37L, 47L, 54L, 62L, 69L, 77L, 84L, 91L, 99L, 102L, 108L, 115L,
119L, 125L, 130L, 132L, 137L, 139L, 142L, 143L, 145L, 146L, 148L,
152L, 153L, 155L, 157L, 159L, 161L, 164L, 167L, 169L, 171L, 1L,
6L, 8L, 20L, 31L, 37L, 40L, 53L, 56L, 64L, 71L, 77L, 84L, 88L,
89L, 92L, 99L, 100L, 102L, 105L, 108L, 111L, 115L, 118L, 121L,
124L, 125L, 127L, 130L, 133L, 136L, 137L, 138L, 139L)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -240L))
If I apply the fixer function
fixer <- function(plt) {
plt <- plotly_build(plt) # ensure build is complete
vis <- c(F, F, F, F, T, F, F, F) # from `Prohibition...`
lapply(1:length(plt$x$data), \(j) { # hide all but first data set
plt$x$data[[j]]$visible <<- vis[[j]]
})
plt # return updated plot
}
@Kat kindly provided in the previous answer to my new plot
library(dplyr)
library(ggplot2)
library(plotly)
cbbPalette <- c("Partially" = "#F1B5B5",
"Yes" = "#E36360")
plot_dropdown <- ggplot(plot_df, aes(Year, `Number of States`)) +
lapply(levels(plot_df$Indicator), \(x) {
list(geom_col(data = ~ subset(.x, Indicator == x), mapping = aes(fill = Input)))
}) +
scale_fill_manual(values = cbbPalette, name = "Compliant?") +
labs(x = NULL,
y = NULL) +
theme_classic() +
theme(panel.background = element_rect(fill = "#C5DAF8"),
plot.background = element_rect(fill = "#C5DAF8"),
legend.position = c(.15,.85),
legend.background = element_blank())
ggplotly(plot_dropdown) %>%
layout(showlegend = F,
updatemenus = list(
list(xanchor = "left",
y = 1.1,
active = 4,
buttons = list(list(method = "restyle",
args = list("visible", c(T, F, F, F, F, F, F, F)),
label = "Criminalisation of torture under domestic law"),
list(method = "restyle",
args = list("visible", c(F, T, F, F, F, F, F, F)),
label = "Designation of the National Preventive Mechanism (in law)"),
list(method = "restyle",
args = list("visible", c(F, F, T, F, F, F, F, F)),
label = "Existence of National Human Rights Institution that fully complies with Paris Principles"),
list(method = "restyle",
args = list("visible", c(F, F, F, T, F, F, F, F)),
label = "Operationality of the National Preventive Mechanism"),
list(method = "restyle",
args = list("visible", c(F, F, F, F, T, F, F, F)),
label = "Prohibition of torture in the constitution"),
list(method = "restyle",
args = list("visible", c(F, F, F, F, F, T, F, F)),
label = "Ratification of Optional Protocol (OPCAT)"),
list(method = "restyle",
args = list("visible", c(F, F, F, F, F, F, T, F)),
label = "Ratification of the UN Convention against Torture"),
list(method = "restyle",
args = list("visible", c(F, F, F, F, F, F, F, T)),
label = "Submission of initial report to CAT"))))) %>%
config(displayModeBar = FALSE) %>%
fixer()
I receive this message:
Error in vis[[j]] : subscript out of bounds
and in fact now plt$x$data has 9 elements, not 8 anymore, meaning 1 more plot. This confuses me as the new element represents the new "Partially" fill aestetics.
I tried to fix the error by adding a new F
to the vis
vector in the fixer()
function, both before the T
and at the end.
That returns a graph, but of course it is not correct, besides missing the inside legend (but maybe this is just a plotly problem):
Upvotes: 1
Views: 40