【问题标题】:How do you create ternary heatmap plots in R?如何在 R 中创建三元热图?
【发布时间】:2021-12-12 04:40:21
【问题描述】:

我想制作一个三角形图来表示XYZ 因子的所有可能组合的响应面,三角形内的梯度区域表示响应变量Gi。这些点代表数据框dtXYZ 的十种组合。 Gi 和 (X, Y, Z) 之间的相关性定义为mdl <- lm (Gi ~ X*Y*Z)。这是数据和我尝试过的:

X <- rep(c(.45,.4,.55,.4,.43,.5,.43,.5,.43,.48), each = 3)
Y <- rep(c(.15, .12,.22,.14,.14,.19,.12, .17,.17,.12 ), each = 3)
Z <- rep(c(.15,.22,.12,.12,.19,.14,.14,.17,.12,.17), each = 3)
Gi <- c(353,381,320,312,335,265,394,350,374,320,299,316,300,304,295,360,331,395,351,280,342,299,303,279,374,364,419,306,290,315)

dt <- data.frame (X, Y, Z, Gi)
ggtern(data = dt, aes(x = X, y = Y, z = Z, value = Gi)) +
  stat_interpolate_tern(geom="polygon",
                        formula = value ~ x+y, 
                        method = lm,
                        aes(fill = ..level..), expand = 1) +
  scale_fill_gradient(low="green", high="blue") +
  geom_point (fill = "white", size = 3, shape = 21, color = "white") +
  theme_gray () +
  theme ( tern.axis.arrow.show = T)

但是,输出不是我想要的。我发现了一个使用 Python 的三元图热图的令人兴奋的例子,这正是我想要的。但是,我只熟悉 R,我想做类似的东西。我怎么能在 R 中做到这一点?

请找到 link 以获得启发我的 Python 代码。

【问题讨论】:

  • 我建议查看 ggtern 包作为在 R 中制作三元图的好方法。
  • 嗨黄乐。答案是“是”——我们可以帮助您将代码翻译成 R。您在自己的尝试中遇到了什么问题?请记住,Stack Overflow 是一个问答网站,人们可以在这里搜索特定编码问题的答案 - 它不是针对单个项目的定制代码编写服务。
  • 亲爱的@Allan,感谢您的善意提醒!正如对 Michael Shomsky 的回答中提到的,我研究了 ggtern 并进行了大量搜索以制作这样的情节。我被代码下的原理卡住了,想理解它,并且可以用我自己的数据在 R 中重现。如果社区不提供编码服务,请帮我理解代码里面的原理。谢谢和问候!
  • 既然有一个示例和一个特定问题,我将投票重新开放,但您应该准确说明是什么让您的代码与您想要的不同

标签: python r ternary


【解决方案1】:

有以下R项目可以制作三元图:https://cran.r-project.org/web/packages/Ternary/vignettes/Ternary.html

可能会提出不同的问题,例如“是否有一个 R 库可以帮助我像这个 python 库一样进行绘图?”会受到更好的欢迎,因为将库从一种语言转换为另一种语言很费力。

【讨论】:

  • 感谢您的回答,我花了三天时间使用 ggtern 和大量搜索,并处理我的数据以制作这样的情节,但它没有奏效。不是我懒于自学。只是我无法弄清楚给出链接中的任务背后的原理。我想从示例中了解如何根据三个参数 x、y 和 z 计算/转换响应变量的原理。我相信这也是学习新事物的一种方式,不是吗?值得向社区寻求帮助吗?谢谢!
  • 是的,通过分享不起作用的内容来重新表述问题是获得问题帮助的最佳方式。我建议做两件事之一:1.) 用代码和一些示例数据分享你的非工作 ggtern 图,让社区提供帮助.. 2.) 分享你在尝试解释 python 示例并查看社区的探索可以帮忙。
  • 如果您想了解将 3 路混合数据映射到三元坐标背后的数学原理,维基百科文章对此进行了解释:en.wikipedia.org/wiki/Ternary_plot#Plotting_a_ternary_plot。如果 a 在原点,b 在 (1,0),c 在 (0.5, 0.877),则 x = 0.5 * (2b+c)/total, y = (sqrt(3)/2) * c/total,查看图表并考虑几何形状可能更有意义。
  • 这个问题现在已经结束,但我可以在 cmets 中提供更多示例。这里有一些有用的库和要绘制的示例数据:library(tidyverse) set.seed(0); df &lt;- data.frame(a = runif(20, 0, 1), b = runif(20, 0, 1), c = runif(20, 0, 1)) %&gt;% mutate(across(a:c, ~round(.x, 2))); edges &lt;- data.frame(x = c(0, 1, 0.5, 0), y = c(0, 0, sqrt(3)/2, 0))
  • 这里有一个小函数,可以使用上面维基百科文章中使用的 a/b/c 顺序获取具有 a、b、c 列的数据框并将它们转换为 x 和 y。 ternary_translate &lt;- function(df) { df %&gt;% mutate(total = a + b + c, x = 0.5 * (2*b + c) / total, y = sqrt(3)/2 * c / total) }
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2014-06-19
相关资源
最近更新 更多