Mostra frequenze insieme con barplot in ggplot2
Domanda
Sto cercando di visualizzare le frequenze entro barplot ... bene, voglio che da qualche parte nel grafico: sotto le barre, all'interno di bar, al di sopra bar o nella zona leggenda. E mi ricordo (potrei sbagliarmi) che può essere fatto in ggplot2
. Questo è probabilmente un compito facile ... almeno sembra facile. Ecco il codice:
p <- ggplot(mtcars)
p + aes(factor(cyl)) + geom_bar()
C'è qualche possibilità che posso ottenere frequenze incorporato nel grafico?
Soluzione
geom_text
è tha analogico di text
dalla grafica di base:
p + geom_bar() + stat_bin(aes(label=..count..), vjust=0,
geom="text", position="identity")
Se si vuole regolare la y-posizione delle etichette, è possibile utilizzare l'estetica y=
entro stat_bin
:., Ad esempio, y=..count..+1
metterà l'etichetta di un'unità di sopra della barra
È possibile che questo funziona anche se si utilizza geom_text
e stat="bin"
all'interno.
Altri suggerimenti
Un modo difficile farlo. Sono sicuro che ci sono approcci migliori.
ggplot(mtcars,aes(factor(cyl))) +
geom_bar() +
geom_text(aes(y=sapply(cyl,function(x) 1+table(cyl)[names(table(cyl))==x]),
label=sapply(cyl,function(x) table(cyl)[names(table(cyl))==x])))
Quando si vuole aggiungere informazioni diverse le seguenti opere:
ggplot(mydata, aes(x=clusterSize, y=occurence)) +
geom_bar() + geom_text(aes(x=clusterSize, y=occurence, label = mydata$otherinfo))
In alternativa, ho trovato utile usare alcune delle funzioni di annotazione disponibili: ggplot2::annotate
, ggplot2::annotation_custom
o cowplot::draw_label
(che è un involucro di annotation_custom
).
ggplot2::annotate
è solo ricicla l'opzione di testo geom. Più vantaggioso per tracciare qualsiasi punto sulla tela sono le possibilità offerte dalla ggplot2::annotation_custom
o cowplot::draw_label
.
Esempi con ggplot2::annotate
library(ggplot2)
p <- ggplot(mtcars) + aes(factor(cyl)) + geom_bar()
# Get data from the graph
p_dt <- layer_data(p) # or ggplot_build(p)$data
p + annotate(geom = "text", label = p_dt$count, x = p_dt$x, y = 15)
O consentono di variare y
:
p + annotate(geom = "text", label = p_dt$count, x = p_dt$x, y = p_dt$y + 1)
Esempio con ggplot2::annotation_custom
Il ggplot2::annotate
ha dei limiti quando si cerca di tracciare in più luoghi "non convenzionali", come è stato chiesto in origine ( " da qualche parte nel grafico"). Tuttavia, ggplot2::annotation_custom
in combinazione con impostazione tagliando , permette l'annotazione ovunque sulla tela / foglio, come l'esempio seguente mostra:
p2 <- p + coord_cartesian(clip = "off")
for (i in 1:nrow(p_dt)){
p2 <- p2 + annotation_custom(grid::textGrob(p_dt$count[i]),
xmin = p_dt$x[i], xmax = p_dt$x[i], ymin = -1, ymax = -1)
}
p2
Esempio con cowplot::draw_label
cowplot::draw_label
è un involucro di ggplot2::annotation_custom
, ed è leggermente meno dettagliato (di conseguenza). Ha anche bisogno di tagliando per tracciare qualsiasi punto sulla tela.
library(cowplot)
#> Warning: package 'cowplot' was built under R version 3.5.2
#>
#> Attaching package: 'cowplot'
#> The following object is masked from 'package:ggplot2':
#>
#> ggsave
# Revert to default theme; see https://stackoverflow.com/a/41096936/5193830
theme_set(theme_grey())
p3 <- p + coord_cartesian(clip = "off")
for (i in 1:nrow(p_dt)){
p3 <- p3 + draw_label(label = p_dt$count[i], x = p_dt$x[i], y = -1.8)
}
p3
Si noti che, draw_label
può essere utilizzato anche in combinazione con cowplot::ggdraw
, passaggio a coordinate relative, che varia da 0 a 1 (rispetto all'intero tela, vedi esempi con help(draw_label)
). In tal caso coord_cartesian(clip = "off")
impostazione non è richiesta più come le cose sono presi cura da ggdraw
.
Creato il 2019/01/16 dal reprex pacchetto (v0.2.1)
Se non si è limitato a ggplot2, è possibile utilizzare? Testo dalla grafica di base o? Boxed.labels dal pacchetto plotrix.