【发布时间】:2017-04-18 15:56:25
【问题描述】:
我想使用 ggplot 创建一个类似于下面的色盲测试。
基本思想是使用geom_hex(或者可能是 voronoi 图,或者甚至可能是上图中的圆圈)作为起点,并定义一个数据框,当在 ggplot 中绘制时,该数据框会生成图像。
我们将从创建数据集开始,例如:
df <- data.frame(x = rnorm(10000), y = rnorm(10000))
然后绘制这个:
ggplot(df, aes(x, y)) +
geom_hex() +
coord_equal() +
scale_fill_gradient(low = "red", high = "green", guide = FALSE) +
theme_void()
它给出了下面的图像:
主要缺少的步骤是创建一个实际绘制有意义符号(字母或数字)的数据集,我不确定如何在不费力地映射坐标的情况下最好地进行此操作。理想情况下,也许可以从图像文件中读取坐标。
最后,稍微整理一下就可以通过移除离群点来使绘图边缘变圆。
非常欢迎所有建议!
编辑
离我所追求的更近一点,我们可以使用下面的字母“e”的图片:
使用imager 包,我们可以将其读入并将其转换为数据帧:
img <- imager::load.image("e.png")
df <- as.data.frame(img)
然后使用geom_raster 绘制该数据框:
ggplot(df, aes(x, y)) +
geom_raster(aes(fill = value)) +
coord_equal() +
scale_y_continuous(trans = scales::reverse_trans()) +
scale_fill_gradient(low = "red", high = "green", guide = FALSE) +
theme_void()
如果我们使用geom_hex而不是geom_raster,我们可以得到如下图:
ggplot(df %>% filter(value %in% 1), aes(x, y)) +
geom_hex() +
coord_equal() +
scale_y_continuous(trans = scales::reverse_trans()) +
scale_fill_gradient(low = "red", high = "green", guide = FALSE) +
theme_void()
所以,到达那里,但显然还有很长的路要走......
【问题讨论】:
-
看起来很接近 - 看起来您需要填充边缘并添加一些随机噪声。也许也可以加粗线条?
-
@Gregor 谢谢。你知道你会如何相当简单地做这些事情吗?
-
如果您使用
spatstat包生成密集的核心点模式,您将获得更类似于原始模式的模式...我会调查... -
注意这些被称为 Ishihara 测试:en.wikipedia.org/wiki/Ishihara_test
-
packcircles包可能有助于布局:github.com/mbedward/packcircles/blob/master/vignettes/…