每行的折线图

时间:2014-12-09 15:28:11

标签: r plot

我正在尝试为我的数据框traff制作每行的折线图.x轴将是从2006年到2012年的年份。

最终结果应该是每行的单独图表。在下面的示例中,第一个图表代表第三行,第二个图表代表第二行(见下表): enter image description here

我知道如何找到每一行的最大值以获得最大y轴:

xaxis <- colnames (traff[,(3:10)])

但我正在努力为每一行制作一个循环并生成一个折线图。如您所见,每个端口(a,b和c)有三个类别(IntPass,Pass和Cruise)。

Port    Category    2006    2007    2008    2009    2010     2011    2012
a       IntPass     9046000 0       9579000 9683700 10404900 0       0
a       Pass        270000  260000  360000  360000  342000   385000  368000
a       Cruise      259     238     269     263     247      258     265
b       IntPass     8249304 8222336 8692362 9015726 9107665  9177075 9050424
b       Pass        0       272584  351267  437437  381141   407162  463770
b       Cruise      260     255     265     293     261      263     274
c       IntPass     6760000 6514294 7247366 7257646 7900000 8500000  8800000
c       Pass        305026  294738  377522  416605  392000  443000   442000
c       Cruise      289     268     298     305     279     293      294

3 个答案:

答案 0 :(得分:4)

您不应使用for循环将线条绘制到图表中。如果您的类别变量是一个因素,ggplot包会为您执行此操作。看看下面的代码:

library(reshape2) #install.packages("reshape2")
library(ggplot2) #install.packages("ggplot2")

#Import data into a Data frame
data <- c("
Port    Category    2006    2007    2008    2009    2010     2011    2012
a       IntPass     9046000 0       9579000 9683700 10404900 0       0
a       Pass        270000  260000  360000  360000  342000   385000  368000
a       Cruise      259     238     269     263     247      258     265
b       IntPass     8249304 8222336 8692362 9015726 9107665  9177075 9050424
b       Pass        0       272584  351267  437437  381141   407162  463770
b       Cruise      260     255     265     293     261      263     274
c       IntPass     6760000 6514294 7247366 7257646 7900000 8500000  8800000
c       Pass        305026  294738  377522  416605  392000  443000   442000
c       Cruise      289     268     298     305     279     293      294
")
traff <- read.table(text = data, header=TRUE)

#Reshape the data for ggplot
traff2 <- melt(traff,id=c("Port","Category"),variable.name = "Year")

#Remove the X in the Year column and convert it to number
traff2$Year <- as.numeric(gsub(pattern="X",replacement = "",x = as.character(traff2$Year)))

#The data is ready for ggplot
head(traff2)

#ggplot it...
ggplot(traff2, aes(x = Year, y = value, color = Port))+
facet_grid(facets = Category~., scales = "free_y")+
  geom_line()+theme_bw()

结果: enter image description here

答案 1 :(得分:1)

对于循环的每次迭代,您是否希望它们都在同一个图形或单独的图形上?

假设在同一个图表上,你会做这样的事情。

绘图函数每次都会生成一个新图形,因此您必须使用lines()函数添加到现有图形中。

# Make the initial plot
plot( 2006:2012, traff[1,3:ncol(traff)], type="l", col=1)

# Here is the loop where the rest is added
for (i in 2:nrow(traff)) { lines(2006:2012, traff[i,3:ncol(traff)], type="l", col=i)
                          }

如果需要,可以使用一些if或while语句在循环中添加初始绘图。

答案 2 :(得分:0)

如果我理解正确,可以使用matplot函数进行简单的解决方案:

matplot(t(traff[, -c(1,2)]), type="l")

如果您愿意,您只需将x轴的标签更改为年份名称即可。