geom_points 的选择性抖动
selective jitter of geom_points
我有一个 ggplot,其中一些点与其他一些点重叠。我想知道是否有办法将一个点放在另一个点之上。就我而言,最多有2个点重叠。
x=c(1,1,2,3,4,4)
y=c('a1','a1','a2','a3','a4','a4')
type = c('A','B','C','A','B','C')
data = as.data.frame(cbind(x,y,type))
ggplot() + geom_point(data = data, aes(x=x,y=y, color = type, fill = type), size = 2, shape = 25)
这里我们看到点 x=1 and y=a1
type A
位于 type B
下面,但我希望 Type B
垂直移动一点。
如果我使用抖动,所有东西都会移位,包括没有重叠的点。
我们可以使用 duplicated
或任何类似的函数来检测重叠,然后我们可以使用带有 jitter
的 R 索引来选择性地应用抖动。
我把它写成一个函数:
selective_jitter <- function(x, # x = x co-ordinate
y, # y = y co-ordinate
g # g = group
){
x <- as.numeric(x)
y <- as.numeric(y)
a <- cbind(x, y)
a[duplicated(a)] <- jitter(a[duplicated(a)], amount = .15) # amount could be made a parameter
final <- cbind(a, g)
return(final)
}
data <- as.data.frame(selective_jitter(data$x, data$y, data$type))
ggplot() + geom_point(data = data, aes(x=x,y=y, color = g, fill = type), size = 2, shape = 25)
有很多不同的写法或调整它的方法。例如,我认为一个非常好的调整是为 jitter()
的 amount
选项添加一个可选参数。
另一个潜在的改进是使用卡尺来查找(近似)重复项以及完全相同的重复项(而 duplicated
只会找到完全相同的重复项)。
最后说明 - 有时当我这样做时我喜欢使用半透明颜色而不是 jitter
。这种变化只有在系列数 (type
) 很小的情况下才有效,这样你就可以做一些事情,比如有 1 个黄色系列,1 个蓝色系列,然后它们的重叠将是绿色的(现有的解决方案在Stack Overflow)证明如果你有兴趣。
只是转换 y
值的另一种方式。基本思路和Hack-R类似:
library(data.table)
setDT(data)
data[, y2 := as.numeric(y) + 0.2* (rowid(y) - 1)]
ggplot() +
geom_point(data = data,
aes(x=x,y=y2, color = type, fill = type),
size = 2, shape = 25) +
scale_y_continuous(breaks = seq_len(uniqueN(data$y)), labels = levels(data$y))
注意:我假设 y
是您示例中的一个因素。否则,您可以使用 data$y <- factor(data$y)
.
将 y
从字符转换为因子
我有一个 ggplot,其中一些点与其他一些点重叠。我想知道是否有办法将一个点放在另一个点之上。就我而言,最多有2个点重叠。
x=c(1,1,2,3,4,4)
y=c('a1','a1','a2','a3','a4','a4')
type = c('A','B','C','A','B','C')
data = as.data.frame(cbind(x,y,type))
ggplot() + geom_point(data = data, aes(x=x,y=y, color = type, fill = type), size = 2, shape = 25)
这里我们看到点 x=1 and y=a1
type A
位于 type B
下面,但我希望 Type B
垂直移动一点。
如果我使用抖动,所有东西都会移位,包括没有重叠的点。
我们可以使用 duplicated
或任何类似的函数来检测重叠,然后我们可以使用带有 jitter
的 R 索引来选择性地应用抖动。
我把它写成一个函数:
selective_jitter <- function(x, # x = x co-ordinate
y, # y = y co-ordinate
g # g = group
){
x <- as.numeric(x)
y <- as.numeric(y)
a <- cbind(x, y)
a[duplicated(a)] <- jitter(a[duplicated(a)], amount = .15) # amount could be made a parameter
final <- cbind(a, g)
return(final)
}
data <- as.data.frame(selective_jitter(data$x, data$y, data$type))
ggplot() + geom_point(data = data, aes(x=x,y=y, color = g, fill = type), size = 2, shape = 25)
有很多不同的写法或调整它的方法。例如,我认为一个非常好的调整是为 jitter()
的 amount
选项添加一个可选参数。
另一个潜在的改进是使用卡尺来查找(近似)重复项以及完全相同的重复项(而 duplicated
只会找到完全相同的重复项)。
最后说明 - 有时当我这样做时我喜欢使用半透明颜色而不是 jitter
。这种变化只有在系列数 (type
) 很小的情况下才有效,这样你就可以做一些事情,比如有 1 个黄色系列,1 个蓝色系列,然后它们的重叠将是绿色的(现有的解决方案在Stack Overflow)证明如果你有兴趣。
只是转换 y
值的另一种方式。基本思路和Hack-R类似:
library(data.table)
setDT(data)
data[, y2 := as.numeric(y) + 0.2* (rowid(y) - 1)]
ggplot() +
geom_point(data = data,
aes(x=x,y=y2, color = type, fill = type),
size = 2, shape = 25) +
scale_y_continuous(breaks = seq_len(uniqueN(data$y)), labels = levels(data$y))
注意:我假设 y
是您示例中的一个因素。否则,您可以使用 data$y <- factor(data$y)
.
y
从字符转换为因子