R 使用cowplot将密度图与散射图完美对齐

R 使用cowplot将密度图与散射图完美对齐,r,ggplot2,cowplot,R,Ggplot2,Cowplot,我试图建立一个双变量绘图函数,取2个变量,它能够表示一个边缘散点图和两个横向密度图 问题是右侧的密度图与底轴不对齐 以下是一个示例数据: g1 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=700, sd=100)) g2 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=500, sd=100)) df_exp = data.frame(var1=log2(g1 + 1) , var2=lo

我试图建立一个双变量绘图函数,取2个变量,它能够表示一个边缘散点图和两个横向密度图

问题是右侧的密度图与底轴不对齐

以下是一个示例数据:

g1 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=700, sd=100))
g2 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=500, sd=100))
df_exp = data.frame(var1=log2(g1 + 1) , var2=log2(g2 + 1))
以下是函数:

    bivariate_plot <- function(df, var1, var2, density = T, box = F) {
    require(ggplot2)
    require(cowplot)
    scatter = ggplot(df, aes(eval(parse(text = var1)), eval(parse(text = var2)), color = "red")) +
            geom_point(alpha=.8)

    plot1 = ggplot(df, aes(eval(parse(text = var1)), fill = "red")) + geom_density(alpha=.5) 
    plot1 = plot1 + ylab("G1 density")

    plot2 = ggplot(df, aes(eval(parse(text = var2)),fill = "red")) + geom_density(alpha=.5) 
    plot2 = plot2 + ylab("G2 density")

    plot_grid(scatter, plot1, plot2, nrow=1, labels=c('A', 'B', 'C')) #Or labels="AUTO"


    # Avoid displaying duplicated legend
    plot1 = plot1 + theme(legend.position="none")
    plot2 = plot2 + theme(legend.position="none")

    # Homogenize scale of shared axes
    min_exp = min(df[[var1]], df[[var2]]) - 0.01
    max_exp = max(df[[var1]], df[[var2]]) + 0.01
    scatter = scatter + ylim(min_exp, max_exp)
    scatter = scatter + xlim(min_exp, max_exp)
    plot1 = plot1 + xlim(min_exp, max_exp)
    plot2 = plot2 + xlim(min_exp, max_exp)
    plot1 = plot1 + ylim(0, 2)
    plot2 = plot2 + ylim(0, 2)


    first_row = plot_grid(scatter, labels = c('A'))
    second_row = plot_grid(plot1, plot2, labels = c('B', 'C'), nrow = 1)
    gg_all = plot_grid(first_row, second_row, labels=c('', ''), ncol=1)

    # Display the legend
    scatter = scatter + theme(legend.justification=c(0, 1), legend.position=c(0, 1))



    # Flip axis of gg_dist_g2
    plot2 = plot2 + coord_flip()

    # Remove some duplicate axes
    plot1 = plot1 + theme(axis.title.x=element_blank(),
                          axis.text=element_blank(),
                          axis.line=element_blank(),
                          axis.ticks=element_blank())

    plot2 = plot2 + theme(axis.title.y=element_blank(),
                          axis.text=element_blank(),
                          axis.line=element_blank(),
                          axis.ticks=element_blank())

    # Modify margin c(top, right, bottom, left) to reduce the distance between plots
    #and align G1 density with the scatterplot
    plot1 = plot1 + theme(plot.margin = unit(c(0.5, 0, 0, 0.7), "cm"))
    scatter = scatter + theme(plot.margin = unit(c(0, 0, 0.5, 0.5), "cm"))
    plot2 = plot2 + theme(plot.margin = unit(c(0, 0.5, 0.5, 0), "cm"))

    # Combine all plots together and crush graph density with rel_heights
    first_col = plot_grid(plot1, scatter, ncol = 1, rel_heights = c(1, 3))
    second_col = plot_grid(NULL, plot2, ncol = 1, rel_heights = c(1, 3))
    perfect = plot_grid(first_col, second_col, ncol = 2, rel_widths = c(3, 1),
                        axis = "lrbl", align = "hv")

    print(perfect)
}
必须指出的是,即使通过更改数据,这种对齐问题也始终存在

我的真实数据就是这样的:
您的代码中有太多错误,我不知道从哪里开始。下面的代码修复了它们,在我理解预期结果的范围内

g1 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=700, sd=100))
g2 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=500, sd=100))
df_exp = data.frame(var1=log2(g1 + 1) , var2=log2(g2 + 1))


bivariate_plot <- function(df, var1, var2, density = T, box = F) {
  require(ggplot2)
  require(cowplot)
  scatter = ggplot(df, aes_string(var1, var2)) +
    geom_point(alpha=.8, color = "red")

  plot1 = ggplot(df, aes_string(var1)) + geom_density(alpha=.5, fill = "red") 
  plot1 = plot1 + ylab("G1 density")

  plot2 = ggplot(df, aes_string(var2)) + geom_density(alpha=.5, fill = "red") 
  plot2 = plot2 + ylab("G2 density")

  # Avoid displaying duplicated legend
  plot1 = plot1 + theme(legend.position="none")
  plot2 = plot2 + theme(legend.position="none")

  # Homogenize scale of shared axes
  min_exp = min(df[[var1]], df[[var2]]) - 0.01
  max_exp = max(df[[var1]], df[[var2]]) + 0.01
  scatter = scatter + ylim(min_exp, max_exp)
  scatter = scatter + xlim(min_exp, max_exp)
  plot1 = plot1 + xlim(min_exp, max_exp)
  plot2 = plot2 + xlim(min_exp, max_exp)
  plot1 = plot1 + ylim(0, 2)
  plot2 = plot2 + ylim(0, 2)

  # Flip axis of gg_dist_g2
  plot2 = plot2 + coord_flip()

  # Remove some duplicate axes
  plot1 = plot1 + theme(axis.title.x=element_blank(),
                        axis.text=element_blank(),
                        axis.line=element_blank(),
                        axis.ticks=element_blank())

  plot2 = plot2 + theme(axis.title.y=element_blank(),
                        axis.text=element_blank(),
                        axis.line=element_blank(),
                        axis.ticks=element_blank())

  # Modify margin c(top, right, bottom, left) to reduce the distance between plots
  #and align G1 density with the scatterplot
  plot1 = plot1 + theme(plot.margin = unit(c(0.5, 0, 0, 0.7), "cm"))
  scatter = scatter + theme(plot.margin = unit(c(0, 0, 0.5, 0.5), "cm"))
  plot2 = plot2 + theme(plot.margin = unit(c(0, 0.5, 0.5, 0), "cm"))

  # Combine all plots together and crush graph density with rel_heights
  perfect = plot_grid(plot1, NULL, scatter, plot2,
                      ncol = 2, rel_widths = c(3, 1), rel_heights = c(1, 3))

  print(perfect)
}

bivariate_plot(df = df_exp, var1 = "var1", var2 = "var2")
g1=c(rnorm(200,平均值=350,标准差=100),rnorm(200,平均值=700,标准差=100))
g2=c(rnorm(200,平均值=350,标准差=100),rnorm(200,平均值=500,标准差=100))
df_exp=data.frame(var1=log2(g1+1),var2=log2(g2+1))

双变量_图这可以使用ggExtra包轻松完成,而不是滚动您自己的解决方案

library(ggExtra)
library(ggplot2)
g1 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=700, sd=100))
g2 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=500, sd=100))
df_exp = data.frame(var1=log2(g1 + 1) , var2=log2(g2 + 1))
g <- ggplot(df_exp, aes(x=var1, y=var2)) + geom_point()
ggMarginal(g) 
库(ggExtra)
图书馆(GG2)
g1=c(rnorm(200,平均值=350,标准差=100),rnorm(200,平均值=700,标准差=100))
g2=c(rnorm(200,平均值=350,标准差=100),rnorm(200,平均值=500,标准差=100))
df_exp=data.frame(var1=log2(g1+1),var2=log2(g2+1))

当我运行你的代码时,我不明白。右边的密度图与底轴对齐。我使用的是R studio,所以我可以在右下面板的图形上看到您的“错误”。但当我按下“缩放”按钮时,会弹出一个窗口,然后图形就可以了。你有没有试着保存图片,看看它看起来怎么样?我上传的是保存的图片!再说一次,我存钱的时候没关系。您只需要更改图形的大小(使其更大)。我们通常要求您提供一个解决方案,以便隔离具体问题。您的示例是可复制的,但不是最小的。有些代码无效(例如,创建
gg_all
),有些代码明显错误(在
aes()
语句中指定颜色)。此外,将所有内容包装到函数中会增加一层复杂性。问题是它在函数内部不起作用,还是与函数无关?如果是后者,为什么要写函数?谢谢。我没有使用GGM,因为我不喜欢箱线图的实现方式。你能更具体一点吗?有可能改变边缘地块的某些方面。很抱歉,答复晚了。关键点是
ggMarginal
创建绘图本身,不允许您创建自己的边缘绘图。关于
ggMarginal
boxplot
,最小值是最低晶须,最大值是最高晶须,因此,它不会将使用Tukey规则检测到的异常值显示为晶须外的单个点。使用ggExtra的v0.7,我看到异常值(
ggMarginal(g,type=“box”)
)。我还可以按如下方式删除它们:
ggMarginal(g,type=“box”,outlier.shape=NA)
@Seymour请注意散点图和密度图之间仍然存在差距。可以通过将y刻度的
展开
选项设置为0来消除该间隙。间隙无关紧要。真正重要的是对齐,因为散点图和边缘图的点。不过,感谢您向我解释如何调整此参数。非常好!克劳斯·威尔克先生,你知道为什么如果我以这样的方式删除“G1密度”和“G2密度”以获得干净的边缘图(没有标签),它们就不再对齐了吗。我怎样才能克服这个问题?是的。如果您想要无轴的干净边缘,请使用
egg
包中的
ggarrange
,而不是
plot\u grid()
。或者使用
cowplot
中的
axis\u canvas
方法:
library(ggExtra)
library(ggplot2)
g1 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=700, sd=100))
g2 = c(rnorm(200, mean=350, sd=100), rnorm(200, mean=500, sd=100))
df_exp = data.frame(var1=log2(g1 + 1) , var2=log2(g2 + 1))
g <- ggplot(df_exp, aes(x=var1, y=var2)) + geom_point()
ggMarginal(g)