【发布时间】: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