繁体   English   中英

如何使用ggplot2将geom_bar和geom_line图覆盖不同数量的元素?

[英]How to overlay geom_bar and geom_line plots with different number of elements using ggplot2?

假设我有两个data.frame,它们的数据不同,但x值的范围相同

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图?

尝试这个

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/max(y)之间的关系,因此我使用y/max(y)重新缩放了它们。 这样可以解决您的问题吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM