Skip to content

Add alt-text functionality #4482

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 7, 2021
Merged

Add alt-text functionality #4482

merged 7 commits into from
Jun 7, 2021

Conversation

thomasp85
Copy link
Member

Fix #4477

As discussed, this provides a get_alt_text() function that will either pull a string from labels$alt or synthesise a description based on the content of the plot.

@hadley LMK if you don't have time to look at this before the release

@thomasp85 thomasp85 requested a review from hadley May 19, 2021 09:29
@thomasp85 thomasp85 added this to the ggplot2 3.3.4 milestone May 19, 2021
@thomasp85 thomasp85 requested a review from hadley May 20, 2021 09:25
@thomasp85
Copy link
Member Author

library(ggplot2)
p <- ggplot(mpg, aes(displ, hwy)) +
  geom_point()

get_alt_text(p)
#> [1] "A plot showing displ on the x-axis and hwy on the y-axis using a point layer"

p <- p + ggtitle("The relationship between displacement and yield in cars")
get_alt_text(p)
#> [1] "The relationship between displacement and yield in cars. A plot showing displ on the x-axis and hwy on the y-axis using a point layer"

# It will use scale information if available
p <- p + scale_x_continuous("highway miles per gallon")
get_alt_text(p)
#> [1] "The relationship between displacement and yield in cars. A plot showing highway miles per gallon on a continuous x-axis and hwy on the y-axis using a point layer"

# Add a short description of the main conclusion of the plot
p <- p + labs(alt_insight = "The higher the yield, the lower the displacement")
get_alt_text(p)
#> [1] "The relationship between displacement and yield in cars. A plot showing highway miles per gallon on a continuous x-axis and hwy on the y-axis using a point layer. The higher the yield, the lower the displacement"

# A user provided alt text takes precedence
p <- p + labs(
  alt = paste("A scatterplot showing the negative correlation between engine",
              "displacement as a function of highway miles per gallon")
)

get_alt_text(p)
#> [1] "A scatterplot showing the negative correlation between engine displacement as a function of highway miles per gallon"

Created on 2021-05-20 by the reprex package (v2.0.0)

Copy link
Member

@hadley hadley left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is probably worth a short bullet, mentioning the new labels and that we're working on tooling to automatically expose in Rmd.

