violin_plot()具有连续轴用于分组变量?

时间:2020-06-11 10:47:22

标签: r ggplot2

由于明显的原因,用于在geom_violin()中创建ggplot2图的分组变量应该是离散的。但是,我的离散值是数字,我想以连续的比例显示它们,以便可以将这些数字的连续功能叠加在小提琴上。玩具示例:

library(tidyverse)
df <- tibble(x = sample(c(1,2,5), size = 1000, replace = T),
             y = rnorm(1000, mean = x))
ggplot(df) + geom_violin(aes(x=factor(x), y=y))

这就像您想象的那样工作:小提琴的x轴值(等距)分别标记为1、2和5,均值分别为y = 1,2,5。我想通过方法覆盖一个连续函数,例如y = x。那可能吗?可预测地添加+ scale_x_continuous()会得到Error: Discrete value supplied to continuous scale。一种解决方案大概可以通过数字x值水平地拉小提琴,即2到5之间的间距是1到2之间的三倍,但这不是我要实现的 only 事情-覆盖连续功能是关键问题。 如果无法做到这一点,则欢迎使用其他可视化建议。我知道我可以用一个简单的散点图来代替小提琴,从而在给定x的情况下给出大致的密度与y的关系。

1 个答案:

答案 0 :(得分:1)

尝试一下。正如您已经猜到的那样,按数值扩展小提琴是解决方案的关键。为此,我将df扩展为包括min(x)max(x)区间中的所有x值,并使用scale_x_discrete(drop = FALSE)以便显示所有值。

注意:感谢@ChrisW提供了我的方法的更一般示例。

library(tidyverse)

set.seed(42) 

df <- tibble(x = sample(c(1,2,5), size = 1000, replace = T), y = rnorm(1000, mean = x^2))
# y = x^2  
# add missing x values 
x.range <- seq(from=min(df$x), to=max(df$x)) 
df <- df %>% right_join(tibble(x = x.range))
#> Joining, by = "x"
# Whatever the desired continuous function is: 
df.fit <- tibble(x = x.range, y=x^2) %>% 
  mutate(x = factor(x))

ggplot() + 
  geom_violin(data=df, aes(x = factor(x, levels = 1:5), y=y)) + 
  geom_line(data=df.fit, aes(x, y, group=1), color = "red") + 
  scale_x_discrete(drop = FALSE)
#> Warning: Removed 2 rows containing non-finite values (stat_ydensity).

reprex package(v0.3.0)于2020-06-11创建