R控制抖动功能-避免过度抽签/非随机抖动

R控制抖动功能-避免过度抽签/非随机抖动,r,ggplot2,data-visualization,jitter,R,Ggplot2,Data Visualization,Jitter,我的问题似乎很简单,我使用ggplot2和geom_jitter()来绘制变量。(以我的照片为例) 抖动现在向变量添加一些随机噪声(在本例中,该变量仅称为“1”),以防止过度抽签。所以我现在有y方向上的随机噪声,很明显,如果没有这些噪声,就会完全过涂,现在可以更好地看到 但我的问题是: 正如你所看到的,仍然有一些观点,它们相互之间的差距过大。在我这里的例子中,如果不是y方向的随机噪声,这是很容易避免的。。。但不知何故,更具战略意义的补偿 我能否以某种方式改变geom_jitter()的行为,或者

我的问题似乎很简单,我使用ggplot2
geom_jitter()
来绘制变量。(以我的照片为例)

抖动现在向变量添加一些随机噪声(在本例中,该变量仅称为“1”),以防止过度抽签。所以我现在有y方向上的随机噪声,很明显,如果没有这些噪声,就会完全过涂,现在可以更好地看到

但我的问题是:

正如你所看到的,仍然有一些观点,它们相互之间的差距过大。在我这里的例子中,如果不是y方向的随机噪声,这是很容易避免的。。。但不知何故,更具战略意义的补偿

我能否以某种方式改变
geom_jitter()
的行为,或者在ggplot2中是否有类似的函数可以做到这一点?

不是一个真正的最小的示例,但也不是太长:

library("imputeTS")
library("ggplot2")

data <- tsAirgap


# 2.1 Create required data

# Get all indices of the data that comes directly before and after an NA

na_indx_after <- which(is.na(data[1:(length(data) - 1)])) + 1
# starting from index 2 moves all indexes one in front, so no -1 needed for before
na_indx_before <- which(is.na(data[2:length(data)]))

# Get the actual values to the indices and put them in a data frame with a label
before <- data.frame(id = "1", type = "before", input = na_remove(data[na_indx_before]))
after <- data.frame(id = "1", type = "after", input = na_remove(data[na_indx_after]))
all <- data.frame(id = "1", type = "source", input = na_remove(data))

# Get n values for the plot labels
n_before <- length(before$input)
n_all <- length(all$input)
n_after <- length(after$input)



# 2.4 Create dataframe for ggplot2

# join the data together in one dataframe
df <- rbind(before, after, all)


# Create the plot

gg <- ggplot(data = df) +
  geom_jitter(mapping = aes(x = id, y = input, color = type, alpha = type), width = 0.5 , height = 0.5) 

gg <- gg + ggplot2::scale_color_manual(
  values = c("before" = "skyblue1", "after" = "yellowgreen","source" = "gray66"),
)

gg <- gg + ggplot2::scale_alpha_manual(
  values = c("before" = 1, "after" = 1,"source" = 0.3),
)

gg + ggplot2::theme_linedraw() + theme(aspect.ratio = 0.5) + ggplot2::coord_flip()
库(“输入项”)
图书馆(“ggplot2”)

数据我想到了一个我非常喜欢的黑客,使用
ggrepel
。它通常用于标签,但不会阻止您将标签变成点

df <- data.frame(x = rnorm(200),
                 col = sample(LETTERS[1:3], 200, replace = TRUE),
                 y = 1)

ggplot(df, aes(x, y, label = "●", color = col)) + # using unicode black circle
  ggrepel::geom_text_repel(segment.color = NA, 
                           box.padding = 0.01, key_glyph = "point")

我想到了一个我非常喜欢的黑客,使用
ggrepel
。它通常用于标签,但不会阻止您将标签变成点

df <- data.frame(x = rnorm(200),
                 col = sample(LETTERS[1:3], 200, replace = TRUE),
                 y = 1)

ggplot(df, aes(x, y, label = "●", color = col)) + # using unicode black circle
  ggrepel::geom_text_repel(segment.color = NA, 
                           box.padding = 0.01, key_glyph = "point")

我想到了一个我非常喜欢的黑客,使用
ggrepel
。它通常用于标签,但不会阻止您将标签变成点

df <- data.frame(x = rnorm(200),
                 col = sample(LETTERS[1:3], 200, replace = TRUE),
                 y = 1)

ggplot(df, aes(x, y, label = "●", color = col)) + # using unicode black circle
  ggrepel::geom_text_repel(segment.color = NA, 
                           box.padding = 0.01, key_glyph = "point")

