为组合图添加一个包含所有变量的图例

Posted

技术标签:

【中文标题】为组合图添加一个包含所有变量的图例【英文标题】:add one legend with all variables for combined graphs 【发布时间】:2021-08-08 01:32:52 【问题描述】:

我正在尝试并排绘制两个图表,其中包含一个公共图例,该图例包含两个图表之间的所有变量(图表之间的某些变量不同)。

这是我一直在尝试的一个模拟示例:

#make relative abundance values for n rows
  makeData <- function(n)
  n <- n
  x <- runif(n, 0, 1)
  y <- x / sum(x)


#make random matrices filled with relative abundance values
makeDF <- function(col, rw)
  df <- matrix(ncol=col, nrow=rw)
  for(i in 1:ncol(df))
    df[,i] <- makeData(nrow(df))
  
  return(df)


#create df1 and assign col names
df1 <- makeDF(4, 5)
colSums(df1) #verify relative abundance values = 1
df1 <- as.data.frame(df1)
colnames(df1) <- c("taxa","s1", "s2", "s3")
df1$taxa <- c("ASV1", "ASV2", "ASV3", "ASV4", "ASV5")

#repeat for df2
df2 <- makeDF(4,5)
df2 <- as.data.frame(df2)
colnames(df2) <- c("taxa","s1", "s2", "s3")
df2$taxa <- c("ASV1", "ASV5", "ASV6", "ASV7", "ASV8")

# convert wide data format to long format -- for plotting
library(reshape2)
makeLong <- function(df)
  df.long <- melt(df, id.vars="taxa",
                  measure.vars=grep("s\\d+", names(df), val=T),
                  variable.name="sample",
                  value.name="value")
  return(df.long)

df1 <- makeLong(df1)
df2 <- makeLong(df2)

#generate distinct colours for each asv
taxas <- union(df1$taxa, df2$taxa)
library("RColorBrewer")
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
colpals <- qual_col_pals[c("Set1", "Dark2", "Set3"),] #select colour palettes
col_vector = unlist(mapply(brewer.pal, colpals$maxcolors, rownames(colpals)))
taxa.col=sample(col_vector, length(taxas))
names(taxa.col) <- taxas

# plot using ggplot
library(ggplot2)
plotdf2 <- ggplot(df2, aes(x=sample, y=value, fill=taxa)) + 
  geom_bar(stat="identity")+
  scale_fill_manual("ASV", values = taxa.col)

plotdf1 <- ggplot(df1, aes(x=sample, y=value, fill=taxa)) + 
  geom_bar(stat="identity")+
  scale_fill_manual("ASV", values = taxa.col)

#combine plots to one figure and merge legend
library(ggpubr)
ggpubr::ggarrange(plotdf1, plotdf2, ncol=2, nrow=1, common.legend = T, legend="bottom")

(如果您对如何生成更好的模拟数据有任何建议,请务必!)

当我运行我的代码时,我能够在一个图中获得两个图表,但图例并未包含两个图表中的所有变量:

理想情况下,我希望避免在图例中出现重复变量,例如:

根据我在网上搜索的内容,图例仅在图表之间的变量相同时才有效,但在我的情况下,我有相似和不同的变量。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

也许这就是你要找的东西:

    将您的 taxa 变量转换为级别等于您的 taxas 变量的因子,即包括来自两个数据集的所有级别。

    将参数 drop=FALSE 添加到 scale_fill_manual 以防止丢弃未使用的因子水平。

注意:我只添加了代码的相关部分,并在脚本开头将种子设置为42。

set.seed(42)

df1$taxa <- factor(df1$taxa, taxas)
df2$taxa <- factor(df2$taxa, taxas)

# plot using ggplot
library(ggplot2)
plotdf2 <- ggplot(df2, aes(x=sample, y=value, fill=taxa)) + 
  geom_bar(stat="identity") +
  scale_fill_manual("ASV", values = taxa.col, drop = FALSE)

plotdf1 <- ggplot(df1, aes(x=sample, y=value, fill=taxa)) + 
  geom_bar(stat="identity")+
  scale_fill_manual("ASV", values = taxa.col, drop = FALSE)

#combine plots to one figure and merge legend
library(ggpubr)
ggpubr::ggarrange(plotdf1, plotdf2, ncol=2, nrow=1, common.legend = T, legend="bottom")

【讨论】:

以上是关于为组合图添加一个包含所有变量的图例的主要内容,如果未能解决你的问题,请参考以下文章

在chart.js中组合多个图例元素

R语言ggplot2可视化为组合图添加综合图例实战:使用ggpubr包ggarrange函数实现综合图例使用patchwork包实现综合图例

dc.js饼图图例溢出

将图例添加到组合的线和条形图 ggplot

在ggplot中向条形图添加图例

arcgis如何做图例