Dado que sólo tienes dos variables para las que estás ajustando, una de las cuales es un factor de 2 categorías, la forma más fácil de visualizarlo todo sería simplemente utilizando algunos colores y símbolos:
# simulate data
set.seed(1234)
age <- round(rnorm(30, 40, 10))
sex <- round(runif(30, 0, 1))
bodyfat <- rnorm(30, 10 + 5 * sex + age / 10, 3)
bloodpressure <- rnorm(30, 55 + bodyfat * 2 + age / 10, 5)
# plot original with color and pch set to other variables
cols <- colorRampPalette(c("blue", "black", "red"))(30)
par(mfrow = c(1, 1))
plot(bloodpressure ~ bodyfat, col = cols[order(age)], pch = sex + 17)
legend("bottomright", legend = c("male", "female"), pch = 17:18)
Podría añadir una escala de colores a su leyenda para la edad.
También se puede ajustar la grasa corporal en función de la edad y el sexo, aunque esto pierde su fácil interpretación . Si quiere ajustar como propone en su pregunta -regresando la grasa corporal en función de la edad y el sexo- debe añadir el interceptar de este modelo a los residuos, no a la media.
Esto equivale a restar $\beta_1 \cdot \text{age}$ y $\beta_2 \cdot \text{sex}$ del porcentaje de grasa corporal en:
$$\text{body fat percentage} = \beta_0 + \beta_1 \cdot \text{age} + \beta_2 \cdot{sex} + \epsilon$$
Eso se vería así:
# plot blood pressure vs adjusted bodyfat
LM <- lm(bodyfat ~ age + sex)
adjusted_BF <- (coef(LM)[1] + resid(LM))
par(mfrow = c(1, 2))
plot(bloodpressure ~ bodyfat)
plot(bloodpressure ~ adjusted_BF)
Como era de esperar, la relación observada en el gráfico de dispersión de la derecha es ligeramente más débil tras ajustar los efectos de la edad y el sexo.
Sin embargo, , mirar las correlaciones parciales es más bien ajustar ambos para el resto de variables:
LM2 <- lm(bloodpressure ~ age + sex)
adjusted_BP <- coef(LM2)[1] + resid(LM2)
plot(adjusted_BP ~ adjusted_BF)
Pero de nuevo, tenga cuidado de no engañar a sus lectores con esto, ya que estos ejes ya no representan la presión arterial y la grasa corporal.