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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top