1

我是各个方面的新手(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)这是一个指向相应数据文件的链接

如果您测试文件,您可能会遇到视图框问题,但我已单独对其进行了整理。

谢谢你的帮助!

4

1 回答 1

1

从它的外观来看,您可能在以下数组中假设:

colors = ["#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043"]

这里的元素被索引为 1、2、3、4、5、6。索引实际上是以 0 而不是 1 开始的。所以“#F1EEF6”实际上是元素 0 和最后一个元素(“#980043” ) 是数组中的第 5 位。在您的if pop陈述中,您需要进行此调整。

此外,您需要更改else语句以将您设置color_class为可用于确定是否应尝试获取有效颜色的内容。我在想一些事情:

else:
    color_class = null

if color_class != null
    color = colors[color_class]
    p['style'] = path_style + color

我不熟悉 Python 语法,因此可能存在错误,但希望您能理解我在此处展示的想法。

于 2013-10-07T13:10:44.737 回答