While Szabolcs's method works beautifully for standard plots, anything more complicated with nonuniform AspectRatio
s fails. Let's generate some plots with varying image padding, sizes and ratios:
a = Plot[2 Sin[x] + x, {x, 0, 16}, Filling -> Bottom,
PlotRange -> {{0, 16}, {0, 20}}, Frame -> True, ImageSize -> 400];
b = ArrayPlot[RandomReal[{0, 1}, {20, 20}],
PlotRange -> {{0, 160000}, {0, 200000}}, Frame -> True,
FrameTicks -> {
{MapIndexed[{First@#2, #1} &, Range[0, 160000, 8000]], None},
{MapIndexed[{First@#2, Rotate[#1, -\[Pi]/2]} &, Range[0, 200000, 10000]], None}},
ImageSize -> 300, AspectRatio -> 1, ColorFunction -> (Hue[#1, .7, 1] &)];
c = BarChart[{1, 2}, Frame -> True, ImageSize -> 200, AspectRatio -> 2];
Row@{a, b, c}

The default layout is far from visually appealing. Here I provide the package-ready plotRow
function that builds on Szabolcs's (and Heike's) approach when estimating padding and also accounts for AspectRatio
s by querying them directly from plots. One only has to specify the desired vertical size (200
) to easily align frames.
padding[g_Graphics] := With[{im =
Image[Show[g, LabelStyle -> White, Background -> White]]}, BorderDimensions@im] + 1;
plotRow[g : {__Graphics}, y_] := Module[{ip = padding /@ g, ar},
ip = ReplacePart[ip, {_, 2} :> Max /@ Transpose[Last /@ ip]];
ar = (AspectRatio /. Options@# /. Automatic -> 1./GoldenRatio) & /@ g // N;
MapThread[Show[#1, ImagePadding -> #2, AspectRatio -> #3,
ImageSize -> ({y/#3, y} + Plus @@@ #2)] &, {g, ip, ar}]
];
Row@plotRow[{a, b, c}, 200]

The same can be easily done for a vertical layout by modifying the appropriate parts of plotRow
.