由于明显的原因,用于在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的关系。
答案 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创建