在一个图表中绘制多条线

24
尝试使用ggplot在一个图表中绘制多条线,但不确定如何在我的数据集中实现。不确定我是否需要更改数据结构(转置?)
数据长这样:
Company   2011   2013
Company1  300    350
Company2  320    430
Company3  310    420

我也尝试了转置:

Year   Company1  Company2  Company3
2011   300       320       310 
2013   350       430       420

我可以使用以下方法之一绘制其中一个值:

ggplot(data=df, aes(x=Year, y=Company1)) + geom_line(colour="red") + geom_point(colour="red", size=4, shape=21, fill="white")

但我不知道如何将所有公司合并,因为我没有对象“Company”可以进行分组。有什么建议吗?

3个回答

56

如果要使用 ggplot2,您应将数据转换为长格式(即熔融格式):

library("reshape2")
mdf <- melt(mdf, id.vars="Company", value.name="value", variable.name="Year")

然后你需要使用 aes( ... , group = Company ) 将它们分组:

ggplot(data=mdf, aes(x=Year, y=value, group = Company, colour = Company)) +
    geom_line() +
    geom_point( size=4, shape=21, fill="white")

输入图像描述


df 不会覆盖 stats::dfR 通过上下文知道你正在引用哪一个。自己试试:df <- data.frame(A=1:10) ; df(df$A, 1, 5) - Señor O
1
@SeñorO 这是我已经多次阅读过的内容,但你是对的,它没有被覆盖。因此作为对自己的提醒:在没有亲自检查之前不要将信息传递给其他人 :-) 我编辑了我的问题。 - Beasterfield
1
避免使用 df 作为变量名仍然是一个好主意 - 如果你经常使用它(就像我一样,违背了自己的建议),有时当你忘记定义它时,你会得到加密的错误信息“Error in df$foo : object of type 'closure' is not subsettable”,而不是更好的错误信息,比如“Error: object 'df' not found”。 - Ken Williams

18

与ggplot2所需的极其复杂的数据结构不同,您可以使用本地R函数:

tab<-read.delim(text="
Company 2011 2013
Company1 300 350
Company2 320 430
Company3 310 420
",as.is=TRUE,sep=" ",row.names=1)

tab<-t(tab)

plot(tab[,1],type="b",ylim=c(min(tab),max(tab)),col="red",lty=1,ylab="Value",lwd=2,xlab="Year",xaxt="n")
lines(tab[,2],type="b",col="black",lty=2,lwd=2)
lines(tab[,3],type="b",col="blue",lty=3,lwd=2)
grid()
legend("topleft",legend=colnames(tab),lty=c(1,2,3),col=c("red","black","blue"),bg="white",lwd=2)
axis(1,at=c(1:nrow(tab)),labels=rownames(tab))

R multiple lines plot


4
“过于复杂的数据结构”这个说法有点过于强烈了。我发现以这种形式使用数据非常有帮助。 - Epimetheus
2
感谢您对“非常复杂的数据结构”的评价!非常感激! - Michal J Figurski

1

@Federico Giorgi的回答非常好,对我很有帮助。因此,为了从单个数据集的数据中产生同一图中的多条线,我使用了for循环。也可以添加图例。

plot(tab[,1],type="b",col="red",lty=1,lwd=2, ylim=c( min( tab, na.rm=T ),max( tab, na.rm=T ) )  )
for( i in 1:length( tab )) { [enter image description here][1]
lines(tab[,i],type="b",col=i,lty=1,lwd=2)
  } 
axis(1,at=c(1:nrow(tab)),labels=rownames(tab))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接