Раскрасьте меня sh по точечному расстоянию до другого меня sh с учетом относительного положения сеток - PullRequest
0 голосов
/ 17 июня 2020

У меня есть более ранняя запись , в которой спрашивалось, как создать тепловую карту, демонстрирующую различия между двумя сетками. Этот пост был о том, как выбирать цветовые гаммы. Чтобы назначить цвет, в первую очередь необходимо вычислить расстояние по вершинам между двумя сравниваемыми сетками. В этом посте это было сделано функцией meshDist в пакете Morpho в R.

Что ускользает от меня, так это то, что я не особо понимаю, как расстояние между вершинами было вычислено под капотом с помощью meshDist. Я хочу евклидово расстояние между гомологичными вершинами на двух сетках (например, (x1, y1, z1) на сетке 1 гомологично (x2, y2, z2) на сетке 2), которое оценивается как sqrt(sum((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)). Однако это дает несколько иные значения, чем те, которые возвращает meshDist. Конечно, я мог бы go вперед и напрямую использовать вычисленное мной евклидово расстояние для построения тепловой карты меня sh. Но евклидово расстояние не отражает относительное положение двух сеток.

Когда две сетки накладываются друг на друга, я хочу, чтобы части, в которых сетка 1 более заметна, окрашены в другой цвет, чем тот, который используется для обозначения частей, где сетка 2 более заметный. meshDist магическим образом (для меня) принимает во внимание относительную позицию sh. Возвращенные положительные значения указывают на то, что сетка 1 относительно более заметна, а отрицательные значения указывают на то, что сетка 2 более заметна. Напротив, вычисленное мной евклидово расстояние игнорировало такую ​​информацию. Я хотел бы спросить, можно ли получить положительное и отрицательное расстояние Евльцида, как это сделано в meshDist, чтобы полученная тепловая карта показывала не только величину разницы, но и относительное положение двух сеток?

Полный код, включая построение меня sh и наложение цветов на него, выглядит следующим образом:

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

######################## Assign color to vertext groups ######################## 
nlevel <- 99
# Method suggested by user2554330 [here][1]
limit <- max(abs(pd))
breaks <- -limit + (0:nlevel)*2*limit/nlevel

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

col <- hcl.colors(nlevel, "RdBu")
col <- rev(col)

dat_col <- data.frame(pd = pd, pd_cut = pd_cut, group = as.numeric(pd_cut))
dat_col <- dat_col %>% 
           mutate(col = col[dat_col$group])

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

Другой вопрос: хотя я мог бы создать тепловую карту, используя функцию shape3d выше, эта функция не работает. по умолчанию создать цветовую легенду. Хотя существуют функции для создания тепловых карт, которые позволяют мне получить кажущуюся хорошую цветовую легенду, передавая функцию расстояния по вершинам, я не могу гарантировать, что эта функция создает цвета точно так же, как я (это метод, предложенный пользователем2554330). Как я могу точно создать легенду цвета вершин для моей тепловой карты sh с несколькими промежуточными цветами (включая центральный цвет, т. Е. 50-й столбец в коде выше), соответствующие их соответствующим значениям расстояния между вершинами (pd_cut)?

Спасибо за вашу помощь.

...