我想到了一个我非常喜欢的黑客,使用
ggrepel
。它通常用于标签,但不会阻止您将标签变成点

df <- data.frame(x = rnorm(200),
                 col = sample(LETTERS[1:3], 200, replace = TRUE),
                 y = 1)

ggplot(df, aes(x, y, label = "●", color = col)) + # using unicode black circle
  ggrepel::geom_text_repel(segment.color = NA, 
                           box.padding = 0.01, key_glyph = "point")

我不知道ggplot2内置了什么东西来实现这一点。您可以查看
ggbeesarm
软件包,了解一些关于这方面的选项。但它可能不是您想要的,因为它将所有点朝中心线打包在一起。您也可以定义一个拟随机函数来实现这一点,例如使用
poissoned
poissondisc
包。或者,如果你想做得过火,你可以使用
粒子
创建一个模拟,以排斥任何重叠的点。我们可以做一个模拟吗?我认为
ggplot(df,aes(x,y,color=col,fill=col))+geom_点图(stackdir=“center”,binwidth=0.1,alpha=0.5)
(使用@JonSpring的例子,但我认为它对variable
y
不起作用。你们帮了我很大的忙!我显然很难找到合适的谷歌术语。Ben的解决方案对我来说也很有用(见我编辑的答案)。Ben,你也可以添加这个作为答案。好的是,除了ggplot2之外,它不需要额外的软件包。但我也非常喜欢GGBeeSarm软件包附带的所有可能性。很好,我已经从没有令人满意的解决方案变成了在一天内从多个好的解决方案中进行选择。非常感谢。我不知道ggp中有什么内置的东西lot2完成此操作。您可以查看
ggbeeswarm
软件包以获取有关此操作的一些选项。但它可能不是您想要的,因为它将所有点打包到中心线。您可以交替定义一个拟随机函数来完成此操作,例如使用
poissoned
poissondisc
软件包。或者如果您想要的话你可以使用粒子创建一个模拟来排斥任何重叠的点。我们可以有一个请吗?我想,
ggplot(df,aes(x,y,color=col,fill=col))+geom_点图(stackdir=“center”,binwidth=0.1,alpha=0.5)
可以(使用@JonSpring的例子,但我认为它对variable
y
不起作用。你们帮了我很大的忙!我显然很难找到合适的谷歌术语。Ben的解决方案对我来说也很有用(见我编辑的答案)。Ben,你也可以添加这个作为答案。好的是,除了ggplot2之外,它不需要额外的软件包。但我也非常喜欢GGBeeSarm软件包附带的所有可能性。很好,我已经从没有令人满意的解决方案变成了在一天内从多个好的解决方案中进行选择。非常感谢。我不知道ggp中有什么内置的东西lot2完成此操作。您可以查看
ggbeeswarm
软件包以获取有关此操作的一些选项。但它可能不是您想要的,因为它将所有点打包到中心线。您可以交替定义一个拟随机函数来完成此操作,例如使用
poissoned
poissondisc
软件包。或者如果您想要的话你可以使用粒子创建一个模拟来排斥任何重叠的点。我们可以有一个请吗?我想,
ggplot(df,aes(x,y,color=col,fill=col))+geom_点图(stackdir=“center”,binwidth=0.1,alpha=0.5)
可以(使用@JonSpring的例子,但我认为它对variable
y
不起作用。你们帮了我很大的忙!我显然很难找到合适的谷歌术语。Ben的解决方案对我来说也很有用(见我编辑的答案)。Ben,你也可以添加这个作为答案。好的是,除了ggplot2之外,它不需要额外的软件包。但我也非常喜欢GGBeeSarm软件包附带的所有可能性。很好,我已经从没有令人满意的解决方案变成了在一天内从多个好的解决方案中进行选择。非常感谢。我不知道ggp中有什么内置的东西lot2完成此操作。您可以查看
ggbeeswarm
软件包以获取有关此操作的一些选项。但它可能不是您想要的,因为它将所有点打包到中心线。您可以交替定义一个拟随机函数来完成此操作,例如使用
poissoned
poissondisc
软件包。或者如果您想要的话你可以使用粒子创建一个模拟来排斥任何重叠的点。我们可以有一个请吗?我想,
ggplot(df,aes(x,y,color=col,fill=col))+geom_点图(stackdir=“center”,binwidth=0.1,alpha=0.5)
可以工作(使用