R/labels.r Outdated
UseMethod("get_alt_text")
}
#' @export
get_alt_text.ggplot <- function(p, ...) {
Copy link
Contributor

@cpsievert cpsievert May 20, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we also get a method for the ggplot_build class? This would make the implementation for shiny::renderPlot() slightly easier (and more efficient), and might be useful in other situations

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better yet, would it be sensible for ggplot_build() to call this function and tack it onto the result?

…and allow retrival from both ggplot_built and gtable object
@thomasp85 thomasp85 requested a review from hadley May 26, 2021 07:18
thomasp85 and others added 2 commits June 1, 2021 10:53
Co-authored-by: Hadley Wickham <h.wickham@gmail.com>
@thomasp85
Copy link
Member Author

/document

@thomasp85 thomasp85 merged commit 8415be8 into v3.3.4-rc Jun 7, 2021
@jooyoungseo
Copy link

Sorry for asking here, but as an actual screen reader user myself, I was wondering if there would be any way for me to use alt argument in conjunction with BrailleR::VI() function. Say for example, in the following ggplot, what's the best way to pass BrailleR::VI(g) result to the plot alt text?

library(ggplot2)
library(BrailleR)
#> The BrailleR.View,  option is set to FALSE.
#> 
#> Attaching package: 'BrailleR'
#> The following objects are masked from 'package:graphics':
#> 
#>     boxplot, hist
#> The following object is masked from 'package:utils':
#> 
#>     history
#> The following objects are masked from 'package:base':
#> 
#>     grep, gsub

ggplot(mpg, aes(class)) +
  geom_bar() +
  labs(alt = VI(.))
#> Error in VI(.): object '.' not found

Created on 2022-03-31 by the reprex package (v2.0.1)

Session info
sessioninfo::session_info()
#> - Session info ---------------------------------------------------------------
#>  setting  value
#>  version  R version 4.1.3 (2022-03-10)
#>  os       Windows 10 x64 (build 19044)
#>  system   x86_64, mingw32
#>  ui       RTerm
#>  language (EN)
#>  collate  English_United States.1252
#>  ctype    English_United States.1252
#>  tz       America/Chicago
#>  date     2022-03-31
#>  pandoc   2.17.1.1 @ C:/PROGRA~3/CHOCOL~1/bin/ (via rmarkdown)
#> 
#> - Packages -------------------------------------------------------------------
#>  package      * version  date (UTC) lib source
#>  assertthat     0.2.1    2019-03-21 [1] CRAN (R 4.1.2)
#>  BrailleR     * 0.33.1   2022-03-31 [1] Github (ajrgodfrey/BrailleR@393fd70)
#>  brio           1.1.3    2021-11-30 [1] CRAN (R 4.1.2)
#>  cachem         1.0.6    2021-08-19 [1] CRAN (R 4.1.2)
#>  callr          3.7.0    2021-04-20 [1] CRAN (R 4.1.2)
#>  cli            3.2.0    2022-02-14 [1] CRAN (R 4.1.2)
#>  colorspace     2.0-3    2022-02-21 [1] CRAN (R 4.1.2)
#>  crayon         1.5.1    2022-03-26 [1] CRAN (R 4.1.3)
#>  DBI            1.1.2    2021-12-20 [1] CRAN (R 4.1.2)
#>  desc           1.4.1    2022-03-06 [1] CRAN (R 4.1.2)
#>  devtools       2.4.3    2021-11-30 [1] CRAN (R 4.1.2)
#>  digest         0.6.29   2021-12-01 [1] CRAN (R 4.1.2)
#>  dplyr          1.0.8    2022-02-08 [1] CRAN (R 4.1.2)
#>  ellipsis       0.3.2    2021-04-29 [1] CRAN (R 4.1.2)
#>  evaluate       0.15     2022-02-18 [1] CRAN (R 4.1.2)
#>  extrafont      0.17     2014-12-08 [1] CRAN (R 4.1.2)
#>  extrafontdb    1.0      2012-06-11 [1] CRAN (R 4.1.1)
#>  fansi          1.0.3    2022-03-24 [1] CRAN (R 4.1.3)
#>  fastmap        1.1.0    2021-01-25 [1] CRAN (R 4.1.2)
#>  fs             1.5.2    2021-12-08 [1] CRAN (R 4.1.2)
#>  generics       0.1.2    2022-01-31 [1] CRAN (R 4.1.2)
#>  ggplot2      * 3.3.5    2021-06-25 [1] CRAN (R 4.1.2)
#>  glue           1.6.2    2022-02-24 [1] CRAN (R 4.1.2)
#>  gridGraphics   0.5-1    2020-12-13 [1] CRAN (R 4.1.2)
#>  gridSVG        1.7-4    2022-03-01 [1] CRAN (R 4.1.2)
#>  gtable         0.3.0    2019-03-25 [1] CRAN (R 4.1.2)
#>  highr          0.9      2021-04-16 [1] CRAN (R 4.1.2)
#>  htmltools      0.5.2    2021-08-25 [1] CRAN (R 4.1.2)
#>  hunspell       3.0.1    2020-12-09 [1] CRAN (R 4.1.2)
#>  jsonlite       1.8.0    2022-02-22 [1] CRAN (R 4.1.2)
#>  knitr          1.38     2022-03-25 [1] CRAN (R 4.1.3)
#>  lifecycle      1.0.1    2021-09-24 [1] CRAN (R 4.1.2)
#>  magrittr       2.0.2    2022-01-26 [1] CRAN (R 4.1.2)
#>  memoise        2.0.1    2021-11-26 [1] CRAN (R 4.1.2)
#>  moments        0.14     2015-01-05 [1] CRAN (R 4.1.1)
#>  munsell        0.5.0    2018-06-12 [1] CRAN (R 4.1.2)
#>  pillar         1.7.0    2022-02-01 [1] CRAN (R 4.1.2)
#>  pkgbuild       1.3.1    2021-12-20 [1] CRAN (R 4.1.2)
#>  pkgconfig      2.0.3    2019-09-22 [1] CRAN (R 4.1.2)
#>  pkgload        1.2.4    2021-11-30 [1] CRAN (R 4.1.2)
#>  prettyunits    1.1.1    2020-01-24 [1] CRAN (R 4.1.2)
#>  processx       3.5.3    2022-03-25 [1] CRAN (R 4.1.3)
#>  ps             1.6.0    2021-02-28 [1] CRAN (R 4.1.2)
#>  purrr          0.3.4    2020-04-17 [1] CRAN (R 4.1.2)
#>  R.cache        0.15.0   2021-04-30 [1] CRAN (R 4.1.2)
#>  R.methodsS3    1.8.1    2020-08-26 [1] CRAN (R 4.1.1)
#>  R.oo           1.24.0   2020-08-26 [1] CRAN (R 4.1.1)
#>  R.utils        2.11.0   2021-09-26 [1] CRAN (R 4.1.2)
#>  R6             2.5.1    2021-08-19 [1] CRAN (R 4.1.2)
#>  rbibutils      2.2.7    2021-12-07 [1] CRAN (R 4.1.2)
#>  Rcpp           1.0.8.3  2022-03-17 [1] CRAN (R 4.1.3)
#>  Rdpack         2.3      2022-03-23 [1] CRAN (R 4.1.3)
#>  remotes        2.4.2    2021-11-30 [1] CRAN (R 4.1.2)
#>  reprex         2.0.1    2021-08-05 [1] CRAN (R 4.1.2)
#>  rlang          1.0.2    2022-03-04 [1] CRAN (R 4.1.2)
#>  rmarkdown      2.13     2022-03-10 [1] CRAN (R 4.1.3)
#>  roloc          0.1-1    2018-07-30 [1] CRAN (R 4.1.2)
#>  rolocISCCNBS   0.1      2018-08-02 [1] CRAN (R 4.1.2)
#>  rprojroot      2.0.2    2020-11-15 [1] CRAN (R 4.1.2)
#>  Rttf2pt1       1.3.10   2022-02-07 [1] CRAN (R 4.1.2)
#>  scales         1.1.1    2020-05-11 [1] CRAN (R 4.1.2)
#>  sessioninfo    1.2.2    2021-12-06 [1] CRAN (R 4.1.2)
#>  stringi        1.7.6    2021-11-29 [1] CRAN (R 4.1.2)
#>  stringr        1.4.0    2019-02-10 [1] CRAN (R 4.1.2)
#>  styler         1.7.0    2022-03-13 [1] CRAN (R 4.1.3)
#>  testthat       3.1.3    2022-03-29 [1] CRAN (R 4.1.3)
#>  tibble         3.1.6    2021-11-07 [1] CRAN (R 4.1.2)
#>  tidyselect     1.1.2    2022-02-21 [1] CRAN (R 4.1.2)
#>  usethis        2.1.5    2021-12-09 [1] CRAN (R 4.1.2)
#>  utf8           1.2.2    2021-07-24 [1] CRAN (R 4.1.2)
#>  vctrs          0.4.0    2022-03-30 [1] CRAN (R 4.1.3)
#>  whisker        0.4      2019-08-28 [1] CRAN (R 4.1.2)
#>  withr          2.5.0    2022-03-03 [1] CRAN (R 4.1.2)
#>  xfun           0.30     2022-03-02 [1] CRAN (R 4.1.2)
#>  XML            3.99-0.9 2022-02-24 [1] CRAN (R 4.1.2)
#>  xtable         1.8-4    2019-04-21 [1] CRAN (R 4.1.2)
#>  yaml           2.3.5    2022-02-21 [1] CRAN (R 4.1.2)
#> 
#>  [1] C:/Program Files/R/R-4.1.3/library
#> 
#> ------------------------------------------------------------------------------

@hadley
Copy link
Member

hadley commented Apr 1, 2022

@jooyoungseo you mean to have BrailleR generate the alt text?

@jooyoungseo
Copy link

@hadley, yeah, I can add the alt text as a post process like below; however, I was wondering if there would be any way I could achieve this in the middle of plotting using dot symbol like {dplyr} piping process (e.g., ... + labs(alt = BrailleR::VI(.)$text)). Currently, I have to save the g first and add the alt later.

library(BrailleR)
#> The BrailleR.View,  option is set to FALSE.
#> 
#> Attaching package: 'BrailleR'
#> The following objects are masked from 'package:graphics':
#> 
#>     boxplot, hist
#> The following object is masked from 'package:utils':
#> 
#>     history
#> The following objects are masked from 'package:base':
#> 
#>     grep, gsub
library(tidyverse)

g <- ggplot(mpg, aes(class)) + geom_bar()

g + labs(alt = VI(g)$text)

#> This is an untitled chart with no subtitle or caption.
#> It has x-axis 'class' with labels 2seater, compact, midsize, minivan, pickup, subcompact and suv.
#> It has y-axis 'count' with labels 0, 20, 40 and 60.
#> The chart is a bar chart with 7 vertical bars.
#> Bar 1 is centered horizontally at 2seater, and spans vertically from 0 to 5.
#> Bar 2 is centered horizontally at compact, and spans vertically from 0 to 47.
#> Bar 3 is centered horizontally at midsize, and spans vertically from 0 to 41.
#> Bar 4 is centered horizontally at minivan, and spans vertically from 0 to 11.
#> Bar 5 is centered horizontally at pickup, and spans vertically from 0 to 33.
#> Bar 6 is centered horizontally at subcompact, and spans vertically from 0 to 35.
#> Bar 7 is centered horizontally at suv, and spans vertically from 0 to 62.

Created on 2022-04-01 by the reprex package (v2.0.1)

Session info
sessioninfo::session_info()
#> - Session info ---------------------------------------------------------------
#>  setting  value
#>  version  R version 4.1.3 (2022-03-10)
#>  os       Windows 10 x64 (build 19044)
#>  system   x86_64, mingw32
#>  ui       RTerm
#>  language (EN)
#>  collate  English_United States.1252
#>  ctype    English_United States.1252
#>  tz       America/Chicago
#>  date     2022-04-01
#>  pandoc   2.17.1.1 @ C:/PROGRA~3/CHOCOL~1/bin/ (via rmarkdown)
#> 
#> - Packages -------------------------------------------------------------------
#>  package      * version  date (UTC) lib source
#>  assertthat     0.2.1    2019-03-21 [1] CRAN (R 4.1.2)
#>  backports      1.4.1    2021-12-13 [1] CRAN (R 4.1.2)
#>  BrailleR     * 0.33.1   2022-03-31 [1] Github (ajrgodfrey/BrailleR@393fd70)
#>  brio           1.1.3    2021-11-30 [1] CRAN (R 4.1.2)
#>  broom          0.7.12   2022-01-28 [1] CRAN (R 4.1.2)
#>  cachem         1.0.6    2021-08-19 [1] CRAN (R 4.1.2)
#>  callr          3.7.0    2021-04-20 [1] CRAN (R 4.1.2)
#>  cellranger     1.1.0    2016-07-27 [1] CRAN (R 4.1.2)
#>  cli            3.2.0    2022-02-14 [1] CRAN (R 4.1.2)
#>  colorspace     2.0-3    2022-02-21 [1] CRAN (R 4.1.2)
#>  crayon         1.5.1    2022-03-26 [1] CRAN (R 4.1.3)
#>  curl           4.3.2    2021-06-23 [1] CRAN (R 4.1.2)
#>  DBI            1.1.2    2021-12-20 [1] CRAN (R 4.1.2)
#>  dbplyr         2.1.1    2021-04-06 [1] CRAN (R 4.1.2)
#>  desc           1.4.1    2022-03-06 [1] CRAN (R 4.1.2)
#>  devtools       2.4.3    2021-11-30 [1] CRAN (R 4.1.2)
#>  digest         0.6.29   2021-12-01 [1] CRAN (R 4.1.2)
#>  dplyr        * 1.0.8    2022-02-08 [1] CRAN (R 4.1.2)
#>  ellipsis       0.3.2    2021-04-29 [1] CRAN (R 4.1.2)
#>  evaluate       0.15     2022-02-18 [1] CRAN (R 4.1.2)
#>  extrafont      0.17     2014-12-08 [1] CRAN (R 4.1.2)
#>  extrafontdb    1.0      2012-06-11 [1] CRAN (R 4.1.1)
#>  fansi          1.0.3    2022-03-24 [1] CRAN (R 4.1.3)
#>  farver         2.1.0    2021-02-28 [1] CRAN (R 4.1.2)
#>  fastmap        1.1.0    2021-01-25 [1] CRAN (R 4.1.2)
#>  forcats      * 0.5.1    2021-01-27 [1] CRAN (R 4.1.2)
#>  fs             1.5.2    2021-12-08 [1] CRAN (R 4.1.2)
#>  generics       0.1.2    2022-01-31 [1] CRAN (R 4.1.2)
#>  ggplot2      * 3.3.5    2021-06-25 [1] CRAN (R 4.1.2)
#>  glue           1.6.2    2022-02-24 [1] CRAN (R 4.1.2)
#>  gridGraphics   0.5-1    2020-12-13 [1] CRAN (R 4.1.2)
#>  gridSVG        1.7-4    2022-03-01 [1] CRAN (R 4.1.2)
#>  gtable         0.3.0    2019-03-25 [1] CRAN (R 4.1.2)
#>  haven          2.4.3    2021-08-04 [1] CRAN (R 4.1.2)
#>  highr          0.9      2021-04-16 [1] CRAN (R 4.1.2)
#>  hms            1.1.1    2021-09-26 [1] CRAN (R 4.1.2)
#>  htmltools      0.5.2    2021-08-25 [1] CRAN (R 4.1.2)
#>  httr           1.4.2    2020-07-20 [1] CRAN (R 4.1.2)
#>  hunspell       3.0.1    2020-12-09 [1] CRAN (R 4.1.2)
#>  jsonlite       1.8.0    2022-02-22 [1] CRAN (R 4.1.2)
#>  knitr          1.38     2022-03-25 [1] CRAN (R 4.1.3)
#>  labeling       0.4.2    2020-10-20 [1] CRAN (R 4.1.1)
#>  lifecycle      1.0.1    2021-09-24 [1] CRAN (R 4.1.2)
#>  lubridate      1.8.0    2021-10-07 [1] CRAN (R 4.1.2)
#>  magrittr       2.0.2    2022-01-26 [1] CRAN (R 4.1.2)
#>  memoise        2.0.1    2021-11-26 [1] CRAN (R 4.1.2)
#>  mime           0.12     2021-09-28 [1] CRAN (R 4.1.1)
#>  modelr         0.1.8    2020-05-19 [1] CRAN (R 4.1.2)
#>  moments        0.14     2015-01-05 [1] CRAN (R 4.1.1)
#>  munsell        0.5.0    2018-06-12 [1] CRAN (R 4.1.2)
#>  pillar         1.7.0    2022-02-01 [1] CRAN (R 4.1.2)
#>  pkgbuild       1.3.1    2021-12-20 [1] CRAN (R 4.1.2)
#>  pkgconfig      2.0.3    2019-09-22 [1] CRAN (R 4.1.2)
#>  pkgload        1.2.4    2021-11-30 [1] CRAN (R 4.1.2)
#>  prettyunits    1.1.1    2020-01-24 [1] CRAN (R 4.1.2)
#>  processx       3.5.3    2022-03-25 [1] CRAN (R 4.1.3)
#>  ps             1.6.0    2021-02-28 [1] CRAN (R 4.1.2)
#>  purrr        * 0.3.4    2020-04-17 [1] CRAN (R 4.1.2)
#>  R.cache        0.15.0   2021-04-30 [1] CRAN (R 4.1.2)
#>  R.methodsS3    1.8.1    2020-08-26 [1] CRAN (R 4.1.1)
#>  R.oo           1.24.0   2020-08-26 [1] CRAN (R 4.1.1)
#>  R.utils        2.11.0   2021-09-26 [1] CRAN (R 4.1.2)
#>  R6             2.5.1    2021-08-19 [1] CRAN (R 4.1.2)
#>  rbibutils      2.2.7    2021-12-07 [1] CRAN (R 4.1.2)
#>  Rcpp           1.0.8.3  2022-03-17 [1] CRAN (R 4.1.3)
#>  Rdpack         2.3      2022-03-23 [1] CRAN (R 4.1.3)
#>  readr        * 2.1.2    2022-01-30 [1] CRAN (R 4.1.2)
#>  readxl         1.4.0    2022-03-28 [1] CRAN (R 4.1.3)
#>  remotes        2.4.2    2021-11-30 [1] CRAN (R 4.1.2)
#>  reprex         2.0.1    2021-08-05 [1] CRAN (R 4.1.2)
#>  rlang          1.0.2    2022-03-04 [1] CRAN (R 4.1.2)
#>  rmarkdown      2.13     2022-03-10 [1] CRAN (R 4.1.3)
#>  roloc          0.1-1    2018-07-30 [1] CRAN (R 4.1.2)
#>  rolocISCCNBS   0.1      2018-08-02 [1] CRAN (R 4.1.2)
#>  rprojroot      2.0.2    2020-11-15 [1] CRAN (R 4.1.2)
#>  Rttf2pt1       1.3.10   2022-02-07 [1] CRAN (R 4.1.2)
#>  rvest          1.0.2    2021-10-16 [1] CRAN (R 4.1.2)
#>  scales         1.1.1    2020-05-11 [1] CRAN (R 4.1.2)
#>  sessioninfo    1.2.2    2021-12-06 [1] CRAN (R 4.1.2)
#>  stringi        1.7.6    2021-11-29 [1] CRAN (R 4.1.2)
#>  stringr      * 1.4.0    2019-02-10 [1] CRAN (R 4.1.2)
#>  styler         1.7.0    2022-03-13 [1] CRAN (R 4.1.3)
#>  testthat       3.1.3    2022-03-29 [1] CRAN (R 4.1.3)
#>  tibble       * 3.1.6    2021-11-07 [1] CRAN (R 4.1.2)
#>  tidyr        * 1.2.0    2022-02-01 [1] CRAN (R 4.1.2)
#>  tidyselect     1.1.2    2022-02-21 [1] CRAN (R 4.1.2)
#>  tidyverse    * 1.3.1    2021-04-15 [1] CRAN (R 4.1.2)
#>  tzdb           0.3.0    2022-03-28 [1] CRAN (R 4.1.3)
#>  usethis        2.1.5    2021-12-09 [1] CRAN (R 4.1.2)
#>  utf8           1.2.2    2021-07-24 [1] CRAN (R 4.1.2)
#>  vctrs          0.4.0    2022-03-30 [1] CRAN (R 4.1.3)
#>  whisker        0.4      2019-08-28 [1] CRAN (R 4.1.2)
#>  withr          2.5.0    2022-03-03 [1] CRAN (R 4.1.2)
#>  xfun           0.30     2022-03-02 [1] CRAN (R 4.1.2)
#>  XML            3.99-0.9 2022-02-24 [1] CRAN (R 4.1.2)
#>  xml2           1.3.3    2021-11-30 [1] CRAN (R 4.1.2)
#>  xtable         1.8-4    2019-04-21 [1] CRAN (R 4.1.2)
#>  yaml           2.3.5    2022-02-21 [1] CRAN (R 4.1.2)
#> 
#>  [1] C:/Program Files/R/R-4.1.3/library
#> 
#> ------------------------------------------------------------------------------

@hadley
Copy link
Member

hadley commented Apr 1, 2022

Would you mind filing an issue for this? We might be able to make the alt label take a function (but I'm not sure if we can figure out how to call it at the right time)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants