Как вывести текст только для одной панели ggplot, находясь внутри цепочки dplyr? - PullRequest
0 голосов
/ 14 сентября 2018

Вот некоторые данные (называемые носителем):

        Age Term   Band Gender Class Premium
4568  31-35   30 Band 3 female   PNS      26
3033  18-30   20 Band 1 female  SPNS     285
1035  18-30   20 Band 3   male  SPNS     576
145   18-30   20 Band 1   male  PPNS     168
2626  18-30   10 Band 3 female   SNS      47
4617  31-35   10 Band 1 female  SPNS     187
2246  18-30   30 Band 2   male   PNS     723
3677  18-30   30 Band 1   male   PSM     569
259   18-30   30 Band 4 female  PPNS     675
397   18-30   15 Band 4   male  PPNS      91
1485  18-30   10 Band 4 female  SPNS     204
3459  18-30   10 Band 1   male  SPNS     467
8805  46-50   20 Band 2 female  SPNS     365
1316  18-30   20 Band 2 female   PNS     311
11379 56-60   20 Band 1   male  SPNS     370
7284  41-45   15 Band 1 female   SSM     590
4360  31-35   10 Band 4   male   SNS     109
1318  18-30   20 Band 2 female   SNS     191
6131  36-40   15 Band 1 female   PSM     722
4501  31-35   20 Band 4   male  PPNS     704
8656  46-50   10 Band 2   male   SNS     587
1045  18-30   20 Band 4   male  PPNS     398
4341  31-35   10 Band 2 female  SPNS     419
2623  18-30   10 Band 3 female  PPNS     729
9668  51-55   20 Band 2 female   PNS     689
3532  18-30   15 Band 1   male   SNS     763
4363  31-35   10 Band 4 female  PPNS     567
260   18-30   30 Band 4 female   PNS     401
8086  46-50   10 Band 2 female   SNS     202
3385  18-30   30 Band 1   male  PPNS     292
169   18-30   20 Band 3   male  PPNS     185
2452  18-30   20 Band 1   male   SNS     665
5362  36-40   20 Band 3 female   SNS     772
1020  18-30   20 Band 1 female   SSM     616
5643  36-40   20 Band 3   male  SPNS     627
13544 61-65   10 Band 1 female   PNS     612
6359  36-40   10 Band 2 female   PSM     508
6295  36-40   30 Band 3 female  PPNS     597
5564  36-40   15 Band 2 female   PNS     356
2603  18-30   10 Band 1 female   PSM     740
2774  18-30   20 Band 4   male   PNS     425
4405  31-35   15 Band 2   male  PPNS      18
5003  31-35   15 Band 3 female   PSM     168
3567  18-30   15 Band 4   male  SPNS     499
5268  36-40   15 Band 1 female   SSM     636
6772  41-45   20 Band 1   male   SNS     262
5866  36-40   15 Band 3 female   SNS     438
5337  36-40   20 Band 1 female  SPNS     384
3471  18-30   10 Band 2   male  SPNS     429
5620  36-40   20 Band 1   male   SNS     527

, и это мой код dplyr / ggplot:

carrier%>%
group_by(Age)%>%
summarise(high=length(which(Premium>300)),low=length(which(Premium<300)))%>%
gather(key,value,-Age)%>%
ggplot(aes_string("Age","value",fill="key"))+
geom_bar(stat="identity",position="stack",na.rm=TRUE)+
geom_text(data=. %>% filter(key=="high"),aes(label=sum(value)))

, и вывод, который я здесь получаю: iне хочу этого

Таким образом, 35 ​​является суммой всех высоких значений для всех возрастных групп.Для меня не имеет смысла выводить это для каждого столбца.Я хотел бы вывести 35 только один раз, но я не могу понять, как я могу это сделать.Я должен также упомянуть, что этот код находится в приложении Shiny, где вводом является «оператор».До сих пор я пробовал:

carrier%>%
group_by(Age)%>%
summarise(high=length(which(Premium>300)),low=length(which(Premium<300)))%>%
gather(key,value,-Age)%>%
ggplot(aes_string("Age","value",fill="key"))+
geom_bar(stat="identity",position="stack",na.rm=TRUE)+
geom_text(data=. %>% select(filter(key=="high"),value),aes(label=sum(value)))

Ошибка в ключе == "высокий": сравнение (1) возможно только для атомарных и списочных типов

и

carrier%>%
group_by(Age)%>%
summarise(high=length(which(Premium>300)),low=length(which(Premium<300)))%>%
gather(key,value,-Age)%>%
ggplot(aes_string("Age","value",fill="key"))+
geom_bar(stat="identity",position="stack",na.rm=TRUE)+
geom_text(data=. %>% filter(key=="high") %>% select(value),aes(label=sum(value)))

Ошибка в FUN (X [[i]], ...): объект 'Age' не найден

, но оба возвращают ошибку,Я все еще новичок в ggplot / dplyr, поэтому я не совсем уверен, что здесь происходит.Я был бы признателен, если бы кто-то указал мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я не уверен, что вы на самом деле хотите group_by и summarise здесь;скорее, я думаю, что вам просто нужно if_else:

df_summary <-
  carrier %>%
  mutate(
    high_low = if_else(Premium > 300, "high", "low")
  )

count_of_high <- sum(df_summary$high_low == "high")
label_for_graph <- paste("Count of High = ", count_of_high)

ggplot(df_summary, aes(x = Age, fill = high_low)) +
  geom_bar() +
  annotate("text", x = Inf, y = Inf, label = label_for_graph, hjust = 1.5, vjust = 2)

enter image description here

0 голосов
/ 14 сентября 2018

Вы можете указать это именно там, где хотите geom_text, иначе они будут рассматриваться как ярлыки для вашего geoms.

carrier %>%
  group_by(Age) %>%
  summarise(high=length(which(Premium>300)),low=length(which(Premium<300))) %>%
  gather(key,value,-Age) %>%
  ggplot(aes_string("Age","value",fill="key")) +
  geom_bar(stat="identity",position="stack",na.rm=TRUE) +
  geom_text(x = 7.5, y = 23.5, data=. %>% filter(key=="high"),aes(label=sum(value)))

В качестве альтернативы вы можете установить его как grob. http://www.sthda.com/english/wiki/ggplot2-texts-add-text-annotations-to-a-graph-in-r-software

numbers <- carrier %>%
  group_by(Age) %>%
  summarise(high = length(which(Premium>300)),low=length(which(Premium<300))) %>%
  gather(key,value,-Age) %>%
  filter(key == "high") %>%
  summarise(sums = sum(value))

grob <- grobTree(textGrob(numbers, x=0.85,  y=0.95, hjust=0,
                      gp=gpar(col="black", fontsize=13, fontface="italic")))

p + annotation_custom(grob) #where p is your plot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...