我有一个包含三列的数据框“ data”。第一列是化合物,第二列是化合物的浓度,第三列是我的测量数据,称为“面积”。
# A tibble: 12 x 3
Compound Conc Area
<chr> <dbl> <dbl>
1 Compound 1 0 247
2 Compound 1 5 44098
3 Compound 1 100 981797
4 Compound 1 1000 7084602
5 Compound 2 0 350
6 Compound 2 5 310434
7 Compound 2 100 6621537
8 Compound 2 1000 49493832
9 Compound 3 0 26
10 Compound 3 5 7707
11 Compound 3 100 174026
12 Compound 3 1000 1600143
我想使用geom_point为每个化合物创建多面图,并在完整的x轴上应用geom_smooth。为了在较低的浓度范围内进行详细研究,我应用了coord_cartesian将x轴限制为0到110。
但是,每个方面都采用给定化合物的最大值。由于化合物之间的比例差异很大,因此我不能使用固定的ylim,因为每种化合物都必须不同(在我的实际数据中,我有20多种化合物)。
是否有可能将y轴从0的最小值设置为最大值,将每面的最大值设置为可见值?
我拥有的代码(没有尝试限制y轴的方法是:
ggplot(data = data, aes(Conc, Area)) +
geom_point(size = 2.5) +
geom_smooth(method = "lm") +
facet_wrap(~Compound, ncol = 3, scales = "free_y") +
theme_bw() +
theme(legend.position = "bottom") +
coord_cartesian(xlim = c(0,110))
答案 0 :(得分:0)
我想出一种解决方法来获得想要的结果。 创建数据的子集后,我创建了一个循环以绘制所有数据。 子集数据用于确定coord_cartesian中的ylim。 使用生成的图列表,我可以使用gridExtra包在网格中对它们进行排序。
data_100 <- data %>%
filter(Conc <= 110)
loop.vector <- unique(data$Compound)
plot_list = list()
for (i in seq_along(loop.vector)) {
p = ggplot(subset(data, data$Compound==loop.vector[i]),
aes(Conc, Area)) +
geom_point(size=2.5) +
geom_smooth(method = "lm", se = FALSE) +
theme_bw() +
theme(legend.position="bottom") +
coord_cartesian(xlim = c(0,110),
ylim = c(0, max(data_100$Area[data_100$Compound==loop.vector[i]]))) +
labs(title = loop.vector[i])
plot_list[[i]] = p
print(p)
}