r使用ggplot2将时间序列绘制成分组的渐变颜色

时间:2014-01-22 05:39:34

标签: r ggplot2

我的数据(结果)如下所示:

1           2           3           4           5           6           7           8           9           10          subsites  sites
0.3207679   0.5831471   0.8062113   1.000211    1.17139     1.324008    1.461217    1.585459    1.698675    1.802433    1         1
0.5519985   0.9743214   1.3157794   1.600919    1.84415     2.054966    2.240087    2.40447     2.551864    2.68515     2         1
0.7527316   1.2980157   1.7215702   2.064576    2.350302    2.59345     2.803964    2.988854    3.153205    3.300787    3         1
0.9410568   1.5892921   2.0769323   2.463184    2.779815    3.046059    3.27444     3.473503    3.64928     3.806147    1         2
1.106054    1.834043    2.3672041   2.782478    3.119263    3.400492    3.640566    3.849008    4.032385    4.195388    2         2
1.262294    2.061886    2.6353753   3.0767      3.431931    3.72695     3.977544    4.19394     4.383119    4.550062    3         2

我想用渐变的不同颜色绘制,每个站点中的所有子站点,例如站点1将具有子站点1深蓝色,子站点2,浅蓝色等。站点2将具有深绿色用于子站点1并且更轻绿色用于子网站2等。我尝试使用reshapeggplot2,但图表甚至没有采用我想要的形式,我无法弄清楚原因。

我试图获得一系列像第一张图像一样的曲线,但输出却大不相同(第二张图)。 expected output

actual output

这是我的代码:

meltdf <- melt(results,id.vars=c("sites","subsites"), measure.vars=c(1:10), value.name="rawdata",variable.name="Days")
ggplot(meltdf,aes(x=Days,y=rawdata,colour=subsites,group=sites)) + geom_line()

有人可以告诉我如何融化我的数据,以便生成我需要的图表以及如何在每个组中制作渐变色? 非常感谢。

1 个答案:

答案 0 :(得分:3)

这似乎很接近。

library(ggplot2)
library(reshape2)
library(RColorBrewer)    # for brewer.pal(...)

df <- cbind(id=1:nrow(df),df)
gg <- melt(df, id=c("id","subsites","sites"))
gg$variable=as.numeric(substr(gg$variable,2,4))
ggplot(gg)+
  geom_line(aes(x=variable,y=value ,color=factor(id)),size=1.5)+
  scale_color_manual("Site",values=c(rev(brewer.pal(3,"Blues")),
                                     rev(brewer.pal(3,"Greens"))), 
                     breaks=c(1,4), labels=unique(gg$sites))+
  labs(x="",y="")+
  theme_bw()

df是您提问的数据(2个网站,3个子网站)。

基本想法是在您的data.frame中添加id列,然后融化,然后使用颜色美学对id进行分组。现在你有六种颜色。为了使网站1的蓝色和网站2的绿色,我们使用scale_color_manual(...)使用前三个的蓝调调色板和最后三个的绿色调色板创建颜色值的自定义列表。然后我们设置图例breaks=c(1,4),以便图例显示最暗的蓝色/绿色。调色板本身来自www.colorbrewer.org,在包RColorBrewer中的R中实现。

编辑 [在评论中对OP请求的回应。

使用完整(或更完整)的数据集,这个问题说明了两个关键原则:

  1. 有了R,几乎任何事都有可能。
  2. 只是因为有可能并不意味着你应该这样做。
  3. 本质上,OP有4个站点的response ~ time数据,每个站点有7到10个子站点;共有36个时间序列。 OP希望在一个图上显示所有这些,并希望通过让每个站点与不同的基色相关来区分它们(例如,站点1为蓝色,站点2为绿色等),并且通过颜色渐变来区分子站点从黑暗到光明的每种颜色。所以,(site 1, subsite 1)=dark blue(site 1, subsite 10)=light blue

    为实现这一目标,我们需要上述方法的通用版本。每条曲线都有自己的颜色(36种颜色)。然后,我们使用4个不同的斜坡创建一个手动色标,每个斜坡都有正确的颜色。代码如下,再次假设OP的数据集存储在data.frame df中。

    library(ggplot2)
    library(reshape2)
    library(RColorBrewer)
    library(colorRamps)
    
    df <- read.csv("subset_for_dropbox.csv")
    df <- cbind(id=1:nrow(df),df)
    sites         <- aggregate(subsites~Sites,df,length)  # number of subsite for each site
    sites$brks    <- c(1,1 + cumsum(sites$subsites)[1:(nrow(sites)-1)])
    site.palettes <- c("Blues","Greens","Reds","Purples")
    colors <- unlist(apply(sites,1,function(x){colorRampPalette(rev(brewer.pal(9,site.palettes[x[1]]))[1:6])(x[2])}))
    gg <- melt(df, id=c("id","subsites","Sites"))
    gg$variable=as.numeric(substr(gg$variable,4,6))
    # all curves on one plot
    ggplot(gg)+
      geom_line(aes(x=variable,y=value ,color=factor(id)),size=1.5)+
      scale_color_manual("Site",values=colors, 
                         breaks=sites$brks, labels=unique(gg$Sites))+
      labs(x="",y="")+ xlim(0,10) +
      theme_bw()
    

    显然,这不是一种可视化数据的好方法。更好的方法是使用方面:

    # faceted, color identifies site, color ramp identifies subsite
    ggplot(gg)+
      geom_line(aes(x=variable,y=value ,color=factor(id)),size=1.5)+
      scale_color_manual("Site",values=colors, 
                         breaks=sites$brks, labels=unique(gg$Sites))+
      labs(x="",y="")+ xlim(0,10) +
      theme_bw()+
      facet_wrap(~Sites,nrow=1)
    

    此图的问题在于您不知道哪个子网站使用哪种颜色(子网站1最暗,或子网站10?)。所以一个不那么丰富多彩但更好的方法是使用facet来识别网站,并使用颜色渐变来识别子网站:

    # faceted, color ramp identifies subsite
    ggplot(gg)+
      geom_line(aes(x=variable,y=value ,color=factor(subsites)),size=1.5)+
      scale_color_manual("subsite",values=colorRampPalette(rev(brewer.pal(9,"Blues")[4:9]))(max(sites$subsites)))+
      labs(x="",y="")+ xlim(0,10) +
      theme_bw()+
      facet_wrap(~Sites,nrow=1)