系列情节 - Geopandas

Posted

技术标签:

【中文标题】系列情节 - Geopandas【英文标题】:Series plot - Geopandas 【发布时间】:2021-09-25 05:03:17 【问题描述】:

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

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 个地块。我尝试了很多方法,但一直失败。如果有人可以指导我,我将不胜感激。

【问题讨论】:

您可以将您的 DataFrame(s) 添加到问题中作为formatted text 吗?否则很难重现您的代码,因为我们无法复制/粘贴您的数据。这样做也将更有可能有人试图帮助回答您的问题。祝你好运! 【参考方案1】:

我知道您正在使用 matplotlib,但如果您不介意使用 bokeh,则可以使用以下内容。为了创建一个可以调整参数的交互式绘图,bokeh 提供了一个slider 小部件,可用于根据自定义过滤功能更改绘图。

geopandas 数据框中的示例,其中 LineString 几何形状与您发布的类似:

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 将是上述代码的结果。

【讨论】:

感谢您的精彩评论!但我注意到这些只是点,而不是从线串中得到的线。另外,如果我要与它一起使用形状文件,我将如何使用它? 这些其实都是LineStrings 不是积分。只是我的数据源的段很短,彼此相距很远,所以看起来只是点。你的意思是从其他形状文件中添加额外的数据到绘图中吗?您始终可以使用 p.circle()p.multi_line()p.patches()(点、线、多边形的散景术语)从其他数据框中添加更多几何图形。也许这可以进一步帮助您:automating-gis-processes.github.io/2016/… 可爱,谢谢!它对我意义重大。我今天将在我的代码上实现这一点,让你知道它是怎么回事!再次感谢。 虽然我真诚地感谢答案,但是否可以提供我最初要求的内容。对于这个问题,如何使用 for 循环或其他东西创建 40 个图。

以上是关于系列情节 - Geopandas的主要内容,如果未能解决你的问题,请参考以下文章

如何增加情节的日期范围以在系列结束时为 geom_text 腾出空间?

IOS 7.1,如果目标设备系列设置为 iPad,通用情节提要上的常规宽度限制将被忽略

当我将传奇移出情节时,传奇失去了第二位艺术家

记录连续的情节

闪亮的反应情节失败

情节:具有“链接”交互性的多个情节