我是各个方面的新手(SO、python、beautifulsoup 等),所以请多多包涵。
我正在尝试按照flowingdata.com上的教程(如何使用免费工具制作美国县专题地图)创建具有不同类型数据的各种地图。
我可以毫无错误地复制本教程,因此没有我可以说的版本问题(我在 Mac OS 10.8 上使用 Python 2.7.5 和 BeautifulSoup 4.3.1)。我想使用(更详细的)州县地图并用不同的数据对其进行着色。我在适当的文件中有地图(svg)和数据(csv)。这是我当前正在运行的脚本:
import csv
from BeautifulSoup import BeautifulSoup
totpop = {}
reader = csv.reader(open('datafile.csv', 'rU'), delimiter=",")
for row in reader:
try:
id = row[0]
pop = float( row[1].strip() )
totpop[id] = pop
except:
pass
svg = open('mapfile.svg', 'r').read()
soup = BeautifulSoup(svg, selfClosingTags=['defs', 'sodipodi:namedview', 'path'])
paths = soup.findAll('path')
colors = ["#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043"]
path_style = 'fill-rule:nonzero; stroke: #ffffff; stroke-width: 5; stroke-opacity: 1; fill: '
# Colorize based on data
for p in paths:
try:
pop = totpop[p['id']]
except:
continue
if pop > 750000:
color_class = 6
elif pop > 500000:
color_class = 5
elif pop > 250000:
color_class = 4
elif pop > 125000:
color_class = 3
elif pop > 75000:
color_class = 2
elif pop > 25000:
color_class = 1
else:
color_class = 0
color = colors[color_class]
p['style'] = path_style + color
print soup.prettify()
我收到以下错误:
文件“scriptname.py”,第 54 行,在 color = colors[color_class] IndexError: list index out of range
(“第 54 行”可能不匹配,因为我删除了示例代码中的一些注释行)
关于 svg 文件,它既有路径又有路径组(路径组是由多条路径组成的县)。单路径县将县名作为“id”。多路径县将县名称作为组“id”,但嵌套路径具有数字 ID。我希望将样式应用于与数据文件中的县名称匹配的路径或组(我完全知道示例代码现在不处理组)。为了测试,我在一个只有路径(没有组)的示例 svg 上运行了脚本,它运行得非常出色......所以我知道有些事情是正确的。我认为问题在于具有数字 ID 的组和/或路径(在组内)。
我如何绕过错误?我试图删除这些组并将所有多路径 ID 更改为相同的东西......这也不起作用。如果数字 id 没有被明确忽略,它们会导致问题吗?
我想知道我是否可以运行一个脚本,该脚本可以使用某种“isalpha”工具或“startswith”(任何字母)来挑出具有名称(没有数字/数字)的路径和/或组,以避免索引错误.
我希望提供足够的信息。
这是一个svg 地图的链接 (我已经从我的工作文件中删除了剪辑路径和 state_outline)这是一个指向相应数据文件的链接
如果您测试文件,您可能会遇到视图框问题,但我已单独对其进行了整理。
谢谢你的帮助!