【问题标题】:How to draw a colorbar in rgl?如何在 rgl 中绘制颜色条?
【发布时间】:2020-02-20 21:11:41
【问题描述】:

我在rgl 中绘制了一个网格来可视化上面的数据。即,网格具有源自将颜色图应用于其数据的颜色(每个顶点处的一个标量值)。下面是一个包含一个面的网格的最小示例:

library(rgl);
library(squash);

# create a mesh
vertices <- c( 
    -1.0, -1.0, 0, 1.0,
    1.0, -1.0, 0, 1.0,
    1.0,  1.0, 0, 1.0,
    -1.0,  1.0, 0, 1.0
)
indices <- c( 1, 2, 3, 4 )

# add a data value for each vertex
morph_data = rnorm(length(indices), mean = 3, sd = 1)

# create colors from values by applying a colormap
col = squash::cmap(morph_data, map = squash::makecmap(morph_data, colFn = squash::jet));

# plot
open3d()  
shade3d( qmesh3d(vertices, indices), col=col )

如何在 rgl 中为该图添加颜色条?

this example picture from octave.sourceforge.io 的右侧显示了我对 colorbar 的确切含义的示例。

【问题讨论】:

  • 请注意 - rgl 对象上的颜色不仅会随着网格上的值而变化,还会随着它与照明/阴影的交互方式而变化。这些又随着对象旋转而变化。因此,网格上的颜色不会与颜色条上的颜色完全对应。为此,您将需要一个非常独特的调色板并愿意将颜色条视为粗略的近似值
  • @dww 感谢您的信息。我知道这一点,这对我来说绝对没问题。我使用的网格有数千个不同的(颜色)值和超过 100k 个顶点,所以这不是要读取颜色栏中某个顶点的确切颜色。这是关于查看哪些区域的值更高或更低。

标签: r rgl


【解决方案1】:

您可以使用bgplot3d()rgl 绘图的背景中绘制任何类型的二维绘图。周围有很多不同的颜色条实现;请参阅Colorbar from custom colorRampPalette 进行讨论。该线程中的最后一篇文章是在 2014 年,因此可能会有更新的解决方案。

例如,使用fields::image.plot 函数,您可以将其放在绘图之后:

bgplot3d(fields::image.plot(legend.only = TRUE, zlim = range(morph_data), col = col) )

这种方法的一个已记录的缺点是窗口不能很好地调整大小;您应该先设置窗口大小,然后添加颜色栏。如果您确实使用image.plot,您还需要处理您对col 的定义以显示超过4 种颜色。

【讨论】:

  • 我知道这种方法,但我希望有更好的选择。我进行了很多搜索并尝试了不同的方法,但这似乎仍然是最好的方法。我已经接受了。
  • 以什么方式更好?
  • 在缩放可行的意义上更好。不过,这很可能需要一种完全不同的方法。当前的方法似乎是将 2D 图像文件写入临时位置并将其用作场景背景。我认为实现它的一种方法可能是创建条形的 3D 网格,对其着色,然后使用 text3d 绘制轴标签。我敢打赌,让它看起来正确会很烦人,所以没有人尝试过(或者失败并且没有发布)也就不足为奇了。
  • 我还注意到这并不可靠。有时颜色条是空的,即完全白色,而不是显示预期的颜色。这发生在我的 Linux 系统上,但不是在 MacOS 下,这首先让我认为它与 rgl/OpenGL/系统问题有关,但是当我使用其他颜色条功能(例如,squash::hkey)时,即使在 Linux 下它也能可靠地工作.但遗憾的是,生成的颜色条非常难看,并且该函数提供的灵活性远低于 fields::imageplot,因此这不是一个真正的解决方案。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2019-03-23
  • 2017-07-12
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多