【问题标题】:Plot one data frame column against all other columns using ggplots and showing densities in R使用 ggplots 绘制一个数据框列与所有其他列并在 R 中显示密度
【发布时间】:2018-06-13 14:40:31
【问题描述】:

我有一个包含 20 列的数据框,我想针对数据框中的每一列绘制一个特定列(称为 BB)。我需要的图是概率密度图,我正在使用以下代码生成一个图(以 BB 列与 AA 列为例):

mydata = as.data.frame(fread("filename.txt")) #read my data as data frame

#function to calculate density
get_density <- function(x, y, n = 100) {
  dens <- MASS::kde2d(x = x, y = y, n = n)
  ix <- findInterval(x, dens$x)
  iy <- findInterval(y, dens$y)
  ii <- cbind(ix, iy)
  return(dens$z[ii])
}
set.seed(1)

#define the x and y of the plot; x = column called AA; y = column called BB
xy1 <- data.frame(
  x = mydata$AA,
  y = mydata$BB
)

#call function get_density to calculate density for the defined x an y
xy1$density <- get_density(xy1$x, xy1$y) 

#Plot
ggplot(xy1) + geom_point(aes(x, y, color = density), size = 3, pch = 20) + scale_color_viridis() +
  labs(title = "BB vs. AA") +
  scale_x_continuous(name="AA") +
  scale_y_continuous(name="BB")

如果有人可以建议一种方法,使用上述密度函数和 ggplot 命令生成多个 BB 图,将不胜感激。 我尝试添加一个循环,但发现它太复杂了特别是在定义要绘制的 x 和 y 或调用密度函数时。

【问题讨论】:

  • 您可以发布您的数据吗?

标签: r dataframe ggplot2 probability-density


【解决方案1】:

由于您不提供示例数据,我将在mtcars 上进行演示。我们将数据转换为长格式,计算密度,并制作多面图。我们将mpg 列与所有其他列进行对比。

library(dplyr)
library(tidyr)
mtlong = gather(mtcars, key = "var", value = "value", -mpg) %>%
    group_by(var) %>%
    mutate(density = get_density(value, mpg))

ggplot(mtlong, aes(x = value, y = mpg, color = density)) +
    geom_point(pch = 20, size = 3) +
    labs(x = "") +
    facet_wrap(~ var, scales = "free")

【讨论】:

  • 我尝试了以下方法: mtlong = gather(mydata, key = "var", value = "value", -mydata$BB) %>% group_by(var) %>% mutate( density = get_density(mydata$BB, value)),并得到这个错误:错误:NULL 必须计算为列位置或名称,而不是双向量
  • 不要在 dplyr 动词中使用 data$。您似乎已将 mpg 替换为 mydata$BBmpg 应替换为 BB。如果我的代码使用mtcars$,则仅使用mydata$
  • 谢谢,看来这行得通。进行您建议的更改后,我遇到了另一个错误: mutate_impl(.data, dots) 中的错误:评估错误:带宽必须严格为正。这是什么意思?
  • 听起来像是kde2d 中的错误。你可以see it here in the kde2d code
  • 知道如何解决这个问题吗?
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2013-04-25
  • 2011-06-20
相关资源
最近更新 更多