首页 文章

ggplot - 在同一图表中绘制条形图和线条

提问于
浏览
0

我需要为两个变量生成带条形图的图,使用第三个变量生成一条线 .

我可以为下面的一个变量创建一个列图

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

Ref 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 绘制成如下图所示的线 - 如何解决这个问题?

enter image description here

2 回答

  • 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"))
        )
      }
    

    Edit:

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

  • 0

    你可以试试:

    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

相关问题