Notes for future OT posters:
1. Please add the 'open_thread' tag.
2. Check if there is an active Open Thread before posting a new one. (Immediately before; refresh the list-of-threads page before posting.)
3. Open Threads should be posted in Discussion, and not Main.
4. Open Threads should start on Monday, and end on Sunday.
You can use the pyvoro library to compute weigted 2d voronoi diagrams, and the matplotlib library to display them. Here's a minimal working example with randomly generated data:
http://pastebin.com/wNaYAPvN
edit: It seems this library uses the radical voronoi tessellation algorithm, where "weights" represent point radii. This means if you specify a point radius greater than the distance between it and the closest point, the tessellation will not function correctly, and as a corollary, if a point's radius is smaller than half of the minimal distance between it and a neighbour, the specified weight will not affect the tessellation process. Therefore, you need a secondary algorithm that takes the point weights and mutual distances into account to produce the desired result here.
Welp, it looks like it's been longer since I tried tweaking basic code than I thought. I'm having trouble just trying to adjust the box's range to be from -124 to -71 and 25 to 53 (ie, longitude and latitude) instead of 1-10/1-10. I'm going to keep puzzling away, but anyone reading this, feel free to offer advice. :)
(I have some TV to watch later with the fam, so I won't mind doing some drudge work during the shows of typing out the city-list into an array of X/Y coordinates and population/weight, to paste into the Python script in place of randomly-generated points. ... Once I figure out how to get the script to accept a fixed array instead of randomly-generated points.)