geom_bar在第二个y轴上的比例

时间:2019-07-29 13:58:26

标签: r ggplot2

我想在第二条轴上使用plot_line绘制geom_bar的比率。 这是我的数据框:

df <- data.frame(code=c('F6', 'F6','D4', 'D4', 'F5', 'F5', 'C4', 'C4', 'F7', 'F7'),
           group=c('0','1','0','1','0','1','0','1','0','1'),
           count=c(80, 700, 30, 680, 100, 360, 70, 230, 40, 200))

目前,我绘制下图:

ggplot(df, aes(x=code, y=count, fill=group)) +
  geom_bar(stat ="identity", position="dodge")

enter image description here

我也希望小组之间的比例。 例如,对于C4,它将是70/230 * 100 = 30%。这可能代表什么:

enter image description here

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以通过使用tidyverse库来计算每个组的百分比,然后使用辅助轴将其添加到绘图中来完成此操作:

library(tidyverse)

df <- data.frame(code=c('F6', 'F6','D4', 'D4', 'F5', 'F5', 'C4', 'C4', 'F7', 'F7'),
                 group=c('0','1','0','1','0','1','0','1','0','1'),
                 count=c(80, 700, 30, 680, 100, 360, 70, 230, 40, 200))

现在,制作另一个数据框,按照您的指示计算百分比。我使用spread来做到这一点。另外,我将百分比计算为所计算百分比的7倍,因为您要将百分比(从0到100)放在同一图表上(从0到700计数)。因此7 * 100将填满整个图形。我还添加了一个名为“ order”的新字段,因为geom_line不喜欢使用一个因素(组)来连接一条线。

  percentage.df <- df %>% 
      spread(group, count) %>% 
      mutate(percentage = 7*(`0`/`1`)*100) %>% 
      mutate(order = c(1:nrow(.)))

现在,当您绘制此图形时,可以指定辅助轴,但必须记住要告诉ggplot您应该将数字除以7才能使辅助轴标签有意义。

ggplot(df, aes(x=code, y=count)) +
  geom_bar(stat ="identity", position="dodge", aes(fill=group)) +
  geom_point(data = percentage.df, aes(code, percentage)) +
  geom_line(data = percentage.df, aes(order, percentage)) +
  scale_y_continuous(sec.axis = sec_axis(~ . /7))

enter image description here

答案 1 :(得分:3)

您可以尝试将比率标准化为最大y值(count)。

library(tidyverse)
MAX= max(df$count)

df %>% 
  group_by(code) %>% 
  mutate(ratio = count[1]/count[2]) %>%
  mutate(ratio_norm = MAX*ratio) %>%   
 ggplot(aes(x=code)) +
  geom_col(aes(y=count, fill=group), position="dodge") + 
  geom_point(data = . %>% distinct(code, ratio_norm), aes(y=ratio_norm)) +
  geom_line(data = . %>% distinct(code,  ratio_norm), aes(y=ratio_norm, group = 1)) + 
  scale_y_continuous(sec.axis = sec_axis(~./MAX, labels = scales::percent))

enter image description here