geom_text только в верхней части гистограммы с накоплением

Я хотел бы, чтобы метки были только в верхней части моего столбчатого графика с накоплением.

Вот мой фрейм данных:

#create data frame 
building <- c("Burj \nKhalifa", "Zifeng \nTower", "Bank of \nAmerica Tower", 
              "Burj Al Arab", "Emirates \nTower One", "New York \nTimes Tower",
              "Emirates \nTower Two", "Rose Rayhaan \nby Rotana", "The \nPinnacle", 
              "Minsheng \nBank Building")
occupiable<- c(585, 317, 235, 198, 241, 220, 213, 237, 265, 237)
nonoccupiable <- c(244, 133, 131, 124, 113, 99, 97, 96, 95, 94)
df.build <- data.frame(building, occupiable, nonoccupiable)

#melt data frame for stack bar plot
df.build2 <- melt(df.build, id.vars="building")

И мой составной барный сюжет:

#comparision true and percived values
ggplot(df.build2, aes(x=reorder(building, -value), y=value, fill=variable)) +
  geom_bar(stat="identity") +
  xlab("") +
  ylab("") +
 #geom_text(aes(label = c("29%" "30%", "36%", "39%", "32%", "31%", "31%", "29%", "29%", "28%")), size = 3, hjust = 0.5, vjust = 3, position = "stack") +
  theme(legend.position="top") +
  ggtitle("Porównanie wartości prawdziwych i odczuwalnych") 

введите описание изображения здесь

Я хотел бы иметь такие метки в geom_text() в моем коде для построения графика (высота синей полосы / высота всей полосы). Его следует поместить в синюю область. Как я могу это сделать?


person jjankowiak    schedule 21.04.2014    source источник
comment
Взгляните на this вопрос, ответ с наивысшей оценкой очень похож на желаемое решение.   -  person tonytonov    schedule 21.04.2014
comment
Хорошо, но я хочу иметь только половину меток (только для синих полос). Итак, если я определю percentage <- nonoccupiable/(nonoccupiable+occupiable) и добавлю к строке ggplot geom_text(aes(y=percentage, label = paste(round(percentage*100,0),"%",sep="")), size = 3, hjust = 0.5, vjust = 3), я получу ошибку: Aesthetics must either be length one, or the same length as the dataProblems:percentage.   -  person jjankowiak    schedule 21.04.2014


Ответы (2)


Другое решение (я также изменил угол текста по оси x):

# creating percentage variables
df.build$occ.perc <- round(df.build$occupiable / (df.build$occupiable + df.build$nonoccupiable) * 100)
df.build$nonocc.perc <- round(df.build$nonoccupiable / (df.build$occupiable + df.build$nonoccupiable) * 100)

# melt data frame for stack bar plot![enter image description here][1]
df.build2 <- cbind(
  melt(df.build, id = c("building"), measure = c(2:3)),
  melt(df.build, id = c("building"), measure = c(4:5), value.name = "perc")
)
df.build2 <- df.build2[,-c(4,5)]
df.build2$perc <- ifelse(df.build2$variable=="occupiable", df.build2$perc==NA, df.build2$perc)

# creating the plot
ggplot(df.build2, aes(x=reorder(building, -value), y=value, fill=variable)) +
  geom_bar(stat="identity") +
  xlab("") +
  ylab("") +
  geom_text(aes(label = perc), size = 3, hjust = 0.5, vjust = 2, position = "stack") +
  theme(legend.position="top", axis.text.x = element_text(angle = 45, vjust=0.5)) +
  ggtitle("Porównanie wartości prawdziwych i odczuwalnych")

результат: введите описание изображения здесь

person Jaap    schedule 21.04.2014

Есть 2 проблемы: отсутствует запятая между первыми двумя элементами вектора метки; и ваш вектор ярлыка слишком короткий. Несмотря на то, что у вас есть что-то вроде 10 столбцов, на самом деле у вас их 20 (поскольку они сложены). Чтобы обойти это, поставьте перед ярлыками 10 строк пустых символов:

geom_text(
 aes(label = c(rep("",10),
 "29%", "30%", "36%", "39%", "32%", "31%", "31%", "29%", "29%", "28%")),
size = 3, hjust = 0.5, vjust = 3, position = "stack")

Который дает:

столбчатая диаграмма с накоплением

person James    schedule 21.04.2014