Определите другой размер этикетки по категории в geom_bar

Я пытаюсь построить сложную диаграмму, используя geom_bar и маркируйте каждую категорию с ее значением в пределах диаграммы. Поскольку некоторые категории имеют небольшие значения, высота соответствующего сегмента столбчатой ​​диаграммы иногда мала. Итак, я пытаюсь отрегулировать размер меток с помощью geom_text,
Я попытался определить вектор, называется size, который варьируется в зависимости от значения переменной, которую я пытаюсь построить, но, хотя размер меток варьируется между категориями, он, похоже, не связан со значениями. Кроме того, я не уверен, почему я получаю легенду для размера моего ярлыка в правой части графика.
Вот урезанная версия кода, который я использую:

library(ggplot2)
library(plyr)
library(scales)

Var1 = as.factor(rep(c("A", "B", "C", "D", "E", "F"),2))
Var2 = as.factor(rep(c("Y1","Y2"),each=6))
Freq = c(0.4, 0.1, 0.3, 0.1, 0.05, 0.05,0.2,0.2,0.3,0.2,0.05,0.05)
Data = data.frame(Var1, Var2, Freq)
Data <- ddply(Data, .(Var2), mutate, y = cumsum(Freq)-Freq/2)

size = ifelse(Data$Freq > 0.05, 10, 3)
label = paste(round(Data$Freq*100,0),"%", sep = "")
p = ggplot(data = Data, aes(x = factor(''), y = Freq, fill = Var1)) +
  geom_bar(stat = "identity",position = "fill", width = 1) +
  scale_fill_brewer(palette = 3) +
  facet_grid(facets = . ~ Var2) +
  geom_text(aes(y = y, label = label, 
                position ="identity", face = "bold"), size = size, hjust=0.5, vjust=0.5) +
  xlab('') + ylab('') + labs(fill = '') + ggtitle('Example') +
  theme(axis.text.y = element_text(size=14,face="bold"),
        panel.background = element_blank(),
        plot.title = element_text(size = 20, colour = "black", face = "bold"))
p

Насколько я вижу, проблема вызвана аспектами, так как эта слегка упрощенная версия (т.е. без аспектов) работает нормально:

library(ggplot2)
library(plyr)
library(scales)

Var1 = as.factor(c("A", "B", "C", "D", "E", "F"))
Freq = c(0.4, 0.1, 0.3, 0.1, 0.05, 0.05)
y = cumsum(Freq)-Freq/2
Data = data.frame(Var1, Freq, y)

size = ifelse(Data$Freq > 0.05, 10, 3)
label = paste(round(Data$Freq*100,0),"%", sep = "")
p = ggplot(data = Data, aes(x = factor(''), y = Freq, fill = Var1)) +
  geom_bar(stat = "identity",position = "fill", width = 1) +
  scale_fill_brewer(palette = 3) +
  geom_text(aes(y = y, label = label, 
                position ="identity", face = "bold"), size = size, hjust=0.5, vjust=0.5) +
  xlab('') + ylab('') + labs(fill = '') + ggtitle('Example') +
  theme(axis.text.y = element_text(size=14,face="bold"),
        panel.background = element_blank(),
        plot.title = element_text(size = 20, colour = "black", face = "bold"))
p

1 ответ

Решение

Добавляя size к вашему фрейму данных и перемещая эти параметры в пределах вашего geom_textaes()`мне кажется, что это хорошо для меня. Я думаю..

Data$size <- size

p <- ggplot(data = Data, aes(x = factor(''), y = Freq, fill = Var1)) +
       geom_bar(stat = "identity",position = "fill", width = 1) +
       scale_fill_brewer(palette = 3) +
       geom_text(aes(y = y, label = label, 
                     position ="identity", face = "bold", size = size), hjust=0.5, 
                     vjust=0.5) +
       xlab('') + ylab('') + labs(fill = '') + ggtitle('Example') +
       theme(axis.text.y = element_text(size=14,face="bold"),
             panel.background = element_blank(),
             plot.title = element_text(size = 20, colour = "black", face = "bold")) + 
             facet_grid(facets = . ~ Var2) + 
             guides(size=FALSE)

Также, если вы добавите + guides(size=FALSE) до конца, как я сделал, это удалит легенду вашего размера.

Мое объяснение этому, может быть ошибочным, состоит в том, что, как только вы столкнулись с проблемой, вы по-прежнему предоставляете полную длину size и не позволяя фасету нарезать размер данных в соответствии с Var2,

Я думаю, что ваша проблема с проклейкой size у вас есть только два размера, вы получаете большие различия (возможно, должно быть некоторое относительное масштабирование), возможно, добавьте + scale_size(range=c(6,10)) и играть с этим, чтобы получить что-то более подходящее? 6,10 Диапазон размеров выглядит намного лучше для меня.

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

Другие вопросы по тегам