R-ggplot2等高线图

Mel*_*n86 2 r contour ggplot2

我正在尝试从R的Coursera上的Andrew Ng的机器学习课程中复制代码(因为该课程在Octave中)。

基本上,我必须绘制多项式正则逻辑回归的非线性决策边界(在p = 0.5处)。

我可以使用基本库轻松复制图:

contour(u, v, z, levels = 0)
points(x = data$Test1, y = data$Test2)
Run Code Online (Sandbox Code Playgroud)

哪里:

u <- v <- seq(-1, 1.5, length.out = 100)
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

但是我得到一个错误:美学必须为长度1或与数据(118)相同:颜色,x,y,形状

谢谢。

编辑(添加从滥用代码创建的图):

在此处输入图片说明

mis*_*use 5

您需要将坐标转换为长格式。这是一个使用火山数据集的示例:

data(volcano)
Run Code Online (Sandbox Code Playgroud)

在基数R中:

contour(volcano)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

使用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))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果您想直接将其标记为基本R图,则可以使用library 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
Run Code Online (Sandbox Code Playgroud)

然后

library(directlabels)

direct.label(some_plot, list("far.from.others.borders", "calc.boxes", "enlarge.box", 
                     box.color = NA, fill = "transparent", "draw.rects"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

要在特定坐标处添加标记,您只需添加具有适当数据的另一层即可:

以前的情节

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
Run Code Online (Sandbox Code Playgroud)

添加带有点的图层,例如:

plot_cont +
  geom_point(data = data.frame(x = c(35, 47, 61),
                               y = c(22, 37, 15)),
             aes(x = x, y = y), color = "red")
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式添加任意类型的图层:geom_linegeom_text仅举几例。

在此处输入图片说明

EDIT2:改变轴的刻度有几种选择,一种是分配适当的rownamescolnames到矩阵:

我将为x轴分配一个从0-2的序列,为y轴分配一个从0-5的序列:

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))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明