Jamie Drysdale scored, and John Gibson made 33 saves for the Ducks (12-23-7), who are 1-4-1 in their past six games.
"We played hard, it's not for lack of trying," Ducks defenseman Kevin Shattenkirk said. "[The Avalanche] are a team that's going to generate scoring chances on a nightly basis with the skill and talent that they have, but I thought we had some pretty good chances of our own."
Johansson made his fourth start (3-0-1) for Colorado since he was acquired from the Buffalo Sabres on March 20 for a sixth-round pick in the 2021 NHL Draft.
"He's been on the ice every day working with guys, so it's good to see him get some success," Graves said of Johansson.
Drysdale scored on a slap shot at 12:37 of the third period to make it 2-1 and prevent Johansson from becoming the first goalie to record his first two NHL shutouts in consecutive games since Elvis Merzlikins of the Columbus Blue Jackets in January 2020.
It was the second goal of the season for Drysdale, the sixth pick in the 2020 NHL Draft who turned 19 on Thursday.
"He continues to get better, and he has earned every minute of [playing time]," Ducks coach Dallas Eakins said. "He has played well right from the start, and he's a quick learner."
The Avalanche re-established the two-goal lead 36 seconds after Drysdale scored. Graves took a shot that banked off the leg of Ducks forward Ryan Getzlaf and into the net to make it 3-1 at 14:13.
MacKinnon redirected a pass from in close to make it 4-1 at 16:54.