2015-07-22 24 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 $'。 –

相关问题