2011-06-23 11 views
35

Chciałbym mieć kilka etykiet ułożonych na szczycie wykresu geom_bar. Oto przykład:Jak umieścić etykiety nad geom_bar w R z ggplot2

df <- data.frame(x=factor(c(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE))) 
ggplot(df) + geom_bar(aes(x,fill=x)) + opts(axis.text.x=theme_blank(),axis.ticks=theme_blank(),axis.title.x=theme_blank(),legend.title=theme_blank(),axis.title.y=theme_blank()) 

Teraz

stół (df $ x)

FALSE TRUE 
    3  5 

Chciałbym mieć 3 i 5 na szczycie z dwóch pasków. Nawet lepiej, gdybym mógł mieć również wartości procentowe. Na przykład. 3 (37.5%) i 5 (62.5%). Podobnie jak:

Czy to możliwe? Jeśli tak to jak?

+2

Dodawanie liczb lub tekstu na szczytach słupków zniekształca sposób, w jaki oko widzi porównanie na wysokości. Zobacz [this discusssion] (http://tolstoy.newcastle.edu.au/R/e2/help/07/08/22858.html) na R-help. –

Odpowiedz

28

Tak jak w przypadku wielu zadań w ggplot, ogólną strategią jest umieszczenie tego, co chcesz dodać do wykresu, w ramce danych w taki sposób, aby zmienne były zgodne ze zmiennymi i estetyką na wykresie. Tak na przykład, można utworzyć nową ramkę danych takiego:

dfTab <- as.data.frame(table(df)) 
colnames(dfTab)[1] <- "x" 
dfTab$lab <- as.character(100 * dfTab$Freq/sum(dfTab$Freq)) 

tak, że zmienna x dopasowuje odpowiednią zmienną w df, i tak dalej. Wtedy po prostu to, że za pomocą geom_text:

ggplot(df) + geom_bar(aes(x,fill=x)) + 
    geom_text(data=dfTab,aes(x=x,y=Freq,label=lab),vjust=0) + 
    opts(axis.text.x=theme_blank(),axis.ticks=theme_blank(), 
     axis.title.x=theme_blank(),legend.title=theme_blank(), 
     axis.title.y=theme_blank()) 

Ten przykład wykreślić tylko procenty, ale można paste razem liczy, jak również poprzez coś takiego:

dfTab$lab <- paste(dfTab$Freq,paste("(",dfTab$lab,"%)",sep=""),sep=" ") 

Należy pamiętać, że w obecnej wersji ggplot2, opts jest przestarzałe, więc użyjemy teraz theme i element_blank.

36

Aby wydrukować tekst na ggplot, należy użyć geom_text. Ale uważam, że warto podsumować pierwsze dane używając ddply

dfl <- ddply(df, .(x), summarize, y=length(x)) 
str(dfl) 

Ponieważ dane jest wstępnie podsumować, trzeba pamiętać o zmianie dodać stat="identity" parametrem geom_bar:

ggplot(dfl, aes(x, y=y, fill=x)) + geom_bar(stat="identity") + 
    geom_text(aes(label=y), vjust=0) + 
    opts(axis.text.x=theme_blank(), 
     axis.ticks=theme_blank(), 
     axis.title.x=theme_blank(), 
     legend.title=theme_blank(), 
     axis.title.y=theme_blank() 
) 

enter image description here

Powiązane problemy