【问题标题】:How to overlay geom_bar and geom_line plots with different number of elements using ggplot2?如何使用 ggplot2 用不同数量的元素覆盖 geom_bar 和 geom_line 图?
【发布时间】:2018-02-19 05:24:37
【问题描述】:

假设我有两个具有不同数据但 x 值范围相同的 data.frames

a <-data.frame(x=c(1,1,1,2,2,2,3,3,3),
               y=c(0.3,0.4,0.3,0.2,0.5,0.3,0.4,0.4,0.2), 
               z=c("do","re","mi","do","re","mi","do","re","mi"))

b <- data.frame(x=c(1,2,3),y=c(10,15,8))

a 和 b 的 X 值范围相同 (1,2,3),但 a 是 9 行的 data.frame,b 是 3 行的 data.frame。

我使用 geom_bar 来绘制 a 值的分布,如下所示:

ggplot(a, aes(x=x, y=y, fill=z)) +
    geom_bar(position="stack",stat="identity") + 
    ylab("") + 
    xlab("x")

我使用 geom_line 来绘制 b 数据,如下所示:

ggplot(b, aes(x=x, y=y)) + 
    geom_line(stat="identity") + 
    ylab("") + xlab("x") + ylim(0,15)

现在我想将这个 geom_line 图覆盖到之前的 geom_bar 图。我的第一次尝试是执行以下操作:

ggplot(a, aes(x=x, y=y, fill=z)) +
    geom_bar(position="stack",stat="identity") + 
    ylab("") + xlab("x") +
    ggplot(b, aes(x=x, y=y)) + 
    geom_line(stat="identity") + 
    ylab("") + xlab("x") + ylim(0,15)

没有成功。

如何将 geom_line 图叠加到 geom_bar 图?

【问题讨论】:

  • y 轴刻度看起来非常不同。我不确定这会很好地覆盖,但我会添加一个答案来告诉你如何。

标签: r plot ggplot2 overlay


【解决方案1】:

试试这个

p <- ggplot() 
p <- p + geom_bar(data = a, aes(x=x, y=y, fill=z), position="stack",stat="identity")
p <- p + geom_line(data = b, aes(x=x, y=y/max(y)), stat="identity") 
p

更新: 您可以重新调整 y 以使它们相同。由于我不知道这两个 y 之间的关系,我使用y/max(y) 重新调整了它们。这能解决你的问题吗?

【讨论】:

  • 感谢您的回复。我现在看到我的问题缺少一个重要细节:y 值的范围非常不同(条形代表比例,线条可以代表任何其他数据)。所以我需要覆盖线条和绘图并添加第二个 y 轴以保持绘图的良好比例。我自己解释了吗?
  • 我会接受您的回答,因为您是第一个准确回答我问题的人。但我将不胜感激任何贡献,以解决我上面所说的 y 轴比例问题。非常感谢!!
【解决方案2】:

尝试先合并数据集,然后进行绘图,如下所示:

require(ggplot2)

df <- merge(a,b,by="x")

ggplot(df, aes(x=x, y=y.x, fill=z)) +
  geom_bar(position="stack",stat="identity") + 
  geom_line(aes(x=x, y=y.y)) + 
  ylab("") + xlab("x")

输出:

我编辑了示例数据以更好地说明效果,因为原始数据的 y 轴缩放不会很好地匹配:

a <-data.frame(x=c(1,1,1,2,2,2,3,3,3),
               y=c(0.3,0.4,0.3,0.2,0.5,0.3,0.4,0.4,0.2), 
               z=c("do","re","mi","do","re","mi","do","re","mi"))

b <- data.frame(x=c(1,2,3),y=c(.4,1,.4))

【讨论】:

  • 感谢您的回复。我现在看到我的问题缺少一个重要细节:y 值的范围非常不同(条形代表比例,线条可以代表任何其他数据)。所以我需要覆盖线条和绘图并添加第二个 y 轴以保持绘图的良好比例。我自己解释了吗?
  • 我会接受@Likan 的回答,因为他/她是第一个准确回答我问题的人。但我将不胜感激任何贡献,以解决我上面所说的 y 轴比例问题。非常感谢!!
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多