如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

2024-05-05

我有两个人脸 3D 网格,我希望使用热图来说明差异。我想使用红蓝发散色阶。

我的数据可以查到here https://github.com/Patricklv/How-to-create-heatmap-illustraing-3D-mesh-differences-controlling-the-position-of-center-color-for-d。在我的数据中,“vb1.xlsx”和“vb2.xlsx”包含两个网格的 3D 坐标。 “it.xlsx”是人脸信息。 “dat_col.xlsx”包含两个网格之间的逐点距离,基于该距离可以生成热图。我使用以下代码根据顶点和面信息生成两个网格。然后我用了meshDistMorpho 包中的函数用于计算两个网格上每对顶点之间的距离。

library(Morpho)
library(xlsx)
library(rgl)
library(RColorBrewer)
library(tidyverse)


mshape1 <- read.xlsx("...\\vb1.xlsx", sheetIndex = 1, header = F)
mshape2 <- read.xlsx("...\\vb2.xlsx", sheetIndex = 1, header = F)

it <- read.xlsx("...\\it.xlsx", sheetIndex = 1, header = F)

# Preparation for use in tmesh3d
vb_mat_mshape1 <- t(mshape1)
vb_mat_mshape1 <- rbind(vb_mat_mshape1, 1)
rownames(vb_mat_mshape1) <- c("xpts", "ypts", "zpts", "")

vb_mat_mshape2 <- t(mshape2)
vb_mat_mshape2 <- rbind(vb_mat_mshape2, 1)
rownames(vb_mat_mshape2) <- c("xpts", "ypts", "zpts", "")

it_mat <- t(as.matrix(it))
rownames(it_mat) <- NULL

vertices1 <- c(vb_mat_mshape1)
vertices2 <- c(vb_mat_mshape2)

indices <- c(it_mat)

mesh1 <- tmesh3d(vertices = vertices1, indices = indices, homogeneous = TRUE, 
               material = NULL, normals = NULL, texcoords = NULL)
mesh2 <- tmesh3d(vertices = vertices2, indices = indices, homogeneous = TRUE, 
               material = NULL, normals = NULL, texcoords = NULL)

mesh1smooth <- addNormals(mesh1)
mesh2smooth <- addNormals(mesh2)

# Calculate mesh distance using meshDist function in Morpho package
mD <- meshDist(mesh1smooth, mesh2smooth)
pd <- mD$dists

The pd,包含有关两个网格之间的逐点距离的信息,可以在“dat_col.xlsx”文件的第一列中找到。

A heatmap is generated from the meshDist function as follows: enter image description here

我希望通过使用红蓝发散色标更好地控制热图。更具体地说,我希望使用 RColorBrewer 包中 RdBu 调色板中的 100 种颜色将正/负值着色为蓝色/红色。为此,我首先缩小了范围pd将值分成 99 个等长的间隔。然后我确定了 99 个间隔中的哪一个间隔pd价值所在。代码如下:

nlevel <- 99

breaks <- NULL
for (i in 1:(nlevel - 1)) {
    breaks[i] <- min(pd) + ((max(pd) - min(pd))/99) * i
}

breaks <- c(min(pd), breaks, max(pd))

pd_cut <- cut(pd, breaks = breaks, include.lowest = TRUE)

dat_col <- data.frame(pd = pd, pd_cut = pd_cut, group = as.numeric(pd_cut))

The pd_cut是每个对应的区间pd and group是每个的区间隶属度pd。然后将颜色分配给每个pd根据中的值group使用以下代码:

dat_col <- dat_col %>%
           mutate(color = colorRampPalette(
                            brewer.pal(n = 9, name = "RdBu"))(99)[dat_col$group])

最终热图如下:

open3d()    
shade3d(mesh1smooth, col=dat_col$color, specular = "#202020", polygon_offset = 1)

因为我有 99 个间隔,中间的区间是第 50 个区间 (-3.53e-05,-1.34e-05]。但是,包含 0 点的是第 51 个区间 (-1.34e-05,8.47e-06].

按照我的颜色分配方式(colorRampPalette(brewer.pal(n = 9, name = "RdBu"))(99)[dat_col$group]),中心颜色(第 50 个颜色由colorRampPalette) 被赋予pds 属于第 50 个区间。然而,I want pd属于第 51 个区间(包含 0 的区间)的 s,将被分配中心颜色.

我知道就我而言,我的问题不会对热图的外观产生太大影响。但我相信这不是一个小问题,当包含 0 的区间远离中间区间时,它会显着影响热图。当比较的两个网格非常不同时,可能会发生这种情况。对我来说,将中心颜色分配给包含 0 的间隔而不是位于所有间隔中间的间隔更有意义。

当然,我可以手动将第 50 个估算颜色的十六进制代码替换为所需的中心颜色,如下所示:

color <- colorRampPalette(brewer.pal(n = 9, name = "RdBu"))(99)
color2 <- color
color2[50] <- "#ffffff" #assume white is the intended center color

但上述方法影响了颜色渐变的平滑度,因为最初由某些平滑函数估算的颜色被某些任意颜色替换。但是我怎样才能将中心颜色分配给pds 位于超过 0 的区间内,同时不影响估算颜色的平滑度?


为了得到你想要的东西,有一些事情需要解决。

首先,颜色。您可以根据以下代码设置颜色:

color <- colorRampPalette(brewer.pal(n = 9, name = "RdBu"))(99)

你可以看看计算的结果,你会发现里面没有白色。中间的颜色是color[50]其评估结果为"#F7F6F6", IE。 略带红色的浅灰色。如果你看一下原来的 RdBu 调色板,中间的颜色是"#F7F7F7",所以这个改变是由colorRampPalette()。对我来说,这看起来像是该函数中的一个小错误:它截断​​颜色值而不是四舍五入它们,因此值

[50,] 247.00000 247.00000 247.00000

转换成"#F7F6F6",即红色 247、绿色 246、蓝色 246。您可以通过在调色板中选择其他数量的颜色来避免这种情况。我懂了"F7F7F7"作为中间颜色,有 97 色和 101 色。但落后一位可能并不重要,所以我不会担心这一点。

第二个问题是你对范围的离散化pd价值观。您希望中间的垃圾箱为零。如果您希望所有垃圾箱的大小相同,那么它需要对称:所以不要从min(pd) to max(pd),您可以使用以下计算:

limit <- max(abs(pd))
breaks <- -limit + (0:nlevel)*2*limit/nlevel

这会将零精确地放置在中间垃圾箱的中间,但一端或另一端的一些垃圾箱可能不会被使用。如果您不关心垃圾箱的大小是否相同,则可以通过将它们分开来获得与正数一样多的负数。我更喜欢上面的解决方案。

编辑添加:对于第一个问题,更好的解决方案是使用

color <- hcl.colors(99, "RdBu")

R 3.6.0 中的新功能。这确实给出了浅灰色作为中间颜色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建热图来说明控制发散调色板中心颜色位置的网格差异? 的相关文章

随机推荐

  • 是否可以使用 S3 进行 Flash 伪流?

    我一直在使用 S3 来存储和提供 FLV 和 MP4 视频 它效果很好 但内容是渐进下载的 我想知道是否有可能让所谓的 伪流 与 S3 一起使用 伪流允许观看者在下载完整视频之前在视频中向前搜索 并仅将必要的位发送到 Flash 播放器 我
  • Excel 中的样条插值

    我会让这个问题变得简单明了 因为我的截止日期已经到了 在为我的部分做一些报告时 我到达了可以真正在 Excel 中使用插值的部分 现在 我从未对其函数或一般的 VBA 进行过任何练习 那么 有没有一个地方我可以 或者你们中的任何人都知道一些
  • 从另一列计算出的列?

    给出下表 id value 1 6 2 70 有没有办法添加根据同一个表中的另一列自动计算的列 与 VIEW 类似 但属于同一个表的一部分 举个例子 calculated将是一半value Calculated应该会自动更新value变化
  • ASP.NET Web 服务中的 XML 文档中存在非法字符

    我要问并回答我自己的问题 我希望没人介意 但我认为这可能对其他人有用 如果您设置的 ASP NET Web 服务返回的对象包含对 XML 无效的字符 则在将对象序列化为 SOAP xml 并且客户端尝试反序列化该 xml 后 将会引发异常
  • 如何将图像存储在网站根目录之外

    我希望用户上传的所有图像都保存在我的网站目录之外 让我为大家解释一下 假设我有一个网站部署在服务器中 目录路径是 e g D TestWeb 目前我添加了一些其他目录来存储图像 D TestWeb imgProfile D TestWeb
  • 32位机器如何计算双精度数

    如果我只有32位机器 CPU如何计算双精度数 这个数字是 64 位宽 FPU 如何处理它 更普遍的问题是 如何计算比我的 alu 更宽的东西 不过我完全理解整数方式 您可以简单地split https stackoverflow com q
  • LINQ Group By 投影成非匿名类型?

    我有以下 LINQ 示例 var colorDistribution from product in ctx Products group product by product Color into productColors select
  • 阻止 ItemsControls 共享过滤器

    我有两个 ItemsControl 一个是 ListView 另一个是我正在开发的自定义控件 我已将两个控件的 ItemsControl ItemsSource 属性设置为同一个 IEnumerable 对象 在本例中为 List 我将筛选
  • 使用 ImageProcessor 从 MemoryStream 保存/加载图像时出现一般 GDI+ 错误

    我在 imageFactory Load inStream 线上遇到通用 GDI 错误 我的项目是 ASP NET Core Razor Pages 我尝试将 inStream 克隆到新流 这在之前保存位图时对我有帮助 但没有成功 以前有人
  • 如何安装wkhtmltopdf?

    现在我正在使用rails 3 0 0 我正在使用Ubuntu 11 10 64位操作系统 我想安装wkhtmltopdf 请告诉我wkhtmltopdf的静态版本 安装中wkhtmltopdf 在 Ubuntu Linux 机器上 首先使用
  • GWT 和 Guava 的问题

    我很难让 GWT 与 Guava 一起工作 我添加了guava r09 gwt jar到我的类路径 并且
  • 迁移后删除轨道模型

    我觉得很奇怪 创建模型 运行迁移 销毁它 然后再次创建相同的模型会报告 SQL 异常 project master rails g model name name invoke active record create db migrate
  • 为 customere xml 按钮着色时遇到问题

    我在为自定义按钮着色时遇到问题 由于某种原因 似乎无论我想应用什么颜色更改 文本或背景 按钮都保持不变 我注意到button xml具有所需的颜色和正确的形状 尽管没有出现按钮background color活动的财产 活动中的按钮
  • 如何使用 React Router 6 在 React 组件之外导航

    现在我有一个历史记录模块 它让我甚至可以在反应组件之外使用历史记录 import createBrowserHistory from history export default createBrowserHistory 然后我直接在App
  • IE 因在闭包中引用 DOM 元素而导致内存泄漏?

    在最近的一次采访中 有人问我 像这段代码一样 在引用 DOM 元素时使用闭包有什么危险 var firstNameValue function elementId var firstName document getElementById
  • XSLT 2.0 中的简洁正则表达式提取功能

    我可以从 XSLT 2 0 文档中看到最好的结果 或者至少从我在这些地方读到的内容中看到 Saxon 分析字符串函数 http www saxonica com html documentation xsl elements analyze
  • 为了让 Pelican 生成的 html 链接到图像,表达路径的正确方法是什么?

    我刚刚开始使用 Pelican 创建博客 并想要链接到图像 我通过在 Markdown 文件中包含以下行来做到这一点 img src myImg1a png alt style width 100 height 800px 此行已成功复制到
  • iOS 应用程序上的 Youtube API v3。我的 API 密钥不起作用,但其他人的密钥可以在同一应用程序上起作用。错误403

    这可能是 Google 的 Youtube 团队直接提出的问题 但我想先在这里问 以防将来也能帮助其他人 我在 iOS 应用程序上使用简单的 API 密钥 没有 OAuth 2 0 该应用程序只是从特定的播放列表 ID 返回视频 ID 列表
  • userRef 或 createRef 在功能组件中返回未定义

    我在这里阅读了很多答案 但它们都是类组件的潮流 如果我有使用 useRef 或 createRef 的简单功能组件 则 ref current 未定义 我将它分配在 div 或 input 之上 但我无法获取它们的任何属性 Console
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d