【问题标题】:R: graph multiple columns on one lineR:在一行上绘制多列
【发布时间】:2014-08-20 09:00:04
【问题描述】:

这看起来很简单,但我尝试了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 轴上绘制 12 个月的 20 条线的方法;这不是我想要的。我还需要每 12 个月标记一次年份,但我想我可以在解决这个问题后弄清楚这一点。

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

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

  • x 轴:10 组月份(1992-2001 年 1 月至 12 月,共 120 个月)。唯一的标签是年份,当然每 12 个月一次。

我知道我只是想错了,有人可以纠正我的头吗?

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

【问题讨论】:

  • 昨晚,idvar="Month" 抛出错误(抱歉无法重现); idvar=storms$Month 通过,没有错误。我认为他们在做同样的事情?今天早上,在idvar="Month" 出现了一轮错误后,我将那块代码全部做成了一行(有效),然后再次将其分解,idvar="Month" 有效,只是它没有删除前面的“X”列标题。不过,我得到了相同的图表。也许其他人有这个问题:试试,再试一次!

标签: r plot dataframe


【解决方案1】:

这是您要找的东西吗?如果我没记错的话,您可能需要重新排列您的数据框。你想让你的数据框更长而不是更宽。然后,您可以绘制一个图形。问题是你有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

【讨论】:

  • 两者都很好用,但这个更短,而且看起来更符合我的期望(尽管我的顾问会对颜色感到愤怒)。我最初并没有说条比线条更好,对于我的数据来说,它只是比线条提供了更多信息。
  • 如果您想选择自己的颜色,可以使用scale_fill_manual()。例如,你可以做这样的事情。 scale_fill_manual(values=c("black", "yellow", "green","black", "red", "blue","orange", "pink", "black","blue", "yellow", "black"))
  • 我花了一段时间才回到这一点。谢谢!如果其他人有这个问题,这里是超级具体的:cathy + scale_fill_manual(values=c("black","black","black","black", "black","black","black","black","black","black","black","black")) 我敢肯定有一个更简单的方法,但现在是凌晨 5 点,这段代码有效。摇滚伦敦,继续前进,芝加哥。
【解决方案2】:

这是一个使用基础 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)

结果:

【讨论】:

  • 它说我不应该这样做,但是......是的!最后,我不服了。我希望我上周问过。谢谢,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2020-04-13
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多