R:具有大小数据帧的类似图

时间:2013-12-15 21:24:58

标签: r ggplot2

我试图找到一种使用相同功能绘制不同大小的数据帧的方法。该数据与下面的dfs非常相似。 xs的顺序并不重要。

GetDf <- function(n)
  data.frame(x = seq(1, n), y = rnorm(n, 3.5, 0.5), group = runif(n) > 0.5)

PlotIt <- function(df) {
  p <- ggplot(df) + geom_point(aes(x = x, y = y, colour = group)) +
        expand_limits(y = 1) + expand_limits(y = 5) +
        geom_hline(aes(yintercept = c(2.5, 4.5)), linetype = "dotdash")
  print(p)
}

df1 <- GetDf(1000)
df2 <- GetDf(10000)
df3 <- GetDf(100000)
df4 <- GetDf(1000000)

PlotIt(df1)看起来不错,但PlotIt(df2)已经糟糕了。点重叠。当n很大时,我可以将点大小设置得更小,但是df1-df4的图表看起来会完全不同。如果大小是固定的,那么df3的图需要大小= 0.75,而PlotIt(df1)是坏的。

我知道有一个库hexbin和geom_hex(),但它似乎并没有产生我想要的东西。我想让不同颜色的组显示,hexbin不适合绘制df1等。

最好的方法是至少绘制df1 - df3,最好也是df4,这样情节会感觉到#34;一样,看起来不错? (我对模糊性感到抱歉,但我不知道如何更具体。)

2 个答案:

答案 0 :(得分:3)

我跟着krlmlr回答,写了一个从df的行数计算alpha的函数。此外,选择更好的形状使得情节更好。低alpha值需要override.aes。

PlotIt <- function(df) {
  Alpha <- function(x) pmax(0.1, pmin(1, 2.05 - 0.152 * log(x)))
  p <- ggplot(df) + 
    geom_point(aes(x = x, y = y, colour = group), size = 1.5,
               shape = 1, alpha = Alpha(nrow(df))) +
    expand_limits(y = 1) + expand_limits(y = 5) +
    geom_hline(aes(yintercept = c(2.5, 4.5)), linetype = "dotdash") +
    guides(colour = guide_legend(override.aes = list(alpha = 1)))
  print(p)
}

df1-df3的情节看起来对我好(全屏)。这个问题有点类似于Scatterplot with too many points。差异:相同的功能应适用于大小数据帧,x的顺序并不重要。

答案 1 :(得分:2)

我怀疑你不想追踪1000点或更多点的散点图中的各个点。你为什么不用样品?

PlotIt <- function(df) {
  df <- sample.rows(df, 1000, replace=F)
  ...
}

sample.rowsin my kimisc package)。

如果您确实要显示所有积分,请在alpha中使用geom_point值。一定要将您的绘图导出为光栅而不是矢量图像,否则需要很长时间才能渲染:

  geom_point(aes(...), alpha=get_reasonable_alpha_value(df))

您必须进行一些实验才能实施get_reasonable_alpha_value。它应该返回0(完全透明)和1(不透明)之间的值。

也许二维密度估计会更适合你:

  geom_density2d(...)