Questo è in realtà due domande in una (non sono sicuro se va contro le regole SO, ma comunque).ggplot2: geom_text ridimensionare con la trama e forzare/inserire il testo all'interno di geom_bar
La prima domanda è: come posso forzare un geom_text
per adattarlo a un geom_bar
? (dinamicamente secondo i valori tracciati)
Guardandosi intorno, le soluzioni che ho trovato stavano cambiando le dimensioni dell'etichetta. Certamente funziona, ma non per tutti i casi. È possibile modificare le dimensioni per un tracciato specifico per rendere il testo adatto alla barra, ma quando i dati cambiano, potrebbe essere necessario modificare manualmente la dimensione del testo. Il mio problema di vita reale è che ho bisogno di generare la stessa trama per i dati che cambiano costantemente (ogni giorno), quindi non posso davvero regolare manualmente la dimensione per ogni trama.
Ho provato a impostare la dimensione dell'etichetta in funzione dei dati. Funziona un po ', non perfettamente, ma funziona per molti casi.
Ma ecco un altro problema, anche quando l'etichetta si adatta all'interno della barra, il ridimensionamento della trama incasina tutto. Guardando in esso, ho trovato anche nelle ggplot documentation che
etichette hanno altezza e larghezza, ma sono unità fisiche, non di dati unità. La quantità di spazio che occupano su quel grafico non è costante nelle unità di dati : quando ridimensioni un grafico, le etichette mantengono le stesse dimensioni, ma la dimensione degli assi degli assi cambia.
Quale mi porta alla mia seconda domanda: è possibile modificare questo comportamento predefinito e lasciare/rendere le etichette ridimensionate con la trama?
E vorrei anche perfezionare la mia prima domanda. È possibile forzare un geom_text
per adattarsi a un geom_bar
, impostando dinamicamente la dimensione del testo utilizzando una relazione intelligente tra unità fisiche e unità di dati?
Quindi, a seguire le buone pratiche, ecco il mio esempio riproducibile:
set.seed(1234567)
data_gd <- data.frame(x = letters[1:5],
y = runif(5, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2))
Questo codice produce questa trama:
Se ho semplicemente ridimensionare la trama, "labels stay the same size, but the size of the axes changes" rendendo in tal modo le etichette si adattano alle barre (ora forse le etichette sono anche troppo piccole).
Quindi, questa è la mia seconda domanda. Sarebbe bello che anche le etichette si ridimensionassero e mantenessero la proporzione rispetto alle barre. Qualche idea su come realizzare questo o se è possibile a tutti?
Ok, ma tornando a come montare le etichette all'interno delle barre, la soluzione più semplice è quella di impostare la dimensione delle etichette.
Anche in questo caso, questo funziona come mostrato di seguito, ma non è mantenibile/né robusto alle modifiche nei dati.
Ad esempio, lo stesso codice per generare la trama con rese diverse di dati risultati catastrofici.
data_gd <- data.frame(x = letters[1:30],
y = runif(30, 100, 99999))
ggplot(data = data_gd,
mapping = aes(x = x, y = y, fill = x)) +
geom_bar(stat = "identity") +
geom_text(mapping = aes(label = y, y = y/2), size = 3)
E posso andare avanti con gli esempi, impostando le dimensioni delle etichette in funzione del numero di categorie su ascisse e così via. Ma hai capito il punto, e forse uno di voi, gli esperti di ggplot2
, può darmi delle idee.
impressionante !!!, ..., ancora cercando di capire come funziona perché conosco solo le basi di 'ggplot2', ma il codice funziona senza problemi e affronta entrambi i problemi: si adatta perfettamente al testo all'interno delle barre e al testo ridimensionare insieme alla trama. Davvero non pensavo fosse possibile. Grazie molto – elikesprogramming