首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系列图- Geopandas

系列图- Geopandas
EN

Stack Overflow用户
提问于 2021-07-16 19:23:55
回答 1查看 50关注 0票数 1

我没有一个工作的代码-但我的代码片段可以如下所示。我正在尝试使用geopandas和mathplotlib,并尝试绘制带有链接和点的地图。

代码语言:javascript
复制
shape_file = os.path.join(os.getcwd(), "Healthboard")
    healthboard = gp.read_file(os.path.join(shape_file, "healthboard.shp"))
    healthboard = healthboard.to_crs({'init': 'epsg:4326'}) # re-projection   

    geo_df1 = geo_df1[geo_df1['HealthBoardArea2019Code'] == string1]
    geo = geo_df[geo_df['Healthboard '] == string2]

    new_shape_file = os.path.join(os.getcwd(), "Council_Shapefile")

    council_to_healtboard = pd.read_csv("council_to_healthboard.csv")
    council_to_healthboard = council_to_healtboard.rename(columns = {'CA': 'Council_area_code'})
    council = gp.read_file(os.path.join(new_shape_file, "Council_shapefile.shp"))
    council = council.to_crs({'init': 'epsg:4326'})
    council = council.rename(columns = {'la_s_code':'Council_area_code'})
    df = council.merge(council_to_healthboard, on = 'Council_area_code', how ='inner')

    # Plotting stuff 
    fig, ax = plt.subplots(figsize=(15,15))

    geo_df1.plot(ax = ax, markersize=35, color = "blue", marker = "*", label = "Postcode Sector")

    geo.geometry.plot(ax = ax, color = "red", markersize=20, alpha = 0.8, label = 'SiteName')

    #healthboard[healthboard["HBName"]=="Lothian"].plot(ax = ax, alpha = 0.6)
    #healthboard[healthboard["HBName"]=="Lothian"].boundary.plot(ax = ax, color = "black", alpha = 0.6)

    df[df["HB"]=="S08000024"].boundary.plot(ax =ax, color = "black", alpha = 0.1)
    df[df["HB"]=="S08000024"].plot(ax =ax, cmap = "viridis", alpha = 0.1)

    links_gp.plot(ax =ax, alpha = 0.25, color='brown', linestyle = "-")

我的links_gp.plot有40个时间段,因此我想做一个图,并有一个按钮来调整时间参数。或者,如果不可能的话,一系列的40个图。我已经尝试了很多方法,但在这方面总是失败。如果有人能在这方面给我指点,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-07-18 03:04:52

我知道您正在使用matplotlib,但是如果您不介意使用bokeh,您可以使用以下代码。为了创建一个可以调整参数的交互式绘图,bokeh提供了一个slider小部件,该小部件可用于基于自定义过滤器函数更改绘图。

来自geopandas dataframe的一个示例,其LineString几何结构与您发布的类似:

代码语言:javascript
复制
import geopandas as gpd
from bokeh.io import show, output_notebook
from bokeh.models import (CDSView, ColumnDataSource, CustomJS, 
                          CustomJSFilter, Slider, Column)
from bokeh.layouts import column
from bokeh.plotting import figure

# prepare data source
links_gp['x'] = links_gp.apply(lambda row: list(row['geometry'].coords.xy[0]), axis=1)
links_gp['y'] = links_gp.apply(lambda row: list(row['geometry'].coords.xy[1]), axis=1)
# drop geometry column, because it can't be serialized to ColumnDataSource
links_gp.drop('geometry', axis=1, inplace=True)
linesource = ColumnDataSource(links_gp)

p = figure(title = 'Bokeh Time Slider', 
           plot_height = 500,
           plot_width = 600, 
           toolbar_location = 'below',
           tools = "pan, wheel_zoom, box_zoom, reset")
slider = Slider(title='Time Period', start=1, end=40, step=1, value=1)

# Callback triggers the filter when the slider moves
callback = CustomJS(args=dict(source=linesource), 
                    code="""source.change.emit();""")
slider.js_on_change('value', callback)

# Custom filter that selects all lines of the time period based on the slider value
custom_filter = CustomJSFilter(args=dict(slider=slider), 
                               code="""
var indices = [];
// iterate through rows of data source and check if time period value equals the slider value
for (var i = 0; i < source.get_length(); i++){
 if (source.data['Time Period'][i] == slider.value){
 indices.push(true);
 } else {
 indices.push(false);
 }
}
return indices;
""")

# Use filter to determine which lines are visible
view = CDSView(source=linesource, filters=[custom_filter])

# plot lines to map
p.multi_line('x', 'y', source=linesource, color='red', line_width=3, view=view)

layout = column(p, slider)
show(layout)

This将是上述代码的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68408194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档