【问题标题】:How do I use R to create a plot of a data frame that has 3 variables?如何使用 R 创建具有 3 个变量的数据框图?
【发布时间】:2014-04-19 22:00:47
【问题描述】:

我正在使用 logit 回归并创建了一个模型,该模型根据 FICO 分数和请求的金额来预测获得贷款的可能性。我创建了一个包含概率函数结果的数据框——行是潜在的 FICO 分数,列是潜在的请求贷款值。对于每一行和每一列,都有一个值“真”或“假”,“真”表示个人获得贷款的概率 >= .50。

如何根据我的数据框中的信息绘制一个散点图,在(FICO 分数,贷款价值)处绘制一个点,并且图中的绿色圆圈表示“真”值,红色 X 表示那些“假”的值?另外,有没有比散点图更好的方法来表示这种类型的数据?

【问题讨论】:

    标签: r plot dataframe


    【解决方案1】:

    如果我了解您想要做什么,我认为热图可能会更好。在 R 中有不止一种方法可以做到这一点。ggplot2geom_tile 提供了一种非常好的方法来做到这一点,前提是您首先重塑数据:

    # using http://www.free-ocr.com/ to OCR your image gives:
    dat <- structure(list(FICO = c(640L, 650L, 660L, 670L, 680L, 690L, 700L, 
    710L, 720L, 730L, 740L, 750L, 760L, 770L, 780L, 790L, 800L, 810L, 
    820L, 830L), `1000` = c(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE), `1500` = c(FALSE, FALSE, FALSE, FALSE, FALSE, 
    FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE), `2000` = c(FALSE, FALSE, FALSE, 
    FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `2500` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `3000` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `3500` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `4000` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `4500` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `5000` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), `5500` = c(FALSE, 
    FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, 
    TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE)), .Names = c("FICO", 
    "1000", "1500", "2000", "2500", "3000", "3500", "4000", "4500", 
    "5000", "5500"), class = "data.frame", row.names = c(NA, -20L
    ))
    
    # now melt that data 
    dat.m <- melt(dat, "FICO")
    colnames(dat.m) <- c("FICO.Score", "Loan.Value", "p(loan)>0.50")
    
    # and use ggplot with geom_tile to make a heatmap
    gg <- ggplot(dat.m, aes(x=FICO.Score, y=Loan.Value))
    gg <- gg + geom_tile(aes(fill=`p(loan)>0.50`), color="white")
    gg <- gg + theme_bw()
    gg <- gg + labs(x="", y="")
    gg <- gg + theme(panel.border=element_blank())
    gg <- gg + theme(panel.grid=element_blank())
    gg 
    

    【讨论】:

      【解决方案2】:

      lattice 包非常适合您想要的情节。这是一个带有一些虚假数据的示例

      > z <- as.logical(sample(TRUE:FALSE, 10, TRUE))
      > d <- data.frame(x = 1:10, y = 101:110, z)
      > d
      ##     x   y     z
      ## 1   1 101 FALSE
      ## 2   2 102 FALSE
      ## 3   3 103 FALSE
      ## 4   4 104  TRUE
      ## 5   5 105 FALSE
      ## 6   6 106 FALSE
      ## 7   7 107 FALSE
      ## 8   8 108 FALSE
      ## 9   9 109  TRUE
      ## 10 10 110  TRUE
      
      > library(lattice)
      > xyplot(y ~ x, data = d, groups = z, col = c("red", "green"), pch = 19)
      

      【讨论】:

      • 谢谢!格子包绝对看起来像我正在寻找的东西。不过,我不确定我的数据是否以正确的方式构建以使用 xy 函数——目前看起来像这样:i.imgur.com/ocqd2c3.png——所以我认为我的一维太多了?我可以插入一个以列名作为值的行列,但我不确定如何生成一个绘制所有行值的图。我是否必须遍历每一行并将它们作为新点添加到图表中或沿着这些线添加?
      【解决方案3】:

      您也可以使用ggplot2 执行此操作。

      一些 FICO 数据的样本:

      fico <- structure(list(LoanValue = c(20000, 19200, 35000, 9975, 12000, 6000, 10000, 33450, 14675, 7000, 2000, 10625, 27975, 34950, 9600, 24975, 10000, 13900.25, 10000, 5175, 21975, 30000, 6500, 17400, 4000, 7200, 8000, 8000, 3000, 14500, 23850, 14000, 34975, 16000, 7019.25, 7975, 7200, 20125, 11875, 1850, 3200, 12725, 5500, 15650, 9000, 5000, 3000, 19975, 5450, 14000, 8799.04, 3000, 32000, 22250, 7300, 16450, 2500, 6000, 27575, 1000, 12000, 30000, 13500, 9000, 15000, 5300, 7000, 19975, 14993.57, 8000, 23947.48, 7500, 16875, 12000, 6000, 825, 4500, 1600, 10000, 18525, 7450, 3225, 23675, 12000, 25000, 15850, 4175, 10000, 6000, 6000, 7925, 15925, 9500, 6000, 9975, 7000, 4500, 12000, 10375, 4800), FICOscore = c(735L, 715L, 690L, 695L, 695L, 670L, 720L, 705L, 685L, 715L, 670L, 665L, 670L, 735L, 725L, 730L, 695L, 740L, 730L, 760L, 665L, 695L, 665L, 695L, 670L, 705L, 675L, 675L, 765L, 760L, 685L, 685L, 720L, 685L, 675L, 780L, 720L, 830L, 715L, 660L, 670L, 720L, 660L, 660L, 675L, 715L, 710L, 670L, 785L, 705L, 750L, 660L, 700L, 665L, 680L, 725L, 670L, 715L, 690L, 755L, 705L, 715L, 680L, 665L, 730L, 725L, 685L, 685L, 705L, 695L, 695L, 715L, 735L, 665L, 670L, 670L, 790L, 700L, 665L, 725L, 710L, 760L, 680L, 690L, 695L, 725L, 810L, 675L, 750L, 685L, 665L, 765L, 670L, 675L, 675L, 750L, 765L, 735L, 665L, 670L)), .Names = c("LoanValue", "FICOscore"), class = "data.frame", row.names = c(NA, -100L))
      

      创建一个人为的propability:

      fico$getloan <- ifelse(fico$FICOscore<700, "0", "1")
      

      加载ggplot2包:

      require(ggplot2)
      

      创建散点图:

      ggplot(fico, aes(x=FICOscore, y=LoanValue)) +
        geom_point(aes(color=getloan))
      

      给出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2020-09-16
        相关资源
        最近更新 更多