首页 > 编程问答 >在指定的 json 边界内绘制 hexbin 截断

在指定的 json 边界内绘制 hexbin 截断

时间:2024-07-30 08:31:37浏览次数:17  
标签:python json plotly geojson geopandas

我正在绘制一个单独的 hexbin 图和 json 边界文件。不过,hexbin 网格与边界文件重叠。我只想展示非洲大陆。我的目标是在非洲大陆内切断或分割六边形网格 因此,边界文件之外不应显示任何网格方块。有没有办法使用 Plotly 来实现这一点? 预期的输出是截断或剪切非洲大陆之外的方块(橙色)。

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objs as go
import plotly.figure_factory as ff
import geopandas as gpd
import json

data = pd.DataFrame({
    'LAT': [1,5,6,7,5,6,7,5,6,7,5,6,7,12,-40,50],
    'LON': [10,10,11,12,10,11,12,10,11,12,10,11,12,-20,40,50],
    })

gdf_poly = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
gdf_poly = gdf_poly.drop('name', axis = 1)

Afr_gdf_area = gdf_poly[gdf_poly['continent'] == 'Africa'].reset_index(drop = True)

fig = ff.create_hexbin_mapbox(data_frame=data,
                       lat="LAT", 
                       lon="LON",
                       nx_hexagon=25,
                       opacity=0.4,
                       labels={"color": "Point Count"},
                       mapbox_style='carto-positron',
                       zoom = 1
                       )

fig.update_layout(mapbox={
        "layers": [
            {"source": json.loads(Afr_gdf_area.geometry.to_json()),
                "below": "traces",
                "type": "fill",
                "color": "orange",
                "opacity" : 0.1,
                "line": {"width": 1}
            },
        ],
    })   

fig.show()

Intended output is to cut-off or clip squares outside the African continent, which is in orange.

enter image description here


很遗憾,Plotly 目前不支持对六边形分箱图进行原生裁剪或剪切以适应地理边界。Plotly 中的六边形分箱图是在网格系统上生成的,而地理边界需要基于矢量的裁剪操作。

建议的解决方案:

  1. 使用地理空间库进行预处理:
  2. 使用 geopandas shapely 等库,你可以将你的数据点与非洲大陆的多边形进行空间连接。
  3. 从你的 DataFrame 中过滤掉落在非洲大陆多边形外的点。
  4. 使用过滤后的 DataFrame 创建六边形分箱图。

  5. 使用其他绘图库:

  6. 考虑使用专门针对地理空间数据的库,例如 GeoPandas Cartopy geoplot 。这些库通常提供更好的矢量操作和裁剪支持。

代码示例(使用 geopandas 进行预处理):

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objs as go
import plotly.figure_factory as ff
import geopandas as gpd
import json

data = pd.DataFrame({
    'LAT': [1,5,6,7,5,6,7,5,6,7,5,6,7,12,-40,50],
    'LON': [10,10,11,12,10,11,12,10,11,12,10,11,12,-20,40,50],
})

# 创建数据点的 GeoDataFrame
gdf_points = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data.LON, data.LAT))

# 从 geopandas 加载非洲大陆多边形
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
africa = world[world.continent == 'Africa']

# 将数据点与非洲大陆多边形进行空间连接
gdf_clipped = gpd.sjoin(gdf_points, africa, how='inner', op='intersects')

# 创建使用裁剪数据的六边形分箱图
fig = ff.create_hexbin_mapbox(data_frame=gdf_clipped,
                       lat="LAT",
                       lon="LON",
                       nx_hexagon=25,
                       opacity=0.4,
                       labels={"color": "Point Count"},
                       mapbox_style='carto-positron',
                       zoom=1
                       )

fig.update_layout(mapbox={
    "layers": [
        {"source": json.loads(africa.geometry.to_json()),
            "below": "traces",
            "type": "fill",
            "color": "orange",
            "opacity": 0.1,
            "line": {"width": 1}
        },
    ],
})

fig.show()

这段代码首先使用 geopandas 将你的数据点与非洲大陆多边形进行空间连接。然后,它使用 sjoin() 函数过滤掉落在非洲大陆多边形外的点。最后,它使用过滤后的数据创建六边形分箱图。

请记住,这些建议可能需要根据你的具体需求和数据集进行调整。

标签:python,json,plotly,geojson,geopandas
From: 75925357

相关文章

  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......
  • Python OpenCV - 显示坏像素检查测试
    我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为160x320像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有51200像素,那就是坏的。另外,我想知道每个坏像素的位置。一旦拍摄的图像太大,我将共享一个......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......
  • Python CDLL 无法加载两次
    我正在尝试用python创建一个密码管理器,但遇到了一个问题,一旦加载了一种类型的dll,我就无法加载不同的dll,在这个示例中,我加载了一个dll,并尝试解密加密的密码数据,它工作正常,直到我加载另一个不同的nss3.dll文件,此时它给我一个错误:“过程入口点HeapAlloc无法位于动态链......
  • 你能将 HTTPS 功能添加到 python Flask Web 服务器吗?
    我正在尝试构建一个Web界面来模拟网络设备上的静态接口,该网络设备使用摘要式身份验证和HTTPS。我想出了如何将摘要式身份验证集成到Web服务器中,但我似乎无法找到如何使用FLASK获取https,如果您可以向我展示如何实现,请评论我需要使用下面的代码做什么来实现这一点。from......
  • Python:比较 csv 文件并打印相似之处
    我需要比较两个csv文件并打印出它们的相似之处。第一个文件有名称和浓度,第二个文件就像只有名称的“最佳”列表,我需要绘制相似性图表。例如,这就是我的列表的样子:file1-old_file.csvname_id,conc_test1,conc_test2name1,####,####name2,###......
  • Python 类交叉引用
    我用Python创建了一个数独游戏。我有一个:单元格类-“保存”数字可能性单元格组-保存单元格类实例我使用这些组在数独中运行行、列和正方形功能。每个单元格包含所有组,他属于classCell:def__init__(groups):self.groups=groupscla......
  • 如何修复我的 Python Azure Function DevOps Pipeline 上的“找到 1 个函数(自定义)加载
    我正在尝试使用AzureDevOps构建管道将PythonAzureFunction部署到Azure门户。由于某种原因,代码被部署到服务器,但我在尝试访问端点时收到404错误。我收到一个错误,显示1functionsfound(Custom)0functionsloaded,以及在服务器上显示ModuleNotFound......