2017-12-22 17 views
0

2つの変数の棒グラフと3番目の変数のある線をプロットする必要があります。ggplot - 棒グラフと線を同じグラフにプロットする

私は

df <- head(mtcars) 
df$car <- row.names(df) 
ggplot(df) + geom_col(aes(x=car, y=disp)) 

参考this答え以下のように一つの変数の列グラフを作成することができます - 私は三分の一を持っている必要があり

library(tidyr) 
df$car = row.names(df) 
df_long = gather(df, key = var, value = value, disp, hp) 
ggplot(df_long, aes(x = car, y = value, fill = var)) + 
    geom_bar(stat = 'identity', position = 'dodge') 

以下のようにdisphp - 私は2つの変数をプロットすることができます変数qsecは、下の図のような線としてプロットされます - これについてはどうすればよいですか?

enter image description here

答えて

0

あなたは別の層を必要とgeom_lineは、連続的なデータのためにあるので、あなたはあなたのx値は、ライン層のためのものであるかのように行う必要があります。こうすることで、データの順序が重要になり、したがって、あなたがそれを並べ替えることもあります。

gather(df, key = var, value = value, disp, hp, qsec) %>% 
    arrange(car) %>% 
    { 
    print(
     ggplot() + 
     geom_bar(stat = 'identity', position = 'dodge', data = filter(., var != "qsec"), mapping = aes(x = car, y = value, fill = var)) + 
     geom_line(mapping = aes(x = 1:length(car), y = value), data = filter(., var == "qsec")) 
    ) 
    } 

編集:

ところで、あなたがすることにより、それぞれのxの値にqsecの正しい順序を確認することができます

0

はあなたが試すことができます...、そしてあなたがより良い値を読み取ることができますし、要素に指している場合、彼らが表示されますので、dfにそれらを比較plotly::ggplotly()を呼び出す:

library(tidyverse) 
mtcars %>% 
    mutate(car = rownames(mtcars)) %>% 
    slice(1:6) %>% 
    select(car, disp, hp) %>% 
    gather(key, value, -car) %>% 
    group_by(car) %>% 
    mutate(qsec_value = median(value)) %>% 
    mutate(qsec = factor("qsec")) %>% 
    ggplot() + 
    geom_col(aes(x=car, y=value, fill = key), position = "dodge") + 
    geom_point(aes(x=car, y=qsec_value,color = qsec)) + 
    geom_line(aes(x=car, y=qsec_value, color = qsec, group =1)) + 
    scale_colour_manual(name= "", values = 1) + 
    theme(legend.position = "top", 
      legend.title = element_blank()) 

enter image description here

関連する問題