我试图找到一种使用相同功能绘制不同大小的数据帧的方法。该数据与下面的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;一样,看起来不错? (我对模糊性感到抱歉,但我不知道如何更具体。)
答案 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.rows
是in my kimisc
package)。
如果您确实要显示所有积分,请在alpha
中使用geom_point
值。一定要将您的绘图导出为光栅而不是矢量图像,否则需要很长时间才能渲染:
geom_point(aes(...), alpha=get_reasonable_alpha_value(df))
您必须进行一些实验才能实施get_reasonable_alpha_value
。它应该返回0(完全透明)和1(不透明)之间的值。
也许二维密度估计会更适合你:
geom_density2d(...)