【问题标题】:Color palette for overlapping binary images in RR中重叠二值图像的调色板
【发布时间】:2021-10-16 16:55:16
【问题描述】:

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

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

我的问题是这样的;目前,我有 5 个这样的图像,我希望它们看起来像带有 5 个“圆圈”的维恩图(这是引号,因为它们的形状可能略有不同)。可能有 5!=120 种可能的方式让 5 个“圆圈”相互交叉,我不知道如何在 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.中给出的示例相差甚远

【问题讨论】:

  • 请提供示例数据和尝试的代码。
  • 当然,我现在将添加示例数据。在代码方面,虽然我必须承认我有点不确定从哪里开始——我会尽我所能。
  • 问题现已更新。

标签: r image plot colors venn-diagram


【解决方案1】:

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

我们从读取文件开始:

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 和基色。

【讨论】:

  • 啊!这正是我想要的,谢谢!
猜你喜欢
  • 2011-09-15
  • 2014-01-24
  • 1970-01-01
  • 2014-12-29
  • 2018-01-13
  • 2020-12-05
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多