R:在一行上绘制多个列

时间:2014-08-20 09:00:04

标签: r plot dataframe

这看起来很简单,但我尝试了matplotggplot2,常规旧plot的多种变体......我无法做任何我需要的事情。

我有一个巨大的年,月和观察数据框。我将其简化为每月每月的观察次数,见下文。我不确定为什么它会在每个列标题前面加上“X”,但是如果它不会影响代码,那么我现在并不在意。

head(storms)

X Month X1992 X1993 X1994 
1 1     1     2     1    
2 2     2     4     1    
3 3     3    26    10   
4 4     4    47    26 
5 5     5   969   615

完整(简化)集合是10列年份(1992-2001),每年有12个月/行总计(1992年1月1次风暴,1993年3月26次风暴......)。我只需要将这些全部绘制在120个月的x轴上,即y轴每月的观察数。它可以是一条线或条形或垂直线。我已经看到很多方法在x轴上绘制了20行12个月的绘制线;那是我想要的。我还需要每12个月标注一次这些年份,但我想我可以解决这个问题。

换句话说(如果以前不是这样,我希望这更清楚):

  • y轴:风暴次数ylim=c(0-1000)

  • x轴:10套月(1992年1月至12月,共计120个月)。唯一的标签是年,每12个月一次。

我知道我只是想错了,有人可以直截了当地说出来吗?

(第一篇文章;如果我没有正确格式化或查询,请告诉我。)

2 个答案:

答案 0 :(得分:1)

enter image description here这是你要找的东西吗?如果我没弄错,您可能需要重新排列数据框。您希望使数据框架更长而不是更宽。然后,你可以画一个数字。事情是你有120个月。所以你可能需要考虑情节空间问题。但至少这个例子让你前进。我希望这会对你有所帮助。

library(tidyr)
library(ggplot2)

# Create a sample data
month <- rep(c(1:12), each = 1, times = 2)
nintytwo <-  runif(24, 0, 20)
nintythree <-  runif(24, 0, 20)

# Crate a data frame
ana <- data.frame(month, nintytwo, nintythree)

# Make the data longer rather than wider.
bob <- gather(ana, year, value, -month)
bob$month <- as.factor(bob$month)

# Draw a firure
cathy <- ggplot(bob, aes(x= year,y = value, fill = month)) + geom_bar(stat="identity", position="dodge")
cathy

答案 1 :(得分:1)

以下是使用基数R的示例:

# create an example data
set.seed(123)
df <- data.frame(Month=1:12)
for(y in 1992:2001){
  tmp <- data.frame(X=as.integer(abs(rnorm(12,mean=2,sd=10))))
  colnames(tmp) <- paste("X",y,sep="")
  df <- cbind(df,tmp)
}

# reshape to long format (one column with n.of storms, and period columns)
long <- reshape(df[,-1], idvar="Month", ids=df$Month, 
        times=names(df[,-1]), timevar="Year",
        varying = list(names(df[,-1])), 
        direction = "long",v.names="Storms")

# remove the "X" from the year
long$Year <- substr(long$Year,2,nchar(long$Year))

nYears <- length(unique(long$Year))

# plot the line
plot(x=1:nrow(long),y=long$Storms,type="l",
     xaxt="n",main="Monthly Storms",
     xlab="Period",ylab="Storms",col="RoyalBlue")

# add custom labels
axis(1,at=((1:nYears)*12)-6,labels=unique(long$Year))

# add vertical lines
abline(v=c(0.5,((1:nYears)*12)+0.5),col="Gray80",lty=2)

结果:

enter image description here