Visualizzazione dei valori dei dati sul grafico a barre in pila in ggplot2


112

Vorrei mostrare i valori dei dati sul grafico a barre in pila in ggplot2. Ecco il mio tentativo di codice

Year      <- c(rep(c("2006-07", "2007-08", "2008-09", "2009-10"), each = 4))
Category  <- c(rep(c("A", "B", "C", "D"), times = 4))
Frequency <- c(168, 259, 226, 340, 216, 431, 319, 368, 423, 645, 234, 685, 166, 467, 274, 251)
Data      <- data.frame(Year, Category, Frequency)
library(ggplot2)
p <- qplot(Year, Frequency, data = Data, geom = "bar", fill = Category,     theme_set(theme_bw()))
p + geom_text(aes(label = Frequency), size = 3, hjust = 0.5, vjust = 3, position =     "stack") 

inserisci qui la descrizione dell'immagine

Vorrei mostrare questi valori di dati al centro di ogni porzione. Qualsiasi aiuto in questo senso sarà molto apprezzato. Grazie



Non è proprio il luogo per un dibattito, ma mi chiedo se sia possibile essere eccessivamente prescrittivi su questo, in particolare per il pubblico più generale. Questo è un bell'esempio : i numeri indicano percentuali che possono essere ricordate, il che elimina la necessità di una scala che i lettori meno alfabetizzati potrebbero trovare meno accessibile?
geoteoria

Risposte:


193

Le ggplot 2.2.0etichette possono essere facilmente impilate utilizzando position = position_stack(vjust = 0.5)in geom_text.

ggplot(Data, aes(x = Year, y = Frequency, fill = Category, label = Frequency)) +
  geom_bar(stat = "identity") +
  geom_text(size = 3, position = position_stack(vjust = 0.5))

inserisci qui la descrizione dell'immagine

Notare inoltre che " position_stack()e position_fill()ora impilare i valori nell'ordine inverso del raggruppamento, il che fa sì che l'ordine di impilamento predefinito corrisponda alla legenda".


Risposta valida per versioni precedenti di ggplot:

Ecco un approccio, che calcola i punti medi delle barre.

library(ggplot2)
library(plyr)

# calculate midpoints of bars (simplified using comment by @DWin)
Data <- ddply(Data, .(Year), 
   transform, pos = cumsum(Frequency) - (0.5 * Frequency)
)

# library(dplyr) ## If using dplyr... 
# Data <- group_by(Data,Year) %>%
#    mutate(pos = cumsum(Frequency) - (0.5 * Frequency))

# plot bars and add text
p <- ggplot(Data, aes(x = Year, y = Frequency)) +
     geom_bar(aes(fill = Category), stat="identity") +
     geom_text(aes(label = Frequency, y = pos), size = 3)

Grafico risultante


Grazie per questa risposta. L'ho usato per fare lo stesso usando data.tableinvece di plyr, quindi qualcosa del genere:Data.dt[,list(Category, Frequency, pos=cumsum(Frequency)-0.5*Frequency), by=Year]
atomicules

C'è comunque da aggiungere anche il totale delle frequenze?
Pablo Olmos de Aguilera C.

26

Come ha detto Hadley, ci sono modi più efficaci per comunicare il tuo messaggio rispetto alle etichette nei grafici a barre in pila. In effetti, i grafici in pila non sono molto efficaci in quanto le barre (ciascuna categoria) non condividono un asse, quindi il confronto è difficile.

È quasi sempre meglio utilizzare due grafici in questi casi, condividendo un asse comune. Nel tuo esempio presumo che tu voglia mostrare il totale complessivo e quindi le proporzioni che ciascuna categoria ha contribuito in un dato anno.

library(grid)
library(gridExtra)
library(plyr)

# create a new column with proportions
prop <- function(x) x/sum(x)
Data <- ddply(Data,"Year",transform,Share=prop(Frequency))

# create the component graphics
totals <- ggplot(Data,aes(Year,Frequency)) + geom_bar(fill="darkseagreen",stat="identity") + 
  xlab("") + labs(title = "Frequency totals in given Year")
proportion <- ggplot(Data, aes(x=Year,y=Share, group=Category, colour=Category)) 
+ geom_line() + scale_y_continuous(label=percent_format())+ theme(legend.position = "bottom") + 
  labs(title = "Proportion of total Frequency accounted by each Category in given Year")

# bring them together
grid.arrange(totals,proportion)

Questo ti darà un display a 2 pannelli come questo:

Grafica a 2 pannelli impilati verticalmente

Se vuoi aggiungere valori di frequenza, una tabella è il formato migliore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.