R-ggplot2等高线图

R-ggplot2等高线图,r,ggplot2,contour,R,Ggplot2,Contour,我试图复制Andrew Ng在R中的Coursera上的机器学习课程的代码(因为课程是八度的) 基本上,我必须为多项式正则化逻辑回归绘制一个非线性决策边界(p=0.5) 我可以使用基本库轻松复制绘图: contour(u, v, z, levels = 0) points(x = data$Test1, y = data$Test2) 其中: u <- v <- seq(-1, 1.5, length.out = 100) 但我得到了一个错误:美学必须是长度1或与数据(118)相

我试图复制Andrew Ng在R中的Coursera上的机器学习课程的代码(因为课程是八度的)

基本上,我必须为多项式正则化逻辑回归绘制一个非线性决策边界(p=0.5)

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

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

u <- v <- seq(-1, 1.5, length.out = 100)
但我得到了一个错误:美学必须是长度1或与数据(118)相同:颜色,x,y,形状

谢谢

编辑(添加根据误用代码创建的绘图):


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()
库(tidyverse)
u%
聚集(列,值,-行)%>%
变异(行=作为数字(行),
列=作为数值(列))%>%
ggplot(aes(列,行,z=值))+
几何轮廓(箱柜=20)+
主题(经典)

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

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

如果您想直接在base R plot中对其进行标记,可以使用库
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:要更改轴的比例,有几个选项,一个是为矩阵指定适当的
行名
列名

我将为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))
rownames(火山)%
聚集(键,值,-rowname)%%>%
变异(键=数字(键),
rowname=as.numeric(rowname))%>%
ggplot()+
几何轮廓(aes(x=行名,y=键,z=值))

您好,您的解决方案有效,它绘制了预期的轮廓。只是有一个问题:x轴和y轴的比例不是从-1到1.5(u和v),而是一直到100。@Melvin86为删除的注释和处理
x
y
轴比例的注释添加了编辑。感谢您的误用,这非常有效。将情节添加到我的问题中以供参考。再见!嗨,eipi10,谢谢你的回答,我已经用missuse的代码创建了情节。我没有进行测试,但我认为您的代码也可以适用于我的情况,因为代码非常相似。这个新包看起来可以帮助:
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))