You can probably solve the problem by giving explicit x, y, z coordinates for the data. In your case, I would first define the x position based on your segments:
pos = Mean /@ segments;
Then we can create a dataset that consists of 5 rows and 6 columns, but where the position of each column is defined by the above pos:
newdata = Join @@ Table[{pos[[i]], j, RandomReal[i]}, {j, 5}, {i, 6}];
The ListContourPlot with the x-axis specified by using FrameTicks:
ListContourPlot[newdata, AspectRatio -> 1/10, ImageSize -> 700,
FrameTicks -> {{Automatic, None}, {Union @@ segments, None}}]

Update
To add some strings that contain information about the single segments you might do this:
ListContourPlot[newdata, AspectRatio -> 1/10, ImageSize -> 700,
FrameTicks -> {{Automatic,
None}, {Join @@ {Transpose[{Union @@ segments,
Union @@ segments}],
Transpose[{pos, {"Seg.1", "Seg.2", "Seg.3", "Seg.4", "Seg.5",
"Seg.6"}}]}, None}}]

At this point, I've noticed that it would be better to add some data points at x values of 0 and 40 to define the exact range of your plot. These additional data points have a z-value equal to 0.
newdata2 = Join[newdata, Transpose[{Table[0, {5}], Range[5], Table[0, {5}]}],
Transpose[{Table[40, {5}], Range[5], Table[0, {5}]}]];
ListContourPlot[newdata2, AspectRatio -> 1/10, ImageSize -> 700,
FrameTicks -> {{Automatic,
None}, {Join @@ {Transpose[{Union @@ segments,
Union @@ segments}],
Transpose[{pos, {"Seg.1", "Seg.2", "Seg.3", "Seg.4", "Seg.5",
"Seg.6"}}]}, None}}]
