根据邮政编码在真实地图上显示数据

时间:2019-09-21 20:47:17

标签: python plot maps data-visualization

我尝试在真实地图上显示数据(数据应在加拿大安大略省内):我有.csv文件,其中有两列,A和B,A是邮政编码,B是其关联值(整数,1到5),我想找到A映射到的区域并根据相关值为其着色。例如。邮政编码P0G,P0A(加拿大邮政编码的前3位数字,代表一个区域),其值分别为2和5,我想在真实的这两个区域上显示不同的颜色(可能是2表示绿色,5表示红色)地图。

我不知道如何,也许使用Python或某些网站服务或某些API?我以前没有可视化真实地图上数据的经验。

我上面描述的问题是简化版本。实际的问题有更多的列(域),每行一个邮政编码,我需要为每个域生成|domains|个图/地图。但是我想知道一旦我知道如何做一个域,那么我应该就能完成所有工作。

我尝试使用一些在线分析工具,例如SimplyAnalytics,但没有弄清楚如何同时显示许多具有不同颜色的区域。我尝试搜索类似的问题,但似乎是因为最终目标和数据格式不同,所以代码/方法的更改可能相差很大。

谢谢!

一些样本数据将是: enter image description here

4 个答案:

答案 0 :(得分:1)

或者,您可以使用 pgeocode 库将邮政编码转换为纬度/经度坐标。它会返回多边形的中点,但可以解决很多情况

import pgeocode
nomi = pgeocode.Nominatim("ca")

dfzip = df["zipcode"].apply(lambda x:nomi.query_postal_code(x))
df = pd.concat([df, dfzip], axis="columns")

其余的只是使用您选择的库和技术来绘制点

答案 1 :(得分:0)

如果您希望在python中执行此操作,则可以使用geopandas库。以下是示例代码(Github Gist)。首先,我们需要获取shapefile,该文件定义每个邮政编码的区域(正向排序区域)(link)。然后过滤安大略省的邮政编码,并将其与要绘制的数据结合起来。

import geopandas
import pandas as pd
import pandas_bokeh
import matplotlib.pyplot as plt
pandas_bokeh.output_notebook()

canada = geopandas.read_file("./gfsa000b11a_e.shp")
ontario = canada[canada['PRUID'] == '35']

# Sample data to plot
df=pd.DataFrame({'PCODE': ['P0V','P0L','P0T','P0Y', 'P0G', 'P2N'], 'A':[6,3,5,2,2,4] })

# Join ontario dataset with sample data
new_df=ontario.join(df.set_index('PCODE'), on='CFSAUID')


new_df.plot_bokeh(simplify_shapes=20000,
                  category="A", 
                  colormap="Spectral", 
                  hovertool_columns=["CFSAUID","A"])

enter image description here

答案 2 :(得分:0)

@Samik的答案很好,它可以完美地用于3位数的邮政编码。但是,对于6位数字,plot_bokeh确实很慢。就我而言,安大略边界shapfile花费了21小时的渲染时间(我在Python中计时,可能我的机器很慢)!如果您有多个域,则将是21*|domains|小时,时间将是一个大问题。

一种更好的方法来处理6位数(通常是大文件),使用Tableau,加载空间文件并渲染地图,选择适当的参数来自定义地图,这将是比plot_bokeh更快;但是,使用Tableau不涉及编程,它更适合一般用户。

答案 3 :(得分:0)

@Kenny,您是否尝试过使用plot_bokeh的simple_shapes选项。但是,如果您的羞耻感非常大,那么pandas-bokeh将不是解决您问题的正确选择。