2014-07-08 11 views
7

Wykreślam skumulowany wykres słupkowy i używam geom_text do wstawiania wartości każdego stosu. Trudność, którą napotykam, polega na tym, że niektóre stosy są bardzo małe/wąskie, tak że tekst dwóch stosów nakłada się na siebie i dlatego jest mało czytelny. Chciałbym dostosować pozycjonowanie tekstu w taki sposób, aby na przykład pozycja tekstu zmieniała się na przemian dla każdego stosu, tak aby nie było nakładania się (lub jakiejkolwiek innej metody, która spowoduje, że tekst będzie czytelny).Alternatywna pozycja geom_text z hjustem

Oto przykład tego, co mam aktualnie robi (a dput z mydf przedstawiono poniżej):

library(ggplot2) 

ggplot(mydf, aes(x=variable, y = value, fill = Category)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label = value, y = pos-(value/2)), size = 3) 

Co próbowałem tak daleko jest:

Korzystanie position = position_dodge(width = 0.5) i position = position_jitter(h =0.5, w = 0.5) ale żaden spowodowało co próbowałem zrobić.

Moją pierwszą myślą było określenie hjust = c(1,-1) nadzieję, że będzie recyklingowi i teksty będą naprzemiennie hjust == 1 i hjust == -1 ale skutkuje komunikatem o błędzie:

Error: Incompatible lengths for set aesthetics: size, hjust 

Próbowałem też definiowanie size = c(3,3,3,3,3,3,3,3,3), hjust = c(1,-1,1,-1,1,-1,1,-1,1) ale wynika to w ten sam komunikat o błędzie.

Byłbym wdzięczny za porady, jak to osiągnąć we właściwy sposób (i jestem otwarty również na inne sugestie).

Nie mogłem dowiedzieć się, dlaczego dput nie działa (również dla mnie to nie), tak oto dane w formacie czytelnym:

Category variable value pos maxpos 
1  AX  WW 47.8 47.8 184.1 
2  AY  WW 5.6 53.4 184.1 
3  AZ  WW 15.8 69.2 184.1 
4  BX  WW 31.4 100.6 184.1 
5  BY  WW 11.7 112.3 184.1 
6  BZ  WW 10.7 123.0 184.1 
7  CX  WW 2.2 125.2 184.1 
8  CY  WW 21.4 146.6 184.1 
9  CZ  WW 37.5 184.1 184.1 
10  AX  SM 39.8 39.8 148.6 
11  AY  SM 2.9 42.7 148.6 
12  AZ  SM 13.2 55.9 148.6 
13  BX  SM 22.7 78.6 148.6 
14  BY  SM 7.3 85.9 148.6 
15  BZ  SM 8.9 94.8 148.6 
16  CX  SM 1.6 96.4 148.6 
17  CY  SM 17.3 113.7 148.6 
18  CZ  SM 34.9 148.6 148.6 
19  AX  AsIs 156.9 156.9 519.0 
20  AY  AsIs 13.1 170.0 519.0 
21  AZ  AsIs 70.5 240.5 519.0 
22  BX  AsIs 72.6 313.1 519.0 
23  BY  AsIs 30.7 343.8 519.0 
24  BZ  AsIs 35.6 379.4 519.0 
25  CX  AsIs 5.2 384.6 519.0 
26  CY  AsIs 44.8 429.4 519.0 
27  CZ  AsIs 89.6 519.0 519.0 
+0

nie udało mi się załadować 'dput' jakiegoś powodu –

+0

@DavidArenburg , Nie wiem, co było nie tak, mam nadzieję, że nie masz nic przeciwko używaniu innego formatu. –

Odpowiedz

9

Tworząc zmienną hjust, można osiągnąć pożądany rezultat. Kod:

mydf$hj <- rep(c(1,0,-1), length.out=27) 

ggplot(mydf, aes(x=variable, y=value, fill=Category)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=value, y=pos-(value/2), hjust=hj), size=4) 

co daje: enter image description here


nieznacznie alternatywnego rozwiązania zaproponowanego przez @konvas:

ggplot(mydf, aes(x=variable, y=value, fill=Category)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=value, y=pos-(value/2), hjust=rep(c(1,0,-1), length.out=length(value))), size=4) 
+0

Dzięki Jaap, właśnie tego potrzebowałem :) +1 –

+3

Albo unikaj tworzenia nowej zmiennej jawnie i dodaj 'hjust = rep (c (-1, 1), length.out = length (value))' w twoim oryginalnym call (wewnątrz 'aes'). – konvas

+0

@konvas dzięki, to jest bardzo dobra sugestia! –