"facet_grid" 和 overplot:令人费解的行为
"facet_grid" and overplot: puzzling behaviour
我正在使用 facet_grid()
绘制一些数据,我注意到一些令人费解的事情。
我预计我是 ggplot 库的初学者,我可能错过了一些东西。无论如何,就这样吧。
假设以下数据框:
library(ggplot2)
d1 <- runif(500)
d2 <- runif(500)*10
s1 <- sample(LETTERS[1:2], 500, replace = T, prob=c(0.3, 0.7))
s2 <- sample(letters[3:4], 500, replace = T, prob=c(0.4, 0.6))
df <- data.frame(s1, s2, d1, d2)
看起来像这样:
s2 s1 d1 d2
c B 0.3434944 0.9881925
d A 0.7847741 9.7759946
d A 0.3142764 2.3654268
...
我绘制数据以便根据分类值对它们进行排序:
ggplot(df, aes(x=df$d1, y=df$d2)) +
geom_point(col="red", cex=2) +
facet_grid(d2 ~ d1)
导致以下情节:
Plot 1
我现在只想绘制数据的一个子集,我使用了以下(这里是简化的)代码:
geom_point(data=df[df$d2 > 7.5,],
aes(x=df$d1[df$d2 > 7.5], y=df$d2[df$d2 > 7.5]),
cex=1, colour=I("black"))
导致以下情节:
Plot 2
现在,设置了一个阈值后,我希望所有值,比如 "bigger than threshold" 都绘制到预先存在的值上。
情况似乎并非如此。
事实上,一些预先存在的值没有匹配的阈值。此外,一些阈值没有匹配的预先存在的值。最让我困惑的是,据我所知,数据点来自同一个数据帧,我希望第一层(预先存在的)包含第二层。我在这里遗漏了什么吗?
此外,如果仔细观察,绘制的点与正确的二维位置匹配,尽管它们位于错误的象限中。
更令人费解:如果我绘制以下子集:
ggplot(df[df$d2 < 7.5,], aes(x=df$d1[df$d2 < 7.5], y=df$d2[df$d2 < 7.5])) +
geom_point(col="red", cex=2) +
facet_grid(d2 ~ d1) +
geom_point(data=df[df$d2 > 7.5,], aes(x=df$d1[df$d2 > 7.5], y=df$d2[df$d2 > 7.5]), cex=1, colour=I("black"))
一些预先存在的值从区域 "above threshold" 移动到 "below threshold"。有人可以解释这种行为吗?
非常感谢。
我无法准确解释你的问题的 为什么 ,但我认为你的绘图函数中的 subsets
没有识别这些方面。通过在 dataframe
中创建一个新的 T/F
列,我们可以控制每个个体的颜色和大小 facet
。这个好用吗?
编辑 使用空心点 shape=21
和 scale_fill_manual
来准确解决问题。
df$d<-df$d2>7.5
ggplot(data=df, aes(x=d1, y=d2,colour=d,size=d,fill=d))+
facet_grid(s1~s2)+
geom_point(show.legend=F,shape=21,size=2,stroke=1.5,col="red")+
scale_fill_manual(values=setNames(c('black','red'),c(T,F)))
我正在使用 facet_grid()
绘制一些数据,我注意到一些令人费解的事情。
我预计我是 ggplot 库的初学者,我可能错过了一些东西。无论如何,就这样吧。
假设以下数据框:
library(ggplot2)
d1 <- runif(500)
d2 <- runif(500)*10
s1 <- sample(LETTERS[1:2], 500, replace = T, prob=c(0.3, 0.7))
s2 <- sample(letters[3:4], 500, replace = T, prob=c(0.4, 0.6))
df <- data.frame(s1, s2, d1, d2)
看起来像这样:
s2 s1 d1 d2
c B 0.3434944 0.9881925
d A 0.7847741 9.7759946
d A 0.3142764 2.3654268
...
我绘制数据以便根据分类值对它们进行排序:
ggplot(df, aes(x=df$d1, y=df$d2)) +
geom_point(col="red", cex=2) +
facet_grid(d2 ~ d1)
导致以下情节:
Plot 1
我现在只想绘制数据的一个子集,我使用了以下(这里是简化的)代码:
geom_point(data=df[df$d2 > 7.5,],
aes(x=df$d1[df$d2 > 7.5], y=df$d2[df$d2 > 7.5]),
cex=1, colour=I("black"))
导致以下情节:
Plot 2
现在,设置了一个阈值后,我希望所有值,比如 "bigger than threshold" 都绘制到预先存在的值上。
情况似乎并非如此。
事实上,一些预先存在的值没有匹配的阈值。此外,一些阈值没有匹配的预先存在的值。最让我困惑的是,据我所知,数据点来自同一个数据帧,我希望第一层(预先存在的)包含第二层。我在这里遗漏了什么吗?
此外,如果仔细观察,绘制的点与正确的二维位置匹配,尽管它们位于错误的象限中。
更令人费解:如果我绘制以下子集:
ggplot(df[df$d2 < 7.5,], aes(x=df$d1[df$d2 < 7.5], y=df$d2[df$d2 < 7.5])) +
geom_point(col="red", cex=2) +
facet_grid(d2 ~ d1) +
geom_point(data=df[df$d2 > 7.5,], aes(x=df$d1[df$d2 > 7.5], y=df$d2[df$d2 > 7.5]), cex=1, colour=I("black"))
一些预先存在的值从区域 "above threshold" 移动到 "below threshold"。有人可以解释这种行为吗?
非常感谢。
我无法准确解释你的问题的 为什么 ,但我认为你的绘图函数中的 subsets
没有识别这些方面。通过在 dataframe
中创建一个新的 T/F
列,我们可以控制每个个体的颜色和大小 facet
。这个好用吗?
编辑 使用空心点 shape=21
和 scale_fill_manual
来准确解决问题。
df$d<-df$d2>7.5
ggplot(data=df, aes(x=d1, y=d2,colour=d,size=d,fill=d))+
facet_grid(s1~s2)+
geom_point(show.legend=F,shape=21,size=2,stroke=1.5,col="red")+
scale_fill_manual(values=setNames(c('black','red'),c(T,F)))