R语言 ggplot -在同一图表中绘制条形图和折线图

chhkpiq4  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(269)

我需要生成一个两个变量的条形图和第三个变量的直线图。
我可以为一个变量创建柱形图,如下所示

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

参考this答案-我可以绘制两个变量-disphp,如下所示

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')

我需要将第三个变量qsec绘制为一条线,如下图所示-如何进行?

yiytaume

yiytaume1#

您可以尝试:

library(tidyverse)
# some data
data <- mtcars %>%  
  mutate(car = rownames(mtcars)) %>% 
  slice(1:6) %>% 
  select(car, disp, hp) 

data %>% 
  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())

代码更少,结果相同:

data %>% 
  pivot_longer(-1) %>% 
  ggplot(aes(x = car)) + 
    geom_col(aes(y=value, fill = name), position = "dodge") + 
    stat_summary(aes(y=value, group=1, color="qseq"), fun = "median", geom = "point")+
    stat_summary(aes(y=value, group=1, color="qseq"), fun = "median", geom = "line")+
    scale_colour_manual(name= "", values = 1)
qoefvg9y

qoefvg9y2#

你需要另一个图层,因为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"))
    )
  }
    • 编辑:**

顺便说一句,您可以通过调用plotly::ggplotly()来检查qsec到相应x值的正确顺序,然后您可以更好地读取这些值并将它们与df进行比较,因为如果您指向元素,它们就会显示出来...

相关问题