The Cubs, who had their nine-game road winning streak snapped with a 2-1 loss on Saturday, rebounded to win for the sixth time in seven games overall. Chicago began the day with a 4 1/2 game lead in the NL Central.
The third-place Marlins lost for the fourth time in five games to fall 4 1/2 games behind the New York Mets in the NL East.
Trailing 2-0 in the seventh, the Cubs sent 12 batters to the plate.
Mike Fontenot opened with a double to right and took third on Johnson's single. Florida starter Chris Volstad was replaced by Renyel Pinto (2-5), who walked pinch-hitter Mark DeRosa.
Soriano then hit a liner to left that fell in front of diving Luis Gonzalez to go for a double that scored Fontenot and Johnson to tie the score. After Ryan Theriot grounded out, Derrek Lee was walked intentionally to load the bases.
Ramirez then smashed a 3-2 pitch to the right of third baseman Jorge Cantu to score DeRosa and Soriano for a 4-2 lead.
Following Kosuke Fukudome's sacrifice fly and a walk to Geovany Soto, Logan Kensing replaced Pinto. Kensing walked pinch-hitter Ronny Cedeno before yielding Johnson's bases-clearing double to deep left-center that made the score 8-2.
Volstad was charged with two runs and six hits in six-plus innings. Pinto gave up five runs in two-thirds of an inning. It was the third straight appearance in which Pinto has allowed at least a run, and he has allowed 11 earned runs in 3 2-3 innings in August.
The Cubs' highest-scoring inning of the season was a nine-run frame against the Chicago White Sox on June 21.
The Marlins runs scored on John Baker's third-inning groundout and Gonzalez's sixth-inning double.
DeRosa had a sacrifice fly in the ninth.