首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的ggtern等高线图

R中的ggtern等高线图
EN

Stack Overflow用户
提问于 2016-07-02 12:23:11
回答 2查看 1.8K关注 0票数 4

我有一个数据文件,它有足够的数据点来绘制三元图中的“热图”。(这不是真正的热图,只是一个有足够数据点的散点图)

代码语言:javascript
复制
library(ggtern)
library(reshape2)

N=90
trans.prob = as.matrix(read.table("./N90_p_0.350_eta_90_W12.dat",fill=TRUE))
colnames(trans.prob) = NULL

# flatten trans.prob for ternary plot
flattened.tb = melt(trans.prob,varnames = c("x","y"),value.name = "W12")
# delete rows with NA
flattened.tb = flattened.tb[complete.cases(flattened.tb),]
flattened.tb$x = (flattened.tb$x-1)/N
flattened.tb$y = (flattened.tb$y-1)/N
flattened.tb$z = 1 - flattened.tb$x - flattened.tb$y

ggtern(data = flattened.tb, aes(x=x,y=y,z=z)) +
  geom_point(size=1, aes(color=W12)) +
  theme_bw() +
  scale_color_gradient2(low = "green", mid = "yellow", high = "red")

我得到的是:

我想使用ggtern获得如下内容

我的问题是:如何使用ggtern获得类似于第二个图形的信息

编辑1:对文件名中的错误表示抱歉。我修正了文件名。数据文件包含了太多的数据点,我无法直接在这里粘贴它们。

第二个图形是由一个第三方Matlab软件包ternplot生成的。我想要一个三元等高线图,它有离散的线条,而不是我的第一个图形中的热图。具体来说,我想指定一个轮廓线的列表,比如W12=0.05,0.1,0.15,...。我和geom_density_terngeom_interpolate_tern一起玩了几个小时,但仍然不知道如何得到我想要的东西。

MATLAB代码是:

代码语言:javascript
复制
[HCl, Hha, cax] = terncontour(X,Y,1-X-Y,data,[0.01,0.1,0.2,0.3,0.4,0.5]); 

其中,X,Y,1-X-Y指定绘图上的坐标,data存储值,向量指定等值线的值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-05 01:58:07

WDG,我对ggtern做了一些小的修改,以便更好地处理这种类型的模型,它刚刚提交给CRAN,所以应该在第二天左右就可以使用了。在此期间,您可以从我的BitBucket帐户:https://bitbucket.org/nicholasehamilton/ggtern下载

无论如何,这是源代码,它将从ggtern版本2.1.2中运行。

我已经包含了下面的点(用一个轻微的alpha值),所以我们可以观察到插值几何有多有代表性:

代码语言:javascript
复制
library(ggtern)
library(reshape2)

N=90
trans.prob = as.matrix(read.table("~/Downloads/N90_p_0.350_eta_90_W12.dat",fill=TRUE))
colnames(trans.prob) = NULL

# flatten trans.prob for ternary plot
flattened.tb = melt(trans.prob,varnames = c("x","y"),value.name = "W12")
# delete rows with NA
flattened.tb   = flattened.tb[complete.cases(flattened.tb),]
flattened.tb$x = (flattened.tb$x-1)/N
flattened.tb$y = (flattened.tb$y-1)/N
flattened.tb$z = 1 - flattened.tb$x - flattened.tb$y

############### MODIFIED CODE BELOW ###############

#Remove the (trivially) Negative Concentrations
flattened.tb = subset(flattened.tb,z >= 0)

#Plot a series of plots in increasing polynomial degree
plots = lapply(seq(3,18,by=3),function(x){
  degree = x
  breaks = seq(0.025,0.575,length.out = 10)
  base   = ggtern(data = flattened.tb, aes(x=x,y=y,z=z)) +
    geom_point(size=1, aes(color=W12),alpha=0.05) +
    geom_interpolate_tern(aes(value=W12,color=..level..),
                          base = 'identity',method = glm,
                          formula = value ~ polym(x,y,degree = degree,raw=T),
                          n = 150, breaks = breaks) + 
    theme_bw() +
    theme_legend_position('topleft') + 
    scale_color_gradient2(low = "green", mid = "yellow", high = "red",
                          midpoint = mean(range(flattened.tb$W12)))+
    labs(title=sprintf("Polynomial Degree %s",degree))
  base
})

#Arrange the plots using grid.arrange
png("~/Desktop/output.png",width=700,height=900)
  grid.arrange(grobs = plots,ncol=2)
garbage <- dev.off()

这将产生以下输出:

为了生成一个更接近颜色和方向的图表作为matlab样例轮廓图,尝试如下:

代码语言:javascript
复制
plots = lapply(seq(3,18,by=3),function(x){
  degree = x
  breaks = seq(0.025,0.575,length.out = 10)
  base   = ggtern(data = flattened.tb, aes(x=z,y=y,z=x)) +
    geom_point(size=1, aes(color=W12),alpha=0.05) +
    geom_interpolate_tern(aes(value=W12,color=..level..),
                          base = 'identity',method = glm,
                          formula = value ~ polym(x,y,degree = degree,raw=T),
                          n = 150, breaks = breaks) + 
    theme_bw() +
    theme_legend_position('topleft') + 
    scale_color_gradient2(low = "darkblue", mid = "green", high = "darkred",
                          midpoint = mean(range(flattened.tb$W12)))+
    labs(title=sprintf("Polynomial Degree %s",degree))
  base
})
png("~/Desktop/output2.png",width=700,height=900)
  grid.arrange(grobs = plots,ncol=2)
garbage <- dev.off()

这将产生以下输出:

票数 4
EN

Stack Overflow用户

发布于 2016-07-02 14:09:25

这看起来不像你的例子那么漂亮,但希望它能让你更接近你想要达到的目标:

代码语言:javascript
复制
flattened.tb$a <- 0
flattened.tb$a[flattened.tb$W12 > 0.04 & flattened.tb$W12 < .05] <- 1

flattened.tb$b <- 0
flattened.tb$b[flattened.tb$W12 > 0.05 & flattened.tb$W12 < .06] <- 1

flattened.tb$c <- 0
flattened.tb$c[flattened.tb$W12 > 0.07 & flattened.tb$W12 < .08] <- 1

flattened.tb$d <- 0
flattened.tb$d[flattened.tb$W12 > 0.09 & flattened.tb$W12 < .1] <- 1


options("tern.discard.external" = F)   
ggtern(data = flattened.tb, aes(x, y, z)) +
  geom_line(aes(a),color="red",linetype=1) + 
  geom_line(aes(b),color="blue",linetype=1) +
  geom_line(aes(c),color="yellow",linetype=1) +
  geom_line(aes(d),color="green",linetype=1) +
  theme_bw()

阴谋只是需要精心策划。我不能说哪个数据区域最适合绘图。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38160110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档