我想在第二条轴上使用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")
我也希望小组之间的比例。 例如,对于C4,它将是70/230 * 100 = 30%。这可能代表什么:
有什么想法吗?
答案 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))
答案 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))