Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ggplot2:条形图上覆盖的线(来自单独的数据帧)_R_Ggplot2 - Fatal编程技术网

R ggplot2:条形图上覆盖的线(来自单独的数据帧)

R ggplot2:条形图上覆盖的线(来自单独的数据帧),r,ggplot2,R,Ggplot2,我有一个来自一组月度数据的条形图,我想把来自另一组月度数据的数据以直线的形式叠加在上面。以下是我的数据中的一个简化示例。第二个数据集不是第一个数据集的简单操作: library(reshape2) library(ggplot2) test<-abs(rnorm(12)*1000) test<-rbind(test, test+500) colnames(test)<-month.abb[seq(1:12)] rownames(test)<-c("first", "se

我有一个来自一组月度数据的条形图,我想把来自另一组月度数据的数据以直线的形式叠加在上面。以下是我的数据中的一个简化示例。第二个数据集不是第一个数据集的简单操作:

library(reshape2)
library(ggplot2)

test<-abs(rnorm(12)*1000)
test<-rbind(test, test+500)
colnames(test)<-month.abb[seq(1:12)]
rownames(test)<-c("first", "second")
otherTest<-apply(test, 2, mean)
test<-melt(test)
otherTest<-as.data.frame(otherTest)

p<-ggplot(test, aes(x=Var2, y=value,  fill=Var1, order=-as.numeric(Var2))) + geom_bar(stat="identity")+
    theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) +
    ggtitle("Test Graph") +
    scale_fill_manual(values = c(rgb(1,1,1), rgb(.9,0,0))) + 
    guides(fill=FALSE) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

此外,如果有人知道我如何使酒吧在对方面前,使你看到的是一个红色的酒吧高度500,我将感谢任何建议。我知道我可以把矩阵的两条线之间的差值作为一个堆叠的条,但我认为可能有一种简单的方法可以将两条条条放在x轴上,红色前面是白色。谢谢

这里有几个问题要处理

直接回答您的问题,如果您不通过aes提供映射。。。在geom调用中,如geom_line…,则映射将来自ggplot。ggplot指定x=Var2,y=value,fill=Var1。。。。所有这些变量名都必须存在于您的数据框otherTest中才能正常工作,而它们现在不存在

所以,您需要确保这些变量名存在于otherTest中,或者在geom_行中单独指定映射。您可能想了解一下这些分层选项是如何工作的。例如,这涉及到一些细节

如果您选择第一个选项,还需要考虑一些其他问题:

Var2是两个数据帧中具有相同级别的因子吗?也许应该是这样。 要按原样使用geom_线,可能需要添加group=1。看见 还有一些,但这里有一个简单的例子,说明你可能会做什么:

library(reshape2)
library(ggplot2)

test <- abs(rnorm(12)*1000)
test <- rbind(test, test+500)
colnames(test) <- month.abb[seq(1:12)]
rownames(test) <- c("first", "second")
otherTest <- apply(test, 2, mean)
test <- melt(test)

otherTest <- data.frame(
  Var2 = names(otherTest),
  value = otherTest
)

otherTest$Var2 = factor(otherTest$Var2, levels = levels(test$Var2))

ggplot(test, aes(x = Var2, y = value, group = 1)) +
  geom_bar(aes(fill = Var1), stat="identity") +
  geom_line(data = otherTest)

这很有效,谢谢!为什么您需要一条包含Var2的线路?我把它拿了出来,它看起来仍然很好用。还有,你有没有想过如何把一根杆放在另一根杆的前面,而不是叠在一起?我用因子来确定顺序。使用字符串将为您创建我希望避免的顺序。如果在每一条前面都重新加上一条,您可以尝试添加position=identity
library(reshape2)
library(ggplot2)

test <- abs(rnorm(12)*1000)
test <- rbind(test, test+500)
colnames(test) <- month.abb[seq(1:12)]
rownames(test) <- c("first", "second")
otherTest <- apply(test, 2, mean)
test <- melt(test)

otherTest <- data.frame(
  Var2 = names(otherTest),
  value = otherTest
)

otherTest$Var2 = factor(otherTest$Var2, levels = levels(test$Var2))

ggplot(test, aes(x = Var2, y = value, group = 1)) +
  geom_bar(aes(fill = Var1), stat="identity") +
  geom_line(data = otherTest)