R - контурный график ggplot2 - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь повторить код из курса Эндрю Нга по машинному обучению для Coursera в R (как курс в Октаве).

По сути, я должен построить нелинейную границу решения (при р = 0,5) для полиномиальной регуляризованной логистической регрессии.

Я могу легко скопировать сюжет с базовой библиотекой:

contour(u, v, z, levels = 0)
points(x = data$Test1, y = data$Test2)

где:

u <- v <- seq(-1, 1.5, length.out = 100)

и z - это матрица 100x100 со значениями z для каждой точки сетки. Размер данных 118x3.

Я не могу сделать это в ggplot2. Кто-нибудь знает, как повторить то же самое в ggplot2? Я пробовал с:

z = as.vector(t(z))
ggplot(data, aes(x = Test1, y = Test2) + geom_contour(aes(x = u, y = 
v, z = z))

Но я получаю ошибку: эстетика должна быть либо длины 1, либо такой же, как данные (118): цвет, x, y, форма

Спасибо.

РЕДАКТИРОВАТЬ (Добавление сюжета, созданного из кода неправильного использования):

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Что вам нужно, это преобразовать координаты в длинный формат. Вот пример использования набора данных вулканов:

data(volcano)

в базе R:

contour(volcano)

enter image description here

с 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))

enter image description here

если вы хотите пометить его напрямую, как в базовом графике 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"))

enter image description here

Чтобы добавить маркеры в определенных координатах, вам просто нужно добавить еще один слой с соответствующими данными:

предыдущий сюжет

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, чтобы назвать несколько.

enter image description here

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))

enter image description here

0 голосов
/ 09 мая 2018

ggplot2 наиболее эффективно работает с данными в длинном формате. Вот пример с поддельными данными:

library(tidyverse)  

u <- v <- seq(-1, 1.5, length.out = 100)

# Generate fake data
z = outer(u, v, function(a, b) sin(2*a^3)*cos(5*b^2))
rownames(z) = u
colnames(z) = v

# Convert data to long format and plot
as.data.frame(z) %>% 
  rownames_to_column(var="row") %>% 
  gather(col, value, -row) %>% 
  mutate(row=as.numeric(row), 
         col=as.numeric(col)) %>% 
ggplot(aes(col, row, z=value)) +
  geom_contour(bins=20) +
  theme_classic()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...