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

时间:2017-12-22 10:43:48

标签: r ggplot2

我需要生成一个带有条形图的图表,用于两个变量和一个带有第三个变量的行。

我可以为一个变量创建一个列图,如下所示

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

2 个答案:

答案 0 :(得分: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进行比较,因为如果你指向元素,他们会出现......

答案 1 :(得分:0)

您可以尝试:

sed -E 's/(56:)([0-9]+)(.*57:)([0-9]+)(.*58:)([0-9]+)(.*59:)([0-9]+)/\1\6\3\8\5\2\7\4/' file

enter image description here