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

问题描述 投票:0回答:2

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

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

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绘制成如下图所示的线 - 如何进行此操作?

enter image description here

r ggplot2
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"))
    )
  }

编辑:

顺便说一下,你可以通过调用qsec来检查plotly::ggplotly()到相应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

© www.soinside.com 2019 - 2024. All rights reserved.