Maciej B.

Maciej B. Doktorant

Temat: Etykiety na wykresach słupkowych w ggplot2

Hej,

mam problem z nałożeniem etykiet informujących o procentach na wykresy słupkowe, które są zgrupowane z wykorzystaniem facet_wrap z ggplot2 .

Przykładowy zbiór danych do ściągnięcia TUTAJ

Mój kod:

library(ggplot2)
library(scales)
library(RColorBrewer)
ggplot(example,aes(GroupingVar,fill=VarOfInterest)) + geom_bar(position='fill') + scale_fill_manual(values = (brewer.pal(5, "Greens"))) +
facet_wrap(~FacetVar,ncol=1) + coord_flip()+ scale_y_continuous(labels=percent) + ylab('Procent odpowiedzi')


Póki co uzyskuję:
[obrazek]

Coś nie chce pokazywać obrazka...

Link do obrazka

Chciałbym uzyskać (dodałem tylko do pierwszych dwóch słupków procenty, oczywiście mają być na wszystkich):

[obrazek]

Coś nie chce pokazywać obrazka...

Link do obrazka.

Czy ktoś z Was wie jak coś takiego osiągnąć?Maciej B. edytował(a) ten post dnia 01.10.12 o godzinie 08:19

Temat: Etykiety na wykresach słupkowych w ggplot2

W ten sposób jak robisz ten wykres - nie jestem pewien.

Ja używam geom_text:
+ geom_text(data=..., aes(x = xtext, y = ytext, label = paste(value,"%", sep = "")), ...)

gdzie value to zmienna z wartościami prezentowanymi na wykresie (tu już sformatowana) a xtext i ytext to pozycje etykiet.


Obrazek


Tyle, że to jest wykres mozaikowy (i geom_rect), więc obie osie mam ilościowe. Nie jestem pewien, czy dla osi dyskretnej ggplot2 jakoś dziwnie nie poprzesuwa etykiet. I czy wrap_facet czegoś nie namiesza. Tak czy inaczej: ja bym kombinował z geom_text.
Maciej B.

Maciej B. Doktorant

Temat: Etykiety na wykresach słupkowych w ggplot2

Udało mi się rozwiązać ten problem, trochę na około ale osiągnąłem to co chciałem. :)

W kolejnym poście opiszę co zrobiłem, tym czasem dostałem bardzo fajną odpowiedź na grupie ggplot2 @ google , której kod zamieszczam. Autorem jest Brandon Hurr. Kod zmodyfikowałem lekko abym mógł nadać ładne etykiety dla wartości procentowych.


require(ggplot2)
require(scales)
require(RColorBrewer)
require(plyr)
require(reshape2)

m.ex<-melt(ddply(example, .(GroupingVar, FacetVar), function(x) table(x$VarOfInterest)))
m.ex2<-ddply(m.ex, .(GroupingVar,FacetVar), transform, pct=value/sum(value))
m.ex2<-ddply(m.ex2, .(GroupingVar,FacetVar), transform, half=pct/2)
m.ex2<-ddply(m.ex2, .(GroupingVar,FacetVar), transform, cum=cumsum(pct))
m.ex2<-ddply(m.ex2, .(GroupingVar,FacetVar), transform, position=(cum-half))

ggplot() + geom_bar(data=example,aes(x=GroupingVar, fill=VarOfInterest), position='fill') +
scale_fill_manual(values = (brewer.pal(5, "Greens"))) +
geom_text(data=m.ex2, aes(y=position, x=GroupingVar, label=paste(sprintf("%.01f",pct*100), "%", sep='')),size=3)+
facet_wrap(~FacetVar,ncol=1) +
coord_flip()+
scale_y_continuous(labels=percent) + ylab('Percentage')



Rzeczywiście trzeba kombinować z geom_text() jednak najwięcej roboty jest wcześniej, przygotowując zbiór danych. Zbiór musi być zagregowany, dopiero wtedy możemy nanieść etykiety (jak również wartości informujące o wielkości próby czy średniej).Maciej B. edytował(a) ten post dnia 01.10.12 o godzinie 21:37



Wyślij zaproszenie do