2014-10-16 5 views
0

안녕하세요 모두 좋은 그래프를 만들기 위해 R의 데이터 프레임으로 작업하고 있습니다. 그래프를 만들었지 만 전설에 문제가 있습니다.ggplot2에서 라벨을 조정하고 플롯에서 막대의 위쪽에 다른 라벨을 추가하십시오.

Mes Estado Numero Label 
1 2  X  7 22 (1.19%) 
2 2  A  13 22 (1.19%) 
3 2  Z  2 22 (1.19%) 
4 3  X  19 30 (1.62%) 
5 3  A  10 30 (1.62%) 
6 3  Z  1 30 (1.62%) 
7 4  X  19 31 (1.68%) 
8 4  A  11 31 (1.68%) 
9 4  Z  1 31 (1.68%) 
10 5  X  17 28 (1.52%) 
11 5  A  7 28 (1.52%) 
12 5  Z  4 28 (1.52%) 

그것은 4 개 변수 Mes, Estado, Numero, Label 있습니다 미 dataframe DF 다음 양식 (I 최종 측면에서 dput() 버전을 추가)가 있습니다. 나는 사례 수 (Numero)에 따라 Mes으로 Estado의 분포를 보여주고 싶은, 그래서 나는 다음 코드를 사용하여이 그래픽 제작할 수 있습니다 Estado의 분포를 볼 수있는 방법

AAA=ggplot(DF, aes(x = Mes, y = Numero, fill = Estado)) + 
    geom_bar(stat = "identity") + scale_y_continuous(labels = comma) + geom_text(aes(label=Numero),fontface="bold",size=6) 
print(AAA) 

enter image description here

Mes의 각 값은 Numero에 따라 잘 작동하지만 라벨에 문제가 있습니다. 각 색상의 중간에있는 각 막대의 레이블을 수정하고 싶습니다. 예를 들어 첫 번째 막대의 경우 2은 파란색 영역에, 녹색 영역에는 7, 장미 영역에는 13이 있어야합니다. 그러나 모든 라벨은 순서가 맞지 않습니다. 또한 변수에 Label이라는 변수가 있습니다. 각 막대의 위쪽에이 값을 추가하려고합니다. 예를 들어 Mes=2 레이블의 값은 22 (1.19%)이며 막대의 모든 값의 합계를 의미합니다. 괄호 안의 값은 해당 합계와 1848 사이의 관계입니다 (22/1848). 그 값을 각 막대의 맨 위에 추가하고 싶습니다. 그러나 다른 geom_text()unique(PPP$Label)과 함께 사용하려고하면 오류가 발생합니다. DF의 출력 버전은 다음입니다.

DF<-structure(list(Mes = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 8L, 8L, 8L, 
9L, 9L, 9L, 10L, 10L, 10L, 11L, 11L, 11L, 12L, 12L, 12L, 13L, 
13L, 13L, 14L, 14L, 14L, 15L, 15L, 15L, 16L, 16L, 16L, 17L, 17L, 
18L, 18L, 19L, 20L), .Label = c("2", "3", "4", "5", "6", "7", 
"8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", 
"19", "20", "21"), class = "factor"), Estado = structure(c(2L, 
1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 
2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 
1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 1L, 3L, 
1L, 3L, 1L, 3L), .Label = c("A", "X", "Z"), class = "factor"), 
    Numero = c(7L, 13L, 2L, 19L, 10L, 1L, 19L, 11L, 1L, 17L, 
    7L, 4L, 19L, 8L, 7L, 11L, 13L, 15L, 8L, 3L, 13L, 13L, 8L, 
    6L, 14L, 4L, 11L, 14L, 5L, 3L, 4L, 3L, 5L, 12L, 6L, 2L, 9L, 
    4L, 2L, 6L, 5L, 1L, 5L, 2L, 1L, 2L, 3L, 5L, 2L, 3L, 2L, 1L, 
    1L), Label = c("22 (1.19%)", "22 (1.19%)", "22 (1.19%)", 
    "30 (1.62%)", "30 (1.62%)", "30 (1.62%)", "31 (1.68%)", "31 (1.68%)", 
    "31 (1.68%)", "28 (1.52%)", "28 (1.52%)", "28 (1.52%)", "34 (1.84%)", 
    "34 (1.84%)", "34 (1.84%)", "24 (1.3%)", "24 (1.3%)", "26 (1.41%)", 
    "26 (1.41%)", "26 (1.41%)", "34 (1.84%)", "34 (1.84%)", "34 (1.84%)", 
    "24 (1.3%)", "24 (1.3%)", "24 (1.3%)", "30 (1.62%)", "30 (1.62%)", 
    "30 (1.62%)", "10 (0.54%)", "10 (0.54%)", "10 (0.54%)", "23 (1.24%)", 
    "23 (1.24%)", "23 (1.24%)", "15 (0.81%)", "15 (0.81%)", "15 (0.81%)", 
    "13 (0.7%)", "13 (0.7%)", "13 (0.7%)", "8 (0.43%)", "8 (0.43%)", 
    "8 (0.43%)", "6 (0.32%)", "6 (0.32%)", "6 (0.32%)", "7 (0.38%)", 
    "7 (0.38%)", "5 (0.27%)", "5 (0.27%)", "1 (0.05%)", "1 (0.05%)" 
    )), .Names = c("Mes", "Estado", "Numero", "Label"), row.names = c(NA, 
-53L), class = "data.frame") 

많은 도움을 주셔서 감사합니다.

답변

2

먼저 중점 (NumeroPos)의 위치와 누적 막대의 높이 (NumeroSum)를 계산합니다.

DF <- transform(DF, NumeroPos = ave(Numero, Mes, FUN = cumsum) - Numero/2, 
       NumeroSum = ave(Numero, Mes, FUN = sum)) 

이제 새 변수를 사용하여 레이블을 만들 수 있습니다. 각 막대에 정확히 하나의 레이블이 필요하므로 막대 위에 레이블의 데이터 프레임 하위 집합을 사용합니다.

library(ggplot2) 
ggplot(DF, aes(x = Mes, y = Numero, fill = Estado)) + 
    geom_bar(stat = "identity") + 
    geom_text(aes(label = Numero, y = NumeroPos), fontface = "bold", size = 6) + 
    geom_text(data = DF[!duplicated(DF$Mes), ], 
      aes(y = NumeroSum, label = Label), vjust = -.5, size = 4) 

enter image description here

관련 문제