I have a list of state-level data with numbers for each state, e.g.:
AL 10.5
AK 45.6
AZ 23.4
AR 15.0
...
and I want to make it into a weighted map, with darkest where the number is highest and lightest here it is lowest. Is there any software, or a java or python library that can generate such an image?
If you want to build it yourself, all you need is a good map, a set of positions for each state in this map, and flood fill.
Using the map http://www.clker.com/cliparts/S/r/a/w/L/0/black-and-white-u-s-map-hi.png, here is what we get:
The code to build the map above is given by
import sys
from PIL import Image
def floodfill(img, seed, color):
im = img.load()
work = [seed]
start_color = im[seed]
while work:
x, y = work.pop()
im[x, y] = color
for dx, dy in ((-1,0), (1,0), (0,-1), (0,1)):
nx, ny = x + dx, y + dy
if im[nx, ny] == start_color:
work.append((nx, ny))
USA_MAP = Image.open(sys.argv[1]).convert('1')
POINT_STATE = {'AL': (420, 260), 'AZ': (110, 240), 'AR': (350, 250)}
painted_map = USA_MAP.convert('L')
data = {'AL': 10.5, 'AZ': 23.4, 'AR': 15.0}
# Normalize data based on the minimum weight being 0+eps and maximum 30.
for k, v in data.items():
v = v/30.
color = int(round(255 * v))
floodfill(painted_map, POINT_STATE[k], 255 - color)
painted_map.save(sys.argv[2])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With