2015-07-22 29 views
2

我使用R的ggtern軟件包來創建一個可愛的三元圖,它顯示了我用仿真模型生成的一些數據。我會在這篇文章中附上一個情節,告訴你情節是怎樣的,但是我沒有足夠的聲望去做這件事。相反,我會粘貼下面的代碼,可以複製我的情節的所有基本功能。作爲一個免責聲明,我對ggplot圖形非常新,所以我確信我的代碼很混亂。我的問題很簡單(我認爲) - 我如何修改我的代碼以平滑「水果集」(make1df$Value)的值,從而揭示數據中的整體模式/趨勢?我甚至想到即使加權平均值也很簡單,所有鄰近點甚至可以滿足要求。到目前爲止,我只能弄清楚如何平滑點的密度而不是與這些點相關的值(使用像stat_smooth2d()之類的函數)。如何通過點值而不是R點密度來平滑三元圖?

請記住,我在下面提供的是「假數據」這不是我如何生成我實際打算繪製的數據。下面使用的compositions函數在partitions包中。

代碼:

library(plyr) # for rename 
library(ggtern) # for ggtern 
library(partitions) # for compositions 
make1 = as.matrix(compositions(50, 3, include.zero=TRUE)) 
make1 = t(make1) 
make1df = as.data.frame(make1) 
make1df = rename(make1df, c("V1"="H", "V2"="B", "V3"="S")) 
seq1 = seq(from=0.24, to=0.41, length=1326) 
make1df$Value = rep(0, 1326) 
for (i in 1:1326) { 
    make1df$Value[i] = seq1[i] + rnorm(1, 0, 0.03) 
} 

ggtern(make1df, aes(H, B, S)) + 
    geom_point(aes(colour=make1df$Value), size=4.5) + 
    scale_colour_gradient(low = "pink", high = "darkblue") + 
    theme_bw() + 
    theme(axis.tern.text=element_text(size=24), 
     axis.tern.showtitles=FALSE, 
     axis.tern.arrow.text=element_text(size=22), 
     axis.tern.arrow=element_line(size=1.5, color="black"), 
     axis.tern.vshift=unit(3, "line"), 
     legend.title = element_text(size=24), 
     legend.text = element_text(size = 24), 
     legend.key.size = unit(3.5, "lines")) + 
    labs(x = "% HONEY BEES",y = "% BUMBLE BEES", z = "% SMALL BEES", 
     colour="MEAN \nFRUIT SET") 

enter image description here

+0

我相信你必須自己計算加權平均數,*之前繪製。如果一個點有座標(h,b,s),那麼鄰居的座標是什麼? –

回答

1

我相信你將不得不計算出你的加權平均ggtern通話以外的第一。

你將不得不適當地計算你的平均值。 在這裏,我只是假設(可能是不正確的,三元座標做我的頭!):

  • (h, s, b)鄰居們都(h, s +-1, b -+1)(h +-1, s -+1, b)(h +-1, s, b -+1)(其中+--+是相反的順序,因此,如果它的s+1那麼它必須是b-1,這樣的座標都加相同的恆定。
  • make1df中有有效的三元座標(即H+S+B是恆定的所有座標)
  • 加權平均值被接收在(h, s, b)加上其先前定義的鄰居。
  • 請注意,如果您(h, s, b)值是連續的(例如像(.5, .5, 49)事情都是可能的),「鄰家」以前定義是(h, s, b)

「距離1內的」所有點讓我再次證明三元座標做提我的頭,因此您可能需要相應地調整上面的定義。

因此,首先添加一列wAvg我們在哪裏查找每個座標的鄰居並計算平均值Valueabs(H-h) <= 1等是找到(h,s,b)的距離1內的座標的技巧/速記。 Value[...]獲取那些鄰居的Valuesmean計算平均值。 mapply只是確保我們爲每一行都做到這一點。我在這裏使用mutate的唯一原因是爲了節省很多make1df$

# calculate avg 
make1df <- mutate(make1df, wAvg=mapply(function (h, b, s) { 
    # includes (h,b,s) & its neighbours 
    mean(Value[abs(H-h)<= 1 & abs(S-s) <= 1 & abs(B-b) <= 1]) 
}, H, B, S)) 

然後你做你的情節,與wAvg爲您colour而非Value。 (注意:你可以做aes(colour=wAvg)而非aes(colour=make1df$wAvg)):

ggtern(make1df, aes(H, B, S)) + 
    geom_point(aes(colour=wAvg), size=4.5) + 
    scale_colour_gradient(low = "pink", high = "darkblue") + 
    theme_bw() + 
    theme(axis.tern.text=element_text(size=24), 
     axis.tern.showtitles=FALSE, 
     axis.tern.arrow.text=element_text(size=22), 
     axis.tern.arrow=element_line(size=1.5, color="black"), 
     axis.tern.vshift=unit(3, "line"), 
     legend.title = element_text(size=24), 
     legend.text = element_text(size = 24), 
     legend.key.size = unit(3.5, "lines")) + 
    labs(x = "% HONEY BEES",y = "% BUMBLE BEES", z = "% SMALL BEES", 
     colour="MEAN \nFRUIT SET") 

enter image description here

如果你想增加「街坊」半徑你只需改變1到新的半徑。

+0

讓我看看我是否可以回答我自己的問題:'mutate'只是一個更強大的'變換' - 它以某種特定的方式重新創建一個對象。在這種情況下,它只是在其中創建一個新的命名列('wAvg')。 'mapply'是一個更具體的'apply',因爲它將一個指定的函數(在這種情況下爲'mean')應用到一個對象的所有相關條目。 'h','b'和's'實際上是指定的,它們是作爲參數提供給原始'H','B'和'S'向量形式的mutate,對'mutate'的調用。 – Bajcz

+1

突變和轉換都將列添加到數據框,但mutate可讓您使用已在後續定義中創建的列。例如'mutate(iris,x = 1,y = x + 1)'工作,但'transform'在創建'y'列時將無法找到'x'。該幫助表示有時候mutate會更快,所以我一直使用它。 'apply'與'mapply'完全不同。 'apply'適用於2D事物(對每列或每行應用FUN)。 'mapply'就像'sapply'一樣,但是你有多個你想要引導的參數。指定的函數不是「平均值」;它是'函數(h,b,s){...}'。 –

+0

你實際上不需要使用'mutate':你可以用'make1df $ H'等來代替'H'來執行'make1df $ wAvg < - mapply(....)';我只是使用'mutate',所以我可以放棄所有'make1df $'。 –

相關問題