R语言 根据x轴值在geom_boxplot/geom_violine之间设置可变距离

i5desfxk  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(214)

问题

我有一个x变量-例如大小是有意义的,这样某个东西的大小就可以是另一个东西的两倍。我想把x和y(其他变量)联系起来。同时,由于采样,x不是连续变化的,而是离散的,因为只有几个不同的对象类型,并且相同类型的所有对象具有相同的大小(例如,X)。大小为1、3或10)。我想用像geom_boxplotgeom_violin这样的几何图形来显示x和y之间的关系。
然而,问题是:如果我保持x为数字,那么我只能得到一个箱线图/小提琴。如果我将其转换为一个因子(如下所示),那么几何体之间的距离并不反映x中的距离。例如,1和3之间的距离与3和10之间的距离相同。
有没有一种方法可以离散数据,但改变间距,使其反映x轴上的实际差异,并使用这些几何?

代码

# Seed for reproducibility
set.seed(20230518)

# Create random data
n  <- 10
df <- data.frame(x = factor(rep(c(1, 3, 10), each = n)),
                 y = c(rnorm(n), rnorm(n), rnorm(n)))

# Box plot version
ggplot(df, aes(x = x, y = y)) + geom_boxplot() + geom_point()

# Violine plot verion
ggplot(df, aes(x = x, y = y)) + geom_violin() + geom_point()

箱线图

小提琴

预期解决方案

几何图元之间的距离反映了x的差异。这应该与geom_boxplotgeom_violin类似,除了以下几点:

# Nnumeric
ggplot(df, aes(x = as.numeric(as.character(x)), y = y)) + geom_point()

kyks70gy

kyks70gy1#

也许你想要这个,它反映了实际的距离。

set.seed(20230518)

# Create random data
n  <- 10
df <- data.frame(x = factor(rep(c(1, 3, 10), each = n)),
                 y = c(rnorm(n), rnorm(n), rnorm(n)))

library(ggplot2)
ggplot(df, aes(x = as.numeric(as.character(x)), y = y)) + 
  geom_point() +
  scale_x_continuous(breaks = c(1,3,10))

创建于2023-05-18带有reprex v2.0.2

pqwbnv8z

pqwbnv8z2#

添加缺失因子水平,然后将drop设置为FALSE,这也适用于geom_violin

df$x <- factor(df$x, levels = 1:10)

ggplot(df, aes(x = x, y = y)) + 
  geom_boxplot() + 
  geom_point() +
  scale_x_discrete(drop = FALSE)

添加断点以隐藏其他x值:

scale_x_discrete(drop = FALSE, breaks = unique(sort(df$x)))

相关问题