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 和基色。
我有一组 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 和基色。