R中重叠二进制图像的调色板

Color palette for overlapping binary images in R

我有一组 N 个二进制 (1-0) 图像,想在 R 中制作一张图像,显示它们如何相互重叠。

举个例子,假设我有两个这样的二进制图像,每个二进制图像都显示一个圆圈,稍微偏离中心;一个在右边,一个在左边。在这种情况下,我希望我的显示看起来像维恩图。

我的问题是这样的;目前,我有 5 张这样的图片,我希望它们看起来像带有 5 'circles' 的维恩图(这是用引号引起来的,因为它们的形状可能略有不同)。 5 'circles' 可能有 5!=120 种可能的方式可以相互交叉,我不知道如何在 R 中定义一个调色板来清楚地显示这些可能的交叉点。

理想情况下,我想生成类似于 venn R 包的输出(例如,参见 here),但我自己使用 5 个不同的图像定义了每个集合。有谁知道我该怎么做?


更新:根据要求,我在此处提供了 5 个 csv 格式的二进制图像:

虽然就代码而言,我必须承认我不知道从哪里开始。我尝试使用如下方式将所有图像添加在一起定义自定义配色方案:

# Read in files
mask1 <- read.csv(file = 'mask1.csv',sep=',', header=FALSE)
mask2 <- read.csv(file = 'mask2.csv',sep=',', header=FALSE)
mask3 <- read.csv(file = 'mask3.csv',sep=',', header=FALSE)
mask4 <- read.csv(file = 'mask4.csv',sep=',', header=FALSE)
mask5 <- read.csv(file = 'mask5.csv',sep=',', header=FALSE)

# Define some colors
mycols = c(lightgrey = 0, blue = 1, red = 2, orange = 3, green = 4, yellow = 5,
           purple = 6, sienna1 = 7, turquoise = 8, seagreen = 9, coral = 10,
           moccasin = 11, salmon = 12, rosybrown = 13, goldenrod = 14, khaki = 15,
           brown = 16)

# Sum them
example_mat = mask1 + mask2 + mask3 + mask4 + mask5

# Transpose
rotate <- function(x) t(apply(x, 2, rev))
m1 = rotate(example_mat)

# Convert to long format
d = data.frame(Values = as.vector(m1),
               fillcol = names(mycols[match(m1, mycols)]),
               X = as.vector(row(m1)),
               Y = as.vector(col(m1)))

# Make a plot
graphics.off()
ggplot(d, aes(x = X, y = Y)) +
  geom_tile(color = NA, fill = d$fillcol) +
  theme_light() +
  coord_equal() + 
  theme(axis.line=element_blank(),axis.text.x=element_blank(),                          
               
  axis.text.y=element_blank(),axis.ticks=element_blank(),
                          axis.title.x=element_blank(),
                         axis.title.y=element_blank(),legend.position="none",
                          panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
                          panel.grid.minor=element_blank(),plot.background=element_blank())

但这失败了,因为它没有区分每个集合,它也没有足够的颜色,并且重叠的颜色与重叠的集合的颜色不太相似。 IE。它与 the venn package article I referenced already above.

中给出的示例相去甚远

我可能会以不同的方式处理这个问题,通过用自己的颜色绘制每个图像,但使其部分透明,这样您就可以免费获得颜色重叠,而无需提前计算它们。

我们从阅读文件开始:

mask1 <- read.csv(file = 'mask1.csv', sep = ',', header = FALSE)
mask2 <- read.csv(file = 'mask2.csv', sep = ',', header = FALSE)
mask3 <- read.csv(file = 'mask3.csv', sep = ',', header = FALSE)
mask4 <- read.csv(file = 'mask4.csv', sep = ',', header = FALSE)
mask5 <- read.csv(file = 'mask5.csv', sep = ',', header = FALSE)

然后定义一个小辅助函数,它将旋转每个图像数据帧并将其转换为长格式:

mask_to_df <- function(mask, alpha, fillcol)
{ 
  mask <- t(apply(mask * alpha, 2, rev))
  data.frame(values = as.vector(mask),
             fillcol = fillcol,
             X = as.vector(row(mask)),
             Y = as.vector(col(mask)))
}

然后我们可以使用geom_raster来绘制,像这样:

library(ggplot2)

ggplot(mask_to_df(mask1, 0.5, "red"), 
       aes(x = X, y = Y, alpha = values, fill = fillcol)) +
  geom_raster() +
  geom_raster(data = mask_to_df(mask2, 0.5, "blue")) +
  geom_raster(data = mask_to_df(mask3, 0.5, "green")) +
  geom_raster(data = mask_to_df(mask4, 0.5, "yellow")) +
  geom_raster(data = mask_to_df(mask5, 0.5, "magenta")) +
  scale_fill_identity() +
  scale_alpha_identity() +
  theme_light() +
  coord_equal() + 
  theme_void()

当然,您可以随意更改每个圆圈的 alpha 和基色。