簡體   English   中英

在BeautifulSoup和Python中使用SVG路徑

[英]Working with SVG paths in BeautifulSoup & Python

我正在編寫一個Python腳本,它將根據SVG格式的地圖上各自家庭中位收入的不同,在城市普查區組(共有18種)的各個區域着色。

聽起來很簡單,對吧? 好吧,盡管我取得了一些進展,但我不知道如何做。 到目前為止,我一直在嘗試根據SVG如何引用它們來列出每個塊組路徑的列表,列出家庭收入中位數,然后傳入為其着色的代碼。 但是,無論出於何種原因,這似乎都行不通。 你們中任何一個很棒的人都可以幫我弄清楚我錯了嗎?

import csv
from bs4 import BeautifulSoup

icbg = []
reader = csv.reader(open('censusdata.csv'),delimiter=",")

#read and get income
for row in reader:
   income = row[6]
   income = int(income)
   icbg.append(income)

svg = open('NM2.svg','r')
soup = BeautifulSoup(svg,"lxml")

#find CBGs and incomes
path1 = soup.find('path')
path2 = path1.find_next('path')
path3 = path2.find_next('path')
path4 = path3.find_next('path')
path5 = path4.find_next('path')
path6 = path5.find_next('path')
path7 = path6.find_next('path')
path8 = path7.find_next('path')
path9 = path8.find_next('path')
path10 = path9.find_next('path')
path11 = path10.find_next('path')
path12 = path11.find_next('path')
path13 = path12.find_next('path')
path14 = path13.find_next('path')
path15 = path14.find_next('path')
path16 = path15.find_next('path')
path17 = path16.find_next('path')
path18 = path17.find_next('path')
incomep1 = icbg[0]
incomep2 = icbg[1]
incomep3 = icbg[2]
incomep4 = icbg[3]
incomep5 = icbg[4]
incomep6 = icbg[5]
incomep7 = icbg[6]
incomep8 = icbg[7]
incomep9 = icbg[8]
incomep10 = icbg[9]
incomep11 = icbg[10]
incomep12 = icbg[11]
incomep13 = icbg[12]
incomep14 = icbg[13]
incomep15 = icbg[14]
incomep16 = icbg[15]
incomep17 = icbg[16]
incomep18 = icbg[17]

paths = (path1, path2, path3, path4, path5, path6, path7, path8, path9, path10,
             path11, path12, path13, path14, path15, path16, path17, path18)
incomes = (incomep1,incomep2,incomep3,incomep4,incomep5,incomep6,incomep7,incomep8,
               incomep9,incomep10,incomep11,incomep12,incomep13,incomep14,incomep15,incomep16,incomep17,incomep18)

#set colors
colors = ['fee5d9','fcae91','fb6a4a','de2d26','a50f15']

for p in paths:
    for i in range(0,17):
        it = incomes[i]
        if it > 20000:
            color_class = 2
        elif it > 25000:
            color_class = 1
        elif it > 30000:
            color_class = 3
        elif it > 35000:
            color_class = 4

        color = colors[color_class]
        path_style = "font-size:12px;fill:#%s;fill-rule:nonzero;stroke:#000000;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel" % color
        p['style'] = path_style
    print(soup.prettify())

運行此命令將得到一個SVG文件,如下所示: fill:#fb6a4a;fill-rule:nonzero;stroke:#000000;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel">上升了18次,這意味着對於每個可用路徑,即使這些路徑具有不同的收入。

問題可能出在我編寫比較的方式上嗎?

根據我對要執行的操作的了解,您的問題是您有2個for循環而不是1個。 您應該同時瀏覽路徑和收入。 您現在做的方式是遍歷每條路徑的所有收入。 以下代碼將路徑簡單地移動到與收入相同的循環中,因此它們將同時循環通過。

for i in range(0,17):
    it = incomes[i]
    p = paths[i]
    if it > 20000:
        color_class = 2
    elif it > 25000:
        color_class = 1
    elif it > 30000:
        color_class = 3
    elif it > 35000:
        color_class = 4

    color = colors[color_class]
    path_style = "font-size:12px;fill:#%s;fill-rule:nonzero;stroke:#000000;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel" % color
    p['style'] = path_style

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM