【问题标题】:Cannot overlay multiple stat_function with ggplot2无法用 ggplot2 覆盖多个 stat_function
【发布时间】:2017-12-03 18:19:26
【问题描述】:

我有一个表,其中包含一个分箱变量 VAR2_BY_NS_BIN 和一个 x-y 数据对 (MP_BIN,CORRECT_PROP)。我想绘制分箱的数据点,并使用stat_function 为每个箱绘制不同的线,每次使用for loop 采用不同的参考。

test_tab <- data.table(VAR2_BY_NS_BIN=c(0.0005478, 0.0005478, 0.002266, 0.002266, 0.006783, 0.006783, 0.020709, 0.020709, 0.142961, 0.142961),
                       MP_BIN=rep(c(0.505, 0.995), 5),
                       CORRECT_PROP=c(0.5082, 0.7496, 0.5024, 0.8627, 0.4878, 0.9368, 0.4979, 0.9826, 0.4811, 0.9989))

VAR2_BIN <- sort(unique(test_tab$VAR2_BY_NS_BIN)) #get unique bin values
LEN_VAR2_BIN <- length(VAR2_BIN) #get number of bins

col_base <- c("#FF0000", "#BB0033", "#880088", "#3300BB", "#0000FF") #mark bins with different colours

p <- ggplot(data = test_tab)

for (i in 1:LEN_VAR2_BIN) {
  p <- p + geom_point(data = test_tab[test_tab$VAR2_BY_NS_BIN==VAR2_BIN[i],],
                      aes(x = MP_BIN, y = CORRECT_PROP),
                      col = col_base[i],
                      alpha = 0.5) +
           stat_function(fun = function(t) {VAR2_BIN[i]*(t-0.5)+0.5}, col = col_base[i])
}

p <- p + xlab("MP") + ylab("Observed proportion")
print(p)

然而,上面的代码(一个可重现的例子)总是返回一个只绘制最后一条stat_function 线的图(在上面的例子中是第 5 行)。

以下代码(不使用for loop)有效,但实际上我有大量的垃圾箱,所以不太可行......

p <- p + stat_function(fun = function(t) {VAR2_BIN[1]*(t-0.5)+0.5}, col = col_base[1])
p <- p + stat_function(fun = function(t) {VAR2_BIN[2]*(t-0.5)+0.5}, col = col_base[2])
p <- p + stat_function(fun = function(t) {VAR2_BIN[3]*(t-0.5)+0.5}, col = col_base[3])
p <- p + stat_function(fun = function(t) {VAR2_BIN[4]*(t-0.5)+0.5}, col = col_base[4])
p <- p + stat_function(fun = function(t) {VAR2_BIN[5]*(t-0.5)+0.5}, col = col_base[5])

提前致谢!

【问题讨论】:

    标签: r for-loop ggplot2


    【解决方案1】:

    您不需要 for 循环或 stat_function。要绘制这些点,只需将 MP_BINCORRECT_PROP 映射到 x 和 y,只需调用 geom_point 即可绘制这些点。对于线条,您可以动态创建必要的值(如下面的代码中所做的那样)并使用geom_line 绘制这些值。

    library(tidyverse)
    
    ggplot(test_tab %>% mutate(model=VAR2_BY_NS_BIN*(MP_BIN - 0.5) + 0.5), 
           aes(x=MP_BIN, colour=factor(VAR2_BY_NS_BIN))) +
      geom_point(aes(y=CORRECT_PROP)) +
      geom_line(aes(y=model)) +
      labs(colour="VAR2_BY_NS_BIN") +
      guides(colour=guide_legend(reverse=TRUE))
    

    就您在 for 循环中遇到的问题而言,在您打印绘图之前,ggplot 实际上并没有评估循环变量 (i)。打印绘图时,i 的值在循环结束时为 5,因此这是您得到的唯一行。您可以在 Stack Overflow 上找到与此问题相关的几个问题。 Here's one of them.

    【讨论】:

    • 非常感谢,这个解决方案对我有用。请问如何定义自己的配色方案?
    • + scale_fill_manual(values=c("red", "blue", "green"))。您只需要 values 成为 n 个颜色的向量(在这种情况下 n=3)。默认等同于+ scale_fill_manual(values=hcl(seq(15,375,length.out=4)[1:3], 100, 65))。也可以see here 获取其他选项。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    相关资源
    最近更新 更多