如何使用 ggplot2 叠加具有不同元素数量的 geom_bar 和 geom_line 图?
How to overlay geom_bar and geom_line plots with different number of elements using ggplot2?
假设我有两个 data.frames 具有不同的数据但在相同的 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 是一个 data.frame 有 9 行,b 是一个 data.frame 有 3 行。
我使用 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 图?
尝试先合并数据集,然后绘图,如下所示:
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))
试试这个
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 以使它们相同。由于我不知道这两个 ys 之间的关系,所以我使用 y/max(y)
重新缩放了它们。这能解决您的问题吗?
假设我有两个 data.frames 具有不同的数据但在相同的 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 是一个 data.frame 有 9 行,b 是一个 data.frame 有 3 行。
我使用 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 图?
尝试先合并数据集,然后绘图,如下所示:
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))
试试这个
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 以使它们相同。由于我不知道这两个 ys 之间的关系,所以我使用 y/max(y)
重新缩放了它们。这能解决您的问题吗?