Migliorare un grafico utilizzando Inkscape

Inkscape è un software open source che permette di realizzare immagini utilizzando la grafica vettoriale. Capire cosa sia esattamente la grafica vettoriale per me non è stato semplicissimo. Ero infatti abituato alla più comune grafica raster, dove le immagini sono descritte da una matrice bidimensionale costituita da pixel. In grafica vettoriale, invece, un’immagine non è definita da pixel ma dall’intersecarsi di forme geometriche, principalmente linee, punti, curve e poligoni. Attraverso un programma di grafica vettoriale non si disegna colorando dei pixel ma creando delle figure geometriche: ogni oggetto che viene creato (che sia una linea, una curva, un cerchio, ecc.) è un’entità a sé stante ed è la combinazione e la sovrapposizione di questi singoli oggetti a creare l’immagine.

Inkscape logo

La grafica vettoriale è quindi una tecnologia che permette di creare un’immagine utilizzando forme geometriche, ma non prescinde completamente dalla grafica raster. Difatti, perché l’immagine sia fruibile come tale, sarà comunque necessario convertirla in una matrice di pixel perché diventi a tutti gli effetti “immagine”, trasformandola quindi in un file png, gif, tiff, jpg, ecc.

Ma veniamo a noi. Cosa c’entra tutto questo con R? C’entra eccome… infatti, talvolta mi capita di dover realizzare dei grafici abbastanza complicati, che includono testo, frecce, legende e altre diavolerie. Sono tutti elementi che possono essere sì creati utilizzando lo stesso R, ma qualche volta farlo scrivendo righe di codice può risultare così complesso da farmi passare la voglia. In questi casi, entra in gioco Inkscape.

Quando realizzare un grafico a suon di codice diventa davvero troppo faticoso, io scelgo una strada diversa: creo con R l’immagine di base, la salvo in formato SVG, che è il formato utilizzato da Inkscape e quindi la apro con questo software e da lì continuo a lavorare. Inkscape è molto semplice da usare (almeno per quello che serve a me) e con pochi click del mouse spesso riesco a ottenere dei buoni risultati senza perdere anni di vita nello scrivere righe di codice.

Intanto, se ancora non l’avete fatto, vi consiglio di scaricare Inkscape e di provare a giocarci per rendervi conto di come funziona.

Recentemente mi sono trovato a dover lavorare in R + Inkscape. Dovevo riprodurre (e poi modificare) un grafico relativo alla diffusione del gioco d’azzardo patologico nei giovani. Il punto di partenza era un’inchiesta pubblicata su Wired, dove il numero di sale giochi che ospitano slot machine è stato messo in relazione con la prevalenza di problemi legati al gioco d’azzardo nei giovani.

Per ogni regione italiana, i dati Wired riportano il numero di sale giochi che ospitano slot machine (dati 2012) e la prevalenza di giovani studenti con problemi legati al gioco. Di seguito i dati.

Regione <- c("Abruzzo","Basilicata","Calabria","Campania","Emilia-Romagna",
    "Friuli-Venezia Giulia","Lazio","Liguria","Lombardia","Marche","Molise",
    "Piemonte","Puglia","Sardegna","Sicilia","Toscana","Trentino-AltoAdige",
    "Umbria","Valle D'aosta","Veneto")

saleGiochi <- c(2.07,1.75,2.88,2.41,0.83,1.4,2.36,0.68,0.9,1.3,2.24,0.98,2.18,
    1.68,2.43,0.77,1.02,0.99,1.18,1.05)

prevStud <- c(2.4,4.3,4.7,4,2.7,NA,3.6,2.5,1.9,2.6,3.3,2,3.8,3.6,3.2,1.9,2.9,
    3.6,NA,2.5)
&#91;/code&#93;

<p style="text-align: justify;">Il grafico da costruire era un banalissimo scatter-plot con il numero di sale giochi ogni diecimila abitanti (<b>saleGiochi</b>) sull'asse orizzontale e la prevalenza di giovani studenti con problemi legati al gioco (<b>prevStud</b>) sull'asse verticale; un'etichetta (<b>Regione</b>) indica a quale regione ogni dato si riferisce. Fabbricare questo grafico è, per la verità, molto semplice con R. Prima si costruisce lo scatter-plot, definendo alcuni parametri grafici per renderlo un po' elegante:</p>

[code language="R"]
plot(saleGiochi, prevStud,
    pch=21, cex=1.6, bg="blue", col="black", xlim=c(0.5,3.5), ylim=c(1.5,5),
    xlab="Sale giochi con slot ogni 10.000 abitanti",
    ylab="Prevalenza studenti con problemi di gioco"
)

quindi, usando la funzione text, si aggiunge il nome della regione accanto a ogni pallino:

text(x = saleGiochi+0.2, y = prevStud, labels = Regione)

Alla funzione text bisogna passare le coordinate x e y sulle quali posizionare le etichette (labels); io ho aggiunto uno scostamento di 0.2 unità alla coordinata x per cercare di non sovrapporre completamente le etichette ai pallini. Quello che vedete di seguito è il risultato.

Scatterplot R

Pessimo. C’è una gran confusione: in molti casi, i nomi delle regioni si sovrappongono e non si capisce granché.

Piuttosto che stare a smanettare con la funzione text per cercare di posizionare decentemente ogni singola etichetta, ho scelto una soluzione rapida e indolore: salvare l’immagine in formato SVG e continuare a lavorare da Inkscape.

Per salvare un’immagine in SVG si può utilizzare la libreria Cairo, della quale abbiamo già parlato in questo post che vi consiglio di leggere se non ne conoscete il funzionamento. Il comando da usare è CairoSVG:

library(Cairo)
CairoSVG("sale_giochi_con_slot.svg")
plot(saleGiochi, prevStud,
    pch=21, cex=1.6, bg="blue", col="black", xlim=c(0.5,3.5), ylim=c(1.5,5),
    xlab="Sale giochi con slot ogni 10.000 abitanti",
    ylab="Prevalenza studenti con problemi di gioco"
)
text(x = saleGiochi+0.2, y = prevStud, labels = Regione)
dev.off()

Così, nella cartella di lavoro, troveremo un nuovo file (sale_giochi_con_slot.svg) che è la nostra immagine pronta per essere modificata con Inkscape. Aprendo il file con Inkscape avremo davanti questa situazione:

Inkscape screenshot

Ogni oggetto contenuto all’interno dell’immagine è un’entità a sé stante che può essere modificata indipendentemente dalle altre. Possiamo per esempio sia modificare singolarmente i vari pallini, cambiandone colore, dimensione, posizione, ecc., sia modificare ogni singola etichetta, spostandola per fare in modo da non creare sovrapposizioni.

Quando l’immagine viene aperta, tutti gli oggetti sono raggruppati. Come primo passaggio bisognerà quindi scorporare l’immagine. Per farlo bisogna selezionate tutto e dal menù Oggetto scegliere Dividi; se necessario, questa operazione va ripetuta più volte perché è possibile che gli oggetti siano stati raggruppati su livelli gerarchici. Nel nostro caso, infatti, prima i pallini sono stati raggruppati con le etichette e poi il risultato è stato a sua volta raggruppato in un unico oggetto insieme agli assi del grafico.

Una volta divisi gli oggetti, possiamo trascinare le etichette dove meglio crediamo facendo in modo che non si sovrappongano più. A questo punto, la nostra immagine sarà pronta… ma, perché sia effettivamente fruibile come immagine, dovremo convertirla in un formato adeguato. In poche parole, l’immagine non può rimanere in formato vettoriale ma dovrà diventare una matrice di pixel. Per eseguire la conversione, dal menù File bisogna scegliere Esporta bitmap… e impostare il nome dell’immagine, la risoluzione e cliccare su Esporta per ottenere un’immagine PNG.

Inkscape - esporta bitmap

Attenzione a cosa esportiamo. Inkscape ci dà quattro possibilità: tutta la pagina, solo il disegno, solo l’area selezionata oppure una porzione d’immagine personalizzata. In questo caso io ho scelto “Pagina” e ho ottenuto il file PNG riportato di seguito.

Scatterplot elaborato con Inkscape

Direi che un bel passo avanti è stato fatto, non credete?

Per la cronaca, a suo tempo io non mi ero limitato a spostare le etichette ma avevo lavorato pesantemente sull’aspetto del grafico… il risultato che vedete qui sotto è sempre merito di Inkscape!

Sale giochi con slot e giovani con problemi legati all'azzardo

Print Friendly, PDF & Email
Print Friendly, PDF & Email

Lascia un commento