size(600,800)
font('Palatino')
fontsize(12)
stroke(0.45)
fill(0.25)

# data = (label, first, last)
data = [ ('Sweden', 46.9, 57.4),
         ('Netherlands', 44.0, 55.8),
         ('Norway', 43.5, 52.2),
         ('Britain', 40.7, 39.0),
         ('France', 39.0, 43.4),
         ('Germany', 37.5, 42.9),
         ('Belgium', 35.2, 43.2),
         ('Canada', 35.2, 35.8),
         ('Finland', 34.9, 38.2),
         ('Italy', 30.4, 35.7),
         ('United States', 30.3, 32.5),
         ('Greece', 26.8, 30.6),
         ('Switzerland', 26.5, 33.2),
         ('Spain', 22.5, 27.1),
         ('Japan', 20.7, 26.6),
        ]

text("1970", WIDTH*.28, HEIGHT*0.03)
text("1979", WIDTH*.68, HEIGHT*0.03)

# find the minimum and maximum values in the range
newdata = []
minval = maxval = data[0][1]
for label, startdata, enddata in data:
    minval = min(minval, startdata, enddata)
    maxval = max(maxval, startdata, enddata)

def ypos(val):
    return HEIGHT * (0.9 - 0.8 * (val - minval) / (maxval - minval))
    
for label, startdata, enddata in data:
    newdata += [[label, startdata, enddata, ypos(startdata), ypos(enddata)]]
print newdata

for i in range(20):
    for j in range(len(newdata)):
        for k in range(len(newdata)):
            if j<>k:
                if newdata[j][3] >= newdata[k][3] and newdata[j][3] - newdata[k][3] < .8*textheight('a'):
                    newdata[j][3] += 1
                    newdata[k][3] -= 1
                if newdata[j][4] >= newdata[k][4] and newdata[j][4] - newdata[k][4] < .8*textheight('a'):
                    newdata[j][4] += 1
                    newdata[k][4] -= 1

for label, startdata, enddata, startpos, endpos in newdata:
    align(RIGHT)
    text(label, 0, startpos+4, width=0.25*WIDTH)
    text("%0.1f" % startdata, 0.25*WIDTH, startpos+4, width=0.07*WIDTH)
    align(LEFT)
    text(label, WIDTH*.75, endpos+4)
    text("%0.1f" % enddata, 0.68*WIDTH, endpos+4, width=0.07*WIDTH)
    line(WIDTH*.33, ypos(startdata),
         WIDTH*.67, ypos(enddata))
        