
Alt text
În primul rând, dacă nu ați auzit sau nu ați folosit text alternativ înainte, este o scurtă descriere scrisă a unei imagini care explică contextul și scopul. Este folosit pentru a îmbunătăți accesibilitatea, permițând cititorilor de ecran să descrie imagini sau să ofere context dacă o imagine nu se încarcă. Pentru a scrie un text alternativ bun, consultați acest articol de Havard, dar câteva reguli de bază bune sunt:
- Păstrați-l concis și relevant pentru contextul de ce este utilizată imaginea.
- Cititorul de ecran va spune deja „Imagine de…”, așa că nu trebuie să includem acest lucru decât dacă stilul este important (desen, desen animat etc.).
Alt text în aplicații și tablouri de bord
Nu trebuie să enumerez aspectele pozitive ale aplicațiilor și tablourilor de bord interactive, însă una dintre principalele este interactivitatea și permite utilizatorilor să exploreze datele în felul lor. Acesta este un lucru grozav de cele mai multe ori, dar o capcană care este adesea trecută cu vederea este interactivitatea care poate umbri accesibilitatea. Fie că este un widget de lux care este greu (sau imposibil) de utilizat prin tastatură sau vizualizări interactive fără text alternativ semnificativ.
În această postare, vom analiza o nouă abordare a generării de text alternativ dinamic pentru diagramele ggplot2 folosind {ellmer}, noul pachet R de la Posit pentru interogarea modelelor de limbaj mari (LLM) din R. Dacă utilizați Shiny pentru Python, atunci chatlas va fi de interes pentru dvs.
De ce textul alternativ dinamic are nevoie de îngrijire
Generarea automată a textului alternativ este atrăgătoare, dar aplicațiile Shiny de producție au constrângeri:
- Ploturile pot fi redate frecvent
- Apelurile API pot eșua sau pot fi limitate la rata
- Accesibilitatea ar trebui să se degradeze cu grație, nu să rupă aplicația
- O implementare bună ar trebui să fie consecventă, tolerantă la erori și ieftină de rulat.
Folosind {ellmer} într-o aplicație Shiny
Primul pas este configurarea unei conexiuni la LLM aleasă de dvs., folosesc Google Gemini Flash-2.5 deoarece există un nivel gratuit generos, dar sunt disponibili și alți modele și furnizori. Într-o aplicație Shiny, acest lucru se poate face în afara contextului reactiv:
library(ellmer) gemini <- chat_google_gemini() ## Using model = "gemini-2.5-flash".
Notă: Ar trebui să aveți o cheie Google Gemini salvată în fișierul dvs. .Renviron ca
GEMINI_API_KEYîn acest fel funcția {ellmer} o va putea găsi. Mai multe informații despre generarea unei chei API Gemini pot fi găsite în documentele Gemini.
Apoi avem funcția de generare a textului alternativ:
library(ggplot2)
generate_alt_text = function(ggplot_obj, model) {
temp <- tempfile(fileext = ".png")
on.exit(unlink(temp))
ggsave(
temp,
ggplot_obj,
width = 6,
height = 4,
dpi = 150
)
tryCatch(
model$chat(
"
Generate concise alt text for this plot image.
Describe the chart type, variables shown,
key patterns or trends, and value ranges where visible.
",
content_image_file(temp)
),
error = function(e) {
"Data visualisation showing trends and comparisons."
}
)
}
Funcția are câteva caracteristici care vor menține ieșirea mai fiabilă:
-
Dimensiunea și rezoluția constantă a imaginii – ajută la fiabilitatea modelului atunci când citiți axe și etichete.
-
Curățarea explicită a fișierelor temporare – nu este nevoie să salvăm imaginile odată ce textul este generat.
-
Gestionarea erorilor – dacă apelul modelului eșuează, aplicația returnează în continuare text alternativ utilizabil. Am păstrat textul nostru alternativ simplu în scopuri demonstrative, dar puteți încerca să adăugați mai multe detalii.
-
Inițializarea modelului extern – creat o singură dată și transmis, mai degrabă decât recreat la fiecare actualizare reactivă.
Exemple
În această secțiune, vom crea doar câteva exemple de diagrame, apoi vom vedea ce generează LLM.
simple_plot = ggplot(iris) + aes(Sepal.Width, Sepal.Length) + geom_point() simple_plot


simple_plot_alt = generate_alt_text(simple_plot, gemini)
paste("Alt text generated by AI: ", simple_plot_alt)
Text alternativ generat de AI:
Diagramă de dispersie care arată Sepal.Lungimea pe axa y (variind de la aproximativ 4,5 la 8,0) față de Sepal.Width pe axa x (variind de la aproximativ 2,0 la 4,5). Punctele de date par să formeze două grupuri distincte: unul cu Sepal.Width între 2,0 și 3,0 și Sepal.Length între 5,0 și 8,0 și altul cu Sepal.Width între 3,0 și 4,5 și Sepal.Length între 4,5 și 6,5.
plot = ggplot(iris) + aes(Sepal.Width, Sepal.Length, colour = Species) + geom_point() plot


plot_alt =
generate_alt_text(plot, gemini)
paste("Alt text generated by AI: ", plot_alt)
Text alternativ generat de AI:
Diagramă de dispersie care arată Sepal.Lungimea pe axa y (interval 4,5-8,0) versus Sepal.Width pe axa x (interval 2,0-4,5), cu puncte colorate după Specie. Punctele roșii, etichetate „setosa”, formează un grup distinct cu Sepal.Lățime mai mare (3,0-4,5) și Sepal.Lungime inferioară (4,5-5,8). Punctele albastre, „virginica”, tind să aibă Sepal.Lungime mai mare (5,5-8,0) și Sepal.Lățime moderată (2,5-3,8). Punctele verzi, „versicolor”, sunt între ele, cu Sepal.Lungime moderată (5,0-7,0) și Sepal.Lățime (2,0-3,5), suprapuse cu virginica.
complicated_plot = ggplot(iris) + aes(Sepal.Width, Sepal.Length, colour = Species) + geom_point() + geom_smooth(method = "lm") complicated_plot


complicated_plot_alt =
generate_alt_text(complicated_plot, gemini)
paste("Alt text generated by AI: ", complicated_plot_alt)
Text alternativ generat de AI:
Diagrama de dispersie care arată Sepal.Lungimea pe axa y (interval 4,0-8,0) versus Sepal.Lățime pe axa x (interval 2,0-4,5). Punctele și liniile de regresie liniară sunt colorate de speciile de iris. Puncte roșii, „setosa”, cluster cu Sepal.Lungime inferioară (4,0-5,8) și Sepal.Lațime mai mare (2,8-4,4). Punctele verzi, „versicolor”, și punctele albastre, „virginica”, se suprapun în mare măsură, prezentând Sepal.Lungime mai mare (5,0-8,0) și Sepal.Width moderată (2,0-3,8), cu „virginica” având în general cele mai lungi sepale. Toate cele trei specii prezintă o corelație liniară pozitivă, indicată de liniile lor de regresie respective și intervalele de încredere umbrite, unde creșterea lățimii sepalului corespunde creșterii lungimii sepalului.
După cum putem vedea, textul alternativ poate fi foarte bun și informativ atunci când utilizați LLM-uri. O alternativă pe care vreau să o subliniez este de fapt includerea unui rezumat al datelor din spatele complotului. În acest fel, utilizatorii de cititoare de ecran pot obține în continuare informații din intriga.
Utilizarea textului alternativ dinamic în Shiny
Odată generat, textul alternativ poate fi furnizat direct în interfața de utilizare:
- Prin intermediul
altargument deplotOutput() - Sau injectat în HTML personalizat pentru aspecte mai complexe
Deoarece textul este generat din graficul randat, acesta rămâne sincronizat cu intrările și filtrele utilizatorului.
Alte considerații
Unele aplicații pot fi mai complicate și/sau pot avea un număr mare de utilizatori. Aceste tipuri de aplicații vor avea nevoie de mai multă atenție pentru a include funcții precum aceasta:
- Memorarea în cache a textului alternativ pentru diagrame neschimbate pentru a reduce utilizarea API
- Mărire promptă cu nume de variabile sau unități cunoscute
- Anulări manuale pentru elemente vizuale critice
Concluzie
Textul alternativ generat de AI funcționează cel mai bine ca instrument de sprijin, nu ca înlocuitor pentru revizuirea accesibilității. De asemenea, mi s-a părut util să informez utilizatorii că textul alternativ este generat de inteligență artificială, astfel încât să știe să-l ia cu un praf de sare.
Textul alternativ dinamic este o caracteristică mică cu un impact mare asupra includerii. Combinând reactivitatea lui Shiny cu randarea consecventă, gestionarea erorilor și LLM-uri moderne, putem face aplicațiile de date interactive mai accesibile în mod implicit, fără a crește sarcina dezvoltatorului.
Pentru actualizări și revizuiri ale acestui articol, consultați postarea inițială
