Assuming $Y = 100 + 150 \times Group + 5 \times Age + 20 \times Income + 4 \times Group*Age$
When $group = 0$, the model reduces to:
$Y = 100 + 5 \times Age + 20 \times Income$
Notice that because there isn't any interaction between Income and Age, if you plot the regression line of Y versus age, the slope will always be 5 because the 3-D regression plane in this case is flat. The coefficient 20 for the Income merely shifts the line up and down.
The trick of incorporating the information of Income is then to plot a few regression lines that are representative of the Income. One of the common choices is mean, +/- 1 SD, and +/- 2SDs. Another common choice is some quantiles. Here I plotted 5 lines using the 0th, 20th, 40th, 60th, 80th, and 100th percentiles of Income (which I just assumed them to be 0, 5, 10, 25, and 45 units.) The 0th percentile group will have no offset, the 20th percentile group will have $5 \times 20$ upward offset; the 40th, $10 \times 20$, so on so forth. That would give us the plot on the left hand side below.
Now, when $group = 1$, the model becomes:
$Y = 100 + 150 + 5 \times Age + 20 \times Income + 4 \times Age$,
simply:
$Y = 250 + 9 \times Age + 20 \times Income$
Applying the same method as if Group = 0, we can then plot the other scenarios.
Below is the resultant graph. To make the plot more independent, I'd also suggest adding the actual income data for each selected percentile in the footnote.
R code for your reference:
# Y = 100 + 150*Group + 5*age + 20*Income + 4*Group*Age
par(mfrow=c(1,2),mar=c(5,5,1,2))
plot(1,1,xlim=c(20,70), ylim=c(0,1800),ylab="Outcome", xlab="Age", axes=F)
title("Group = 0")
abline(100+(20*0), 5, col="#d9f0a3", lwd=2)
abline(100+(20*5), 5, col="#addd8e", lwd=2)
abline(100+(20*10), 5, col="#78c679", lwd=2)
abline(100+(20*25), 5, col="#41ab5d", lwd=2)
abline(100+(20*45), 5, col="#006837", lwd=2)
axis(side=1)
axis(side=2)
plot(1,1,xlim=c(20,70), ylim=c(0,1800),ylab="", xlab="Age", axes=F)
title("Group = 1")
abline(100+(20*0)+150, 5+4, col="#d9f0a3", lwd=2)
abline(100+(20*5)+150, 5+4, col="#addd8e", lwd=2)
abline(100+(20*10)+150, 5+4, col="#78c679", lwd=2)
abline(100+(20*25)+150, 5+4, col="#41ab5d", lwd=2)
abline(100+(20*45)+150, 5+4, col="#006837", lwd=2)
axis(side=1)
axis(side=2)
legend(50,500, box.col="white",
title = "Income",
c("0th percentile",
"20th percentile",
"40th percentile",
"80th percentile",
"100th percentile"),
lty=1, lwd=2, cex=0.8,
col=c("#d9f0a3","#addd8e","#78c679","#41ab5d","#006837"))