2014-01-22 163 views
2

我的數據(結果)團體看起來是這樣的:[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() 

可能有人請告訴我如何融化我的數據,以便生成我需要的圖形,以及如何使各組內畢業的顏色? 非常感謝。

回答

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子網站)。

最基本的想法是將id列添加到您的data.frame中,然後融合,然後使用顏色美學對id進行分組。現在你有六種顏色。爲了使它們成爲站點1的藍色和站點2的綠色,我們使用scale_color_manual(...)來使用前三個藍色調色板和最後三個綠色調色板來創建顏色值的自定義列表。然後我們設置圖例breaks=c(1,4),以便圖例顯示最黑暗的藍/綠。調色板本身來自www.colorbrewer.org,作爲R中包RColorBrewer實現。

編輯 [迴應OP在評論請求。

有了完整的(或更完整)的數據集,這個問題說明了兩個重要原則:

  1. 隨着R,任何事情都是可能的。
  2. 僅僅因爲一些可能並不意味着你應該這樣做。

本質上,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?)。因此,一個多彩的少,但更好的方法是使用方面來識別網站和顏色漸變,以確定子網站:

# 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) 

+0

感謝很多關於這一點,並回答如此迅速。我有一些問題。我正在嘗試將其應用於一個更大的數據集:你能解釋一下'gg $ variable = as.numeric(substr(gg $ variable,2,4))'行嗎?當我在更大的數據集上運行它時,它會在此列中生成許多NA,然後再轉到0和1s以及2s和3s等字符串,然後返回到NA。我也有不同的值長度,所以我可以使用像'length()'來設置顏色數量? – user3122022

+0

最好的辦法是提供一個鏈接到您的數據。直接回答:(1)當我讀取你的樣本數據時,我得到一個data.frame,列名爲'X1,X2,... X10,sites,subsites'。因此,在熔化(...)後,'gg $ variable'列具有「X1」,「X2」等。上面的語句剝離了「X」並將剩下的數字轉換爲數字。在創建後立即查看「gg」中的內容。 (2)顏色的總數等於您的df中的行數,這又是網站和子網站的總體組合。 – jlhoward

+0

謝謝,我的意思是我有不同數量的子網站在每個網站,當我輸入不同的數值= c(rev(brewer.pal(...我得到的錯誤消息'錯誤data.frame(值= scale_map(scale,breaks),labels = I(scale_labels(scale)),::arguments暗含不同的行數:2,0' – user3122022