Объединение двух графиков в r
Вот два графика, которые я собираюсь объединить:
Сначала это полуматрица графика тепловой карты...............................
# plot 1 , heatmap plot
set.seed (123)
myd <- data.frame ( matrix(sample (c(1, 0, -1), 500, replace = "T"), 50))
mmat <- cor(myd)
diag(mmat) <- NA
mmat[upper.tri (mmat)] <- NA
heatmap (mmat, keep.dendro = F, Rowv = NA, Colv = NA)
![enter image description here]()
Мне нужно подавить имена в столбцах x и y и поместить их в диагональ.
Второй график, обратите внимание, что имена/метки в первом графике соответствуют имени во втором графике (от x1 до X10):
vard <- data.frame ( position = c(1, 10, 15, 18, 20, 23, 24, 30, 35, 40),
Names =paste ("X", 1:10, sep = ""))
plot(vard$position, vard$position - vard$position,
type = "n", axes = FALSE, xlab = "", ylab = NULL, yaxt = "n")
polygon(c(0, max(vard$position + 0.08 * max(vard$position)),
max(vard$position) + 0.08 * max(vard$position),
0), 0.2 * c(-0.3, -0.3, 0.3, 0.3), col = "green4")
segments(vard$position, -0.3, vard$position, 0.3)
text(vard$position, 0.7, vard$position,
srt = 90)
text(vard$position, -0.7, vard$Names)
![enter image description here]()
Я намерен повернуть первый график так, чтобы от X1 до X10 соответствовал тому же во втором графике, и есть связь между метками во втором графике с первым графиком. Результат будет выглядеть так:
Как я могу это сделать?
Редактирование: на основе комментариев о добавлении = ИСТИНА.... Я пытаюсь добавить многоугольник в график тепловой карты, как следует. Но я не мог найти координаты. Стратегический сюжет так и перевернул фактическую цифру позже... помочь очень ценно...
![enter image description here]()
Ответы
Ответ 1
Здесь используется полностью сетка. Единственный действительно задействованный бит - это функция convertToColors()
; он принимает числовую матрицу (возможно, включая NA) и преобразует ее в строки цвета sRGB (например, "#FFFFFF
), представляющие цвета на шкале красного цвета heat.colors()
. Красный соответствует минимальному значению в матрице, белый соответствует максимальному значению, а NA
- прозрачным.
Кроме этого, я думаю, что код делает достойную работу, показывающую, сколько функций grid не сложнее и значительно более последовательны и гибки, чем низкоуровневая base графические функции.
library(grid)
## Data: heatmap
set.seed (123)
myd <- data.frame ( matrix(sample (c(1, 0, -1), 500, replace = "T"), 50))
mmat <- cor(myd)
diag(mmat) <- NA
mmat[upper.tri (mmat)] <- NA
## Data: Positions
vard <- c(1, 10, 15, 18, 20, 23, 24, 30, 35, 40)
## Construct a function to convert a numeric matrix to a matrix of color names.
## The lowest value in the matrix maps to red, the highest to white,
## and the NAs to "transparent".
convertToColors <- function(mat) {
# Produce 'normalized' version of matrix, with values ranging from 0 to 1
rng <- range(mat, na.rm = TRUE)
m <- (mat - rng[1])/diff(rng)
# Convert to a matrix of sRGB color strings
m2 <- m; class(m2) <- "character"
m2[!is.na(m2)] <- rgb(colorRamp(heat.colors(10))(m[!is.na(m)]), max = 255)
m2[is.na(m2)] <- "transparent"
return(m2)
}
## Initialize plot and prepare two viewports
grid.newpage()
heatmapViewport <- viewport(height=1/sqrt(2), width=1/sqrt(2), angle = -135)
annotationViewport <- viewport(y = 0.7, height = 0.4)
## Plot heat map
pushViewport(heatmapViewport)
grid.raster(t(convertToColors(mmat)), interpolate = FALSE)
upViewport()
## Precompute x-locations of text and segment elements
n <- nrow(mmat)
v_x <- vard/max(vard)
X_x <- seq(0, 1, len=n)
## Plot the annotated green bar and line segments
pushViewport(annotationViewport)
## Green rectangle
grid.polygon(x = c(0,0,1,1,0), y = c(.45,.55,.55,.45,.45),
gp = gpar(fill = "green4"))
pushViewport(viewport(width = (n-1)/n))
## Segments and text marking vard values
grid.segments(x0 = v_x, x1 = v_x, y0 = 0.3, y1 = 0.7)
grid.text(label = vard, x = v_x, y = 0.75, rot = 90)
## Text marking heatmap column names (X1-X10)
grid.text(paste0("X", seq_along(X_x)), x = X_x, y=0.05,
gp = gpar(fontface="bold"))
## Angled lines
grid.segments(x0 = v_x, x1 = X_x, y0 = 0.29, y1 = 0.09)
upViewport()
upViewport()
![enter image description here]()
Ответ 2
На самом деле это не полный ответ, но в нем есть некоторые идеи, которые могут помочь вам построить один...
По сравнению с графической системой base система grid (на которой основаны как ggplot2
, так и lattice
) имеет много лучшая поддержка для размещения нескольких графических элементов в составном графике. Он использует "видовые экраны" для указания местоположений в сюжете; видовые экраны любой высоты, ширины и степени вращения могут быть "сдвинуты" в любое место в пределах существующего участка. Затем, после нажатия, они могут быть построены и, наконец, активизированы, так что другой участок может быть помещен в другое место в основной области печати.
Если бы это был мой проект, я бы, вероятно, работал над решением с полной сеткой (используя либеральное использование графиков более высокого уровня lattice
или ggplot2
). Однако пакет gridBase
предоставляет некоторую поддержку для объединения базовой и сетки, и я использовал это в примере ниже.
(Подробнее о том, что я сделал в следующем примере, см. виньетки grid.pdf
, viewports.pdf
и rotated.pdf
, расположенные в file.path(.Library, "grid", "doc")
, а также виньетку, открытую путем ввода vignette("gridBase", package="gridBase")
).
## Load required packages
library(lattice); library(grid); library(gridBase)
## Construct example dataset
set.seed (123)
myd <- data.frame ( matrix(sample (c(1, 0, -1), 500, replace = "T"), 50))
mmat <- cor(myd)
diag(mmat) <- NA
mmat[upper.tri (mmat)] <- NA
## Reformat data for input to `lattice::levelplot()`
grid <- data.frame(expand.grid(x = rownames(mmat), y = colnames(mmat)),
z = as.vector(mmat))
## Open a plotting device
plot.new()
## Push viewport that will contain the levelplot; plot it; up viewport.
pushViewport(viewport(y = 0.6, height = 0.8, width = 0.8, angle=135))
lp <- levelplot(z~y*x, grid, colorkey=FALSE,
col.regions=heat.colors(100), aspect=1,
scales = list(draw=FALSE), xlab="", ylab="",
par.settings=list(axis.line=list(col="white")))
plot(lp, newpage=FALSE)
upViewport()
## Push viewport that will contain the green bar; plot it; up viewport.
pushViewport(viewport(y = 0.7, height=0.2))
# Use the gridBase::gridOMI to determine the location within the plot.
# occupied by the current viewport, then set that location via par() call
par(omi = gridOMI(), new=TRUE, mar = c(0,0,0,0))
plot(0:1, 0:1,type = "n", axes = FALSE, xlab = "", ylab = "", yaxt = "n")
polygon(x=c(0,0,1,1,0), y = c(.4,.6,.6,.4,.4), col = "green4")
upViewport()
![enter image description here]()
Ответ 3
Я обнаружил ошибку в этой строке кода:
myd <- data.frame ( matrix(sample (c(1, 0, -1), 500, replace = "T"), 50))
Решено путем замены "Т" на TRUE
(Без кавычек)