Что вам нужно, это преобразовать координаты в длинный формат. Вот пример использования набора данных вулканов:
data(volcano)
в базе R:
contour(volcano)
с ggplot2:
library(tidyverse)
as.data.frame(volcano) %>% #convert the matrix to data frame
rownames_to_column() %>% #get row coordinates
gather(key, value, -rowname) %>% #convert to long format
mutate(key = as.numeric(gsub("V", "", key)), #convert the column names to numbers
rowname = as.numeric(rowname)) %>%
ggplot() +
geom_contour(aes(x = rowname, y = key, z = value))
если вы хотите пометить его напрямую, как в базовом графике R, вы можете использовать библиотеку directlabels
:
Сначала сопоставьте цвет / заливку с переменной:
as.data.frame(volcano) %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
mutate(key = as.numeric(gsub("V", "", key)),
rowname = as.numeric(rowname)) %>%
ggplot() +
geom_contour(aes(x = rowname,
y = key,
z = value,
colour = ..level..)) -> some_plot
, а затем
library(directlabels)
direct.label(some_plot, list("far.from.others.borders", "calc.boxes", "enlarge.box",
box.color = NA, fill = "transparent", "draw.rects"))
Чтобы добавить маркеры в определенных координатах, вам просто нужно добавить еще один слой с соответствующими данными:
предыдущий сюжет
as.data.frame(volcano) %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
mutate(key = as.numeric(gsub("V", "", key)),
rowname = as.numeric(rowname)) %>%
ggplot() +
geom_contour(aes(x = rowname, y = key, z = value)) -> plot_cont
добавить слой с точками, например:
plot_cont +
geom_point(data = data.frame(x = c(35, 47, 61),
y = c(22, 37, 15)),
aes(x = x, y = y), color = "red")
Вы можете добавить любой тип слоя следующим образом: geom_line
, geom_text
, чтобы назвать несколько.
EDIT2: чтобы изменить масштаб оси, есть несколько опций, один из которых - присвоить соответствующие rownames
и colnames
матрице:
Я назначу последовательность от 0 до 2 для оси x и от 0 до 5 для оси y:
rownames(volcano) <- seq(from = 0,
to = 2,
length.out = nrow(volcano)) #or some vector like u
colnames(volcano) <- seq(from = 0,
to = 5,
length.out = ncol(volcano)) #or soem vector like v
as.data.frame(volcano) %>%
rownames_to_column() %>%
gather(key, value, -rowname) %>%
mutate(key = as.numeric(key),
rowname = as.numeric(rowname)) %>%
ggplot() +
geom_contour(aes(x = rowname, y = key, z = value))