![](/img/trans.png)
[英]How to customize the range of values in a y-axis of a geom_bar plus geom_error bar plot
[英]Plot ratio of geom_bar on second y-axis
我想在第二個軸上使用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%。 它可能代表以下內容:
任何想法 ?
您可以使用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))
您可以嘗試將比率標准化為最大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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.