使用 TikZ 创建 3D 热图密度图

使用 TikZ 创建 3D 热图密度图

我的问题非常类似“使用 PSTricks 或 TikZ 创建热图”,但这次是 3D 的。因此我有以下表格数据:

x   | y   | z   | value
1.2 | 1.3 | 1.4 | 1.20
0.2 | 0.3 | 0.4 | 3.20

...

利用这些数据,我想创建 3D 密度图或等值面图,如下所示:

期望结果

也许可以将不透明度作为值的函数。当然我知道解决方案会非常耗时,但我已经看到了类似的结果,而且看起来相当不错。

答案1

正如杰克在评论中所说,这可能超出了直接写入 TikZ 的范围,但如果您想要 TikZ 的其他一些好处,您可能仍然可以完成它。(例如,与其余文档一致的字体)

如果你已经有一些可以独立于 LaTeX 生成 3D 图的软件(例如 MATLAB 或 Mathematica),那么你可能需要查看是否有一个库可以将该软件中的绘图代码转换为可以嵌入到 LaTeX 中的 TikZ。以下是我所说的一些例子:

在外部执行并导入 TikZ 几乎肯定是可行的方法。这比尝试获得可行的结果要容易得多,最终结果也会好得多。

下面我给出了一个使用 R 的简短示例,说明我如何做到这一点。您不太可能直接使用我的解决方案,但它可能会让您了解我的意思,并可能为您指明正确的方向。


个人示例:

我经常使用 R 来绘制图表(R 是一种免费的统计编程语言),并且 R 有一个用于导出到 TikZ 的有用模块。然后可以将此 TikZ 代码加载到 LaTeX 文档中并像往常一样进行编译。

用于绘制三维轮廓图的 R 包是contour3d,以下是该文档页面中的一个示例:

require(tikzDevice)
require("misc3d")

tikz("isosurface.tex", width=5, height=5)

##################################################################
#                                                                #
# Example from the R documentation                               #
# http://rss.acs.unt.edu/Rdoc/library/misc3d/html/contour3d.html #
#                                                                #
##################################################################

nmix3 <- function(x, y, z, m, s) {
      0.4 * dnorm(x, m, s) * dnorm(y, m, s) * dnorm(z, m, s) +
      0.3 * dnorm(x, -m, s) * dnorm(y, -m, s) * dnorm(z, -m, s) +
      0.3 * dnorm(x, m, s) * dnorm(y, -1.5 * m, s) * dnorm(z, m, s)
  }
  f <- function(x,y,z) nmix3(x,y,z,.5,.5)
  g <- function(n = 40, k = 5, alo = 0.1, ahi = 0.5, cmap = heat.colors) {
      th <- seq(0.05, 0.2, len = k)
      col <- rev(cmap(length(th)))
      al <- seq(alo, ahi, len = length(th))
      x <- seq(-2, 2, len=n)
      contour3d(f,th,x,x,x,color=col,alpha=al)
      rgl.bg(col="white")
  }
  g(40,5)
  gs <- function(n = 40, k = 5, cmap = heat.colors, ...) {
      th <- seq(0.05, 0.2, len = k)
      col <- rev(cmap(length(th)))
      x <- seq(-2, 2, len=n)
      m <- function(x,y,z) x > .25 | y < -.3
      contour3d(f,th,x,x,x,color=col, mask = m, engine = "standard",
                scale = FALSE, ...)
      rgl.bg(col="white")
  }
  gs(40, 5, screen=list(z = 130, x = -80), color2 = "lightgray", cmap=rainbow)

### End of example

dev.off()

其中大部分只是绘制 3D 图,但顶部和底部的线条将绘制的输出转换为 TikZ,然后保存到isosurface.tex

一旦运行该脚本,我就可以\input将该文档放入另一个 LaTeX 文件中。例如:

\documentclass{article}

\usepackage{tikz}

\begin{document}

\input{isosurface.tex}

\end{document}

它看起来是这样的:

在此处输入图片描述

LaTeX 格式的 PDF 的渲染效果与原文十分吻合:

在此处输入图片描述

一些注意事项:

  • 对于 3D 图,相关的 TikZ 文件很大。大约 2.2 MB,比大多数 TikZ 文档大一个数量级。
  • 它会减慢你的速度。这个小例子增加了约 30 秒的编译时间。如果你有更复杂的代码,或者有很多代码,速度会明显变慢。你可能想考虑使用 TikZexternalize库之类的东西来避免最严重的性能损失。

如果你想使用 R,那么关于如何绘制图表的问题在这个 Stack Exchange 上是不相关的,但你可能需要转到交叉验证如果您需要帮助。有关 R 和数据可视化的主题更贴近主题。

相关内容