如何用ggplot2在R中为每个样本绘制不同颜色的最优拟合线
解决ggplot中loess拟合线按Sample分组并匹配颜色的问题
问题说明
使用ggplot绘制滴定曲线时,需要为每个Sample生成对应颜色的loess拟合线,但原始代码的拟合线未按样本分组,尝试修改的代码因参数问题未生效。
原始代码
ggplot(Titration.Aug.9, aes(x = Dilution, y = `X..bound`)) + geom_line(aes(color = Sample)) + geom_point() + geom_smooth(formula = y ~ x, method = "loess", se = FALSE, linetype = "dashed") + scale_x_continuous(trans = "log10", breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x)), minor_breaks = 10^(seq(0, 7, by = 0.25))) + scale_color_brewer(type = "Sample", palette = "Set1") + labs(x = "Antibody Dilution", y = "% Cell Binding") + theme_minimal()
尝试的代码(未生效)
ggplot(Titration.Aug.9, aes(x = Dilution, y = `X..bound`)) +geom_line(aes(color = Sample)) +geom_point() +geom_smooth(formula = y ~ x, method = "loess", se = FALSE,aes(Color=Sample)) +scale_x_continuous(trans = "log10",breaks = trans_breaks("log10", function(x) 10^x),labels = trans_format("log10", math_format(10^.x)),minor_breaks = 10^(seq(0, 7, by = 0.25))) +scale_color_brewer(type="Sample",palette="Set1") +labs(x="Antibody Dilution",y="% Cell Binding") +theme_minimal()
数据集
dput(Titration.Aug.9) structure(list(Dilution = c(300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L, 300L, 900L, 2700L, 8100L, 24300L, 72900L, 218700L), X..bound = c(52.74, 40.31, 30.63, 18.89, 7.57, 0.8, 0.01, 20.23, 11.29, 7.55, 3.24, 0.54, 0.12, 0.03, 53.27, 46.82, 38.17, 26.77, 11.59, 2.23, 0.07, 69.25, 63.55, 56.34, 40.95, 19.35, 2.4, 0.05, 75.8, 68.21, 62.82, 40.33, 11.73, 0.82, 0.04, 85.75, 82.82, 74.29, 46.63, 9.36, 0.24, 0.05, 71.65, 66.54, 56.63, 33.96, 6.33, 0.19, 0.03, 85.43, 86.49, 75.73, 51.62, 15.16, 1.05, 0.01, 92.44, 90.13, 85.92, 72.06, 30.08, 3.15, 0.12 ), Sample = c("1mer 0DA", "1mer 0DA", "1mer 0DA", "1mer 0DA", "1mer 0DA", "1mer 0DA", "1mer 0DA", "1mer 2DA", "1mer 2DA", "1mer 2DA", "1mer 2DA", "1mer 2DA", "1mer 2DA", "1mer 2DA", "1mer 3DA", "1mer 3DA", "1mer 3DA", "1mer 3DA", "1mer 3DA", "1mer 3DA", "1mer 3DA", "1mer 4DA", "1mer 4DA", "1mer 4DA", "1mer 4DA", "1mer 4DA", "1mer 4DA", "1mer 4DA", "5mer 0DA", "5mer 0DA", "5mer 0DA", "5mer 0DA", "5mer 0DA", "5mer 0DA", "5mer 0DA", "5mer 2DA", "5mer 2DA", "5mer 2DA", "5mer 2DA", "5mer 2DA", "5mer 2DA", "5mer 2DA", "5mer 4DA", "5mer 4DA", "5mer 4DA", "5mer 4DA", "5mer 4DA", "5mer 4DA", "5mer 4DA", "5mer 2DA GDG", "5mer 2DA GDG", "5mer 2DA GDG", "5mer 2DA GDG", "5mer 2DA GDG", "5mer 2DA GDG", "5mer 2DA GDG", "5mer 2DA GDGDG", "5mer 2DA GDGDG", "5mer 2DA GDGDG", "5mer 2DA GDGDG", "5mer 2DA GDGDG", "5mer 2DA GDGDG", "5mer 2DA GDGDG" )), class = "data.frame", row.names = c(NA, -63L))
解决方案
问题核心是:
geom_smooth中用了大写的Color,ggplot美学参数为小写color;- 未让拟合线按
Sample分组,将颜色映射放到全局aes可自动实现分组。
修正后的代码:
ggplot(Titration.Aug.9, aes(x = Dilution, y = `X..bound`, color = Sample)) + geom_line() + geom_point() + geom_smooth(formula = y ~ x, method = "loess", se = FALSE, linetype = "dashed") + scale_x_continuous(trans = "log10", breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x)), minor_breaks = 10^(seq(0, 7, by = 0.25))) + scale_color_brewer(palette = "Set1") + labs(x = "Antibody Dilution", y = "% Cell Binding") + theme_minimal()
关键修正点:
- 将
color = Sample移至全局aes,所有图层自动继承颜色映射,geom_smooth会按Sample分组拟合; - 修正
geom_smooth中的大小写错误; - 删除
scale_color_brewer中无效的type = "Sample"参数,Set1属于定性调色板,无需额外指定type。
运行后每个样本的点、线、拟合虚线颜色完全匹配,实现预期效果。
内容的提问来源于stack exchange,提问作者Regan
相关产品推荐
相关产品推荐

