Проблемы с осями и легендами при использовании hist3D в r

#r #plot #legend #margins #par

Вопрос:

ОБНОВЛЕНИЯ ПРОГРЕССА ВНИЗУ.

Я пытаюсь получить красивую трехмерную двумерную гистограмму, используя hist3D функцию plot3D библиотеки. У меня есть сюжет и цвета, которые работают нормально, но я не могу понять, как правильно манипулировать полями и метками осей, и легенда также работает.

В настоящее время я избавляюсь от оригинальных меток оси и добавляю a text3D (также из plot3D библиотеки), чтобы заменить их, но я не могу понять, как выделить достаточно места для меток x и y. Пока я работал над этим, помещая метки x в сюжет, но в идеале я бы хотел, чтобы они были под. Однако я не придумал никакой такой временной работы для оси y. Я предполагаю, что это что — то исправлено, par() но я не могу этого понять.

Просто это то, чего я хотел бы помочь достичь:

  1. чтобы переместить легенду дальше прямо из области сюжета
  2. увеличение расстояния между осью x и заголовком для размещения меток
  3. удаление галочек с осей x и y.

Любая помощь была бы очень признательна. Если вы думаете, что можете получить то, что я ищу, используя разные пакеты, это было бы так же хорошо. Я думаю, что авторы сюжета, который я пытаюсь воспроизвести, использовали Matplotlib, но мне это нужно в R.

Ниже показано, где я сейчас нахожусь, примеры данных и код.

Спасибо!

введите описание изображения здесь

 library(plot3D)
library(viridis)

mydata <- matrix(sample(1:6,18,replace=TRUE), nrow=6)
rownames(mydata) <- c("biological regulation","biological_process",
                         "cellular aromatic compound metabolic process",
                         "cellular metabolic process",
                         "cellular nitrogen compound metabolic process",
                         "cellular process"    )
colnames(mydata) <- c("Group1","Group2","Group3")
mydata

m <- matrix(rep(seq(1:ncol(mydata)),each=nrow(mydata)), 
            nrow = nrow(mydata))

hist3D(z =mydata, scale = FALSE, expand = 0.1, bty = "g", 
       theta = 5, phi = 5, d = 2, r=20,
       border = "black", shade = 0.2, ltheta = 80, space = 0.8, 
       ticktype = "detailed", zmin=0, zlim=c(0,max(mydata)), 
       col= viridis(ncol(mydata)), colvar = m, colkey = F, 
       xlab = "GO Term", ylab = "", zlab = "Frequency", cex.axis = 1e-9)
#xlabs
text3D(x = seq(0,1,0.2), y = rep(-0.5, 6), z = rep(max(mydata)/2, 6),
       labels = rownames(mydata),
       add = TRUE, adj = 0.5,
       srt = 90, cex = 0.5)
#ylabs
text3D(x = rep(1.4, 3),   y = seq(-.2,0.8,0.5), z = rep(0, 3),
       labels  = colnames(mydata),
       add = TRUE, adj = 1)
#zlabs
text3D(x = rep(-0.18, 7),   y = rep(0,7), z = seq(-0.1, 5.9,1),
       labels  = seq(0,max(mydata)),
       add = TRUE, adj = 1)

legend("topright",
       legend = as.factor(colnames(mydata)), # category labels
       col = viridis(ncol(mydata)),  # color key
       fill = viridis(ncol(mydata)))
 

ОБНОВЛЕНИЕ ХОДА ВЫПОЛНЕНИЯ

Я отсортировал вырезку текста с использованием par(xpd) и размеры с использованием par(mar) , и я получил легенду, используя inset . До сих пор не могу найти, как удалить клещей. Я думаю, это как-то связано с persp() этим .

введите описание изображения здесь

 library(plot3D)
library(viridis)

mydata <- matrix(sample(1:6,18,replace=TRUE), nrow=6)
rownames(mydata) <- gsub("( \S ) ", "\1n", 
                         c("biological regulation","biological process",
                         "cellular aromatic compound metabolic process",
                         "cellular metabolic process",
                         "cellular nitrogen compound metabolic process",
                         "cellular process"))
colnames(mydata) <- c("Group1","Group2","Group3")
mydata

m <- matrix(rep(seq(1:ncol(mydata)),each=nrow(mydata)), 
            nrow = nrow(mydata))

opar <- par(xpd=TRUE, mar=c(7,4,4,4))
hist3D(z =mydata, scale = FALSE, expand = 0.1, bty = "g", 
       theta = 5, phi = 5, d = 2, r=20,
       border = "black", shade = 0.2, ltheta = 80, space = 0.8, 
       ticktype = "detailed", zmin=0, zlim=c(0,max(mydata)), 
       col= viridis(ncol(mydata)), colvar = m, colkey = F, 
       xlab = "", ylab = "", zlab = "Frequency", cex.axis = 1e-9)
#xlabs
text3D(x = seq(0,1,0.2), y = rep(-0.5, 6), z = rep(-0.5, 6),
       labels = rownames(mydata),
       add = TRUE, adj = 1,
       srt = 90, cex = 0.75)
#ylabs
text3D(x = rep(1.4, 3),   y = seq(-.2,0.8,0.5), z = rep(0, 3),
       labels  = colnames(mydata),
       add = TRUE, adj = 1)
#zlabs
text3D(x = rep(-0.18, 7),   y = rep(0,7), z = seq(-0.1, 5.9,1),
       labels  = seq(0,max(mydata)),
       add = TRUE, adj = 1)

legend("topright",
       legend = as.factor(colnames(mydata)), # category labels
       col = viridis(ncol(mydata)),  # color key
       fill = viridis(ncol(mydata)), 
       inset=c(-0.1,0))
par(opar)
 

Ответ №1:

Итак, я обнаружил, что могу отключить все оси, используя axes = F hist3d вызов, и этого для меня достаточно. Затем я могу добавлять названия осей по своему желанию.

 library(plot3D)
library(viridis)

mydata <- matrix(sample(1:6,18,replace=TRUE), nrow=6)
rownames(mydata) <- gsub("( \S ) ", "\1n", 
                         c("biological regulation","biological process",
                           "cellular aromatic compound metabolic process",
                           "cellular metabolic process",
                           "cellular nitrogen compound metabolic process",
                           "cellular process"))
colnames(mydata) <- c("Group1","Group2","Group3")
mydata

m <- matrix(rep(seq(1:ncol(mydata)),each=nrow(mydata)), 
            nrow = nrow(mydata))

opar <- par(xpd=TRUE, mar=c(7,4,4,4))
hist3D(z =mydata, scale = FALSE, expand = 0.1, bty = "g", 
       theta = 5, phi = 5, d = 2, r=20,
       border = "black", shade = 0.2, ltheta = 80, space = 0.8, 
       ticktype = "detailed", zmin=0, zlim=c(0,max(mydata)), 
       col= viridis(ncol(mydata)), colvar = m, colkey = F, axes = F)
#xlabs
text3D(x = seq(0,1,0.2), y = rep(-0.5, 6), z = rep(-0.5, 6),
       labels = rownames(mydata),
       add = TRUE, adj = 1,
       srt = 90, cex = 0.75)
#zlabs
text3D(x = rep(-0.18, 7),   y = rep(0,7), z = seq(-0.1, 5.9,1),
       labels  = seq(0,max(mydata)),
       add = TRUE, adj = 1)
#z title
text3D(x = -0.6,   y = max(mydata)/2 , z = 0,
       labels  = "Frequency",
       add = TRUE, adj = 0.5, srt = 90)

legend("topright",
       legend = as.factor(colnames(mydata)), # category labels
       col = viridis(ncol(mydata)),  # color key
       fill = viridis(ncol(mydata)), 
       inset=c(-0.1,0))
par(opar)
 

введите описание изображения здесь