如何将图像转换为ggplot2 scatterplot的点数据

Mat*_*ach 6 r bitmap scatter-plot ggplot2

我最近在Github上找到了一个软件包,其中开发人员分析了由Antonio Prohias出版的248期Spy vs Spy漫画中的粉丝精选数据.

他进行了一些基本的探索性数据分析,计算了黑暗间谍胜利的运行净得分,然后进行了非参数测试(Wald Wolfowitz测试)以查看其中一个间谍的连续胜利集群,以确定Prohias是否保留通过扭转之前的结果,或者如果他可能选择了最爱,得分平衡.

虽然我发现这是一个有趣的练习,但我最感兴趣的是Spy Plot.

间谍与  间谍

Spy Plot的点数据实际上来自MATLAB复活节彩蛋 spy()包,开发人员将这一点数据作为tibble :: tribble放入R中.

我的问题是如何从图像中创建点数据?是否可以在R中imager()进行边缘检测以获得轮廓

在此输入图像描述

然后以某种方式将此图像数据转换为tbl_df?我不熟悉位图数组,但答案可能就是这样的?

Pau*_*aul 5

我们可以imager::cannyEdges用来获取边,然后将坐标放在数据框中进行绘图.

library('ggplot2')
library('imager')

plot(boats)
Run Code Online (Sandbox Code Playgroud)

船

img <- cannyEdges(boats)
plot(img)
Run Code Online (Sandbox Code Playgroud)

边缘

它看起来像是img一个4维的逻辑数组.

dim(img)
# [1] 256 384   1   3
Run Code Online (Sandbox Code Playgroud)

我只想要两个维度,所以我将丢弃两个维度.

img <- img[, , 1, 1]
img[1:8, 1:8]
#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
# [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [8,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

which 可以将此矩阵转换为坐标列表.

coords <- which(img, arr.ind = T)
head(coords)
#      row col
# [1,] 255   1
# [2,] 255   2
# [3,] 255   3
# [4,] 255   4
# [5,] 255   5
# [6,] 255   6
Run Code Online (Sandbox Code Playgroud)

现在它可以绘制.

df <- data.frame(x = coords[,1], y = coords[,2])

ggplot(df, aes(x, -y)) +
  geom_point()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述