這似乎接近。

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在評論請求。
有了完整的(或更完整)的數據集,這個問題說明了兩個重要原則:
- 隨着R,任何事情都是可能的。
- 僅僅因爲一些可能並不意味着你應該這樣做。
本質上,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)

感謝很多關於這一點,並回答如此迅速。我有一些問題。我正在嘗試將其應用於一個更大的數據集:你能解釋一下'gg $ variable = as.numeric(substr(gg $ variable,2,4))'行嗎?當我在更大的數據集上運行它時,它會在此列中生成許多NA,然後再轉到0和1s以及2s和3s等字符串,然後返回到NA。我也有不同的值長度,所以我可以使用像'length()'來設置顏色數量? – user3122022
最好的辦法是提供一個鏈接到您的數據。直接回答:(1)當我讀取你的樣本數據時,我得到一個data.frame,列名爲'X1,X2,... X10,sites,subsites'。因此,在熔化(...)後,'gg $ variable'列具有「X1」,「X2」等。上面的語句剝離了「X」並將剩下的數字轉換爲數字。在創建後立即查看「gg」中的內容。 (2)顏色的總數等於您的df中的行數,這又是網站和子網站的總體組合。 – jlhoward
謝謝,我的意思是我有不同數量的子網站在每個網站,當我輸入不同的數值= c(rev(brewer.pal(...我得到的錯誤消息'錯誤data.frame(值= scale_map(scale,breaks),labels = I(scale_labels(scale)),::arguments暗含不同的行數:2,0' – user3122022