ggplot2 :: geom_text (): как отобразить все уровни факторов, но подавить указанные c значения, такие как «0»: - PullRequest
3 голосов
/ 05 февраля 2020

Вот код, который дает контекст для моего вопроса:

set.seed(1); tibble(x=factor(sample(LETTERS[1:7],7,replace = T),levels = LETTERS[1:7])) %>% group_by_all() %>% count(x,.drop = F) %>% 
ggplot(mapping = aes(x=x,y=n))+geom_bar(stat="identity")+geom_text(
    aes(label = n, y = n + 0.05),
    position = position_dodge(1),
    vjust = 0)

Я хочу, чтобы ВСЕ уровни переменной x отображались на оси x (LETTERS [1: 7]). Для каждого уровня с n> 0 я хочу, чтобы значение отображалось на панели для этого уровня. Для каждого уровня с n == 0 я хочу, чтобы метка значения НЕ отображалась. В настоящее время график отображает 0 для «пустых» уровней факторов c («C», «F»), и я хочу подавить отображение «0» для этих уровней, но по-прежнему отображать «C» и "F" на оси X.

current plot

Я надеюсь, что кто-то сможет мне помочь.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

Простой ifelse() сделает это. Вы можете ввести любой текст, который вам нравится, например ifelse( n>0, n , "No Data")

library( tidyr)
library( ggplot2)
library( dplyr )


set.seed(1); tibble(x=factor(sample(LETTERS[1:7],7,replace = T),levels = LETTERS[1:7])) %>% group_by_all() %>% count(x,.drop = F) %>% 
ggplot(mapping = aes(x=x,y=n))+geom_bar(stat="identity")+
    geom_text(
    aes(label = ifelse( n>0, n , ""), y = n + 0.05),
    position = position_dodge(1),
    vjust = 0)

example graph without zeros

1 голос
/ 05 февраля 2020

Вы передаете функцию аргументу данных внутри geom_test, для этого примера вы можете сделать подмножество переданных данных (именуемое .x):

set.seed(1); 
tibble(x=factor(sample(LETTERS[1:7],7,replace = T),levels = LETTERS[1:7])) %>% group_by_all() %>% count(x,.drop = F) %>% 
ggplot(mapping = aes(x=x,y=n))+geom_bar(stat="identity")+
geom_text(data=~subset(.x,n>0),
    aes(label = n, y = n + 0.05),
    position = position_dodge(1),
    vjust = 0)
...