matplotlib - Geopandas & Mapplotlib,如何在没有轮廓的情况下绘制任何形状?
问题描述
当我在 Jupyter Notebook 中运行下面的代码时,我得到一张世界地图,颜色为红色。
国家之间有细白线。有没有办法绘制世界,让所有国家都是坚实的,两者之间没有界限?
我在问,因为我的真实世界用例是一个精细的网格,其行为就像世界地图:每个网格形状都有一个我不想在情节中出现的精细轮廓。(更新,因为有人问过:网格形状不会有相同的填充颜色。
import geopandas as gpd
import geoplot as gplt
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world['total'] = 1
world.plot(column='total', cmap='Set1')
对于网格示例,网格文件位于https://opendata-esri-de.opendata.arcgis.com/datasets/3c1f46241cbb4b669e18b002e4893711_0 显示问题的简化示例。
sf = 'Hexagone_125_km/Hexagone_125_km.shp'
shp = gpd.read_file(sf)
shp.crs = {'init': 'epsg:4326'}
shp['sum'] = 1 # for example, fill sum with something
shp.plot(figsize=(20,20), column='sum', cmap='gnuplot', alpha=1, legend=True)
解决方案
白线是由于抗锯齿。这通常会使视觉更平滑,但会导致不同形状之间出现白线。您可以通过以下方式关闭抗锯齿功能
antialiased=False
这具有情节看起来像素化的不可避免的缺点。
另一种方法是给补丁一个具有一定线宽的边缘。边缘可能应该与面具有相同的颜色,所以
edgecolor="face", linewidth=0.4
将是一个选择。这消除了白线,但引入了轻微的“灼热”效果(您会注意到主要是在看印度尼西亚或日本等岛屿)。这将越明显,特征越小,因此它可能与显示六边形图无关。不过,稍微调整一下线宽可能会进一步改善结果。
复制代码:
import numpy as np; np.random.seed(42)
import geopandas as gpd
import matplotlib.pyplot as plt
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world['total'] = np.random.randint(0,10, size=len(world))
fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(7,10))
world.plot(column='total', cmap='Set1', ax=ax1)
world.plot(column='total', cmap='Set1', ax=ax2, antialiased=False)
world.plot(column='total', cmap='Set1', ax=ax3, edgecolor="face", linewidth=0.4)
ax1.set_title("original")
ax2.set_title("antialiased=False")
ax3.set_title("edgecolor='face', linewidth=0.4")
plt.tight_layout()
plt.savefig("world.png")
plt.show()
推荐阅读
- prolog - 带分解的 Prolog 练习
- imagemagick - ImageMagick - 部分伽玛校正
- javascript - 获取下拉菜单值的日期时间并将其与文本框日期时间一起添加
- c# - 使用正则表达式验证 SQL 查询
- c# - 在 .NET C# 中忽略 64 位程序集中的 32 位第三方 dll 错误
- ios - 如何通过使用 Ionic1 在 iPhone/iPad 上点击下一个键进入下一个输入?
- mysql - 从现在到一周 MYSQL 从客户那里获得生日
- sql-server - 由于 SQL Server 嵌套循环运算符中的基数估计错误导致的性能问题
- sapui5 - 上传多个员工的集合
- laravel - 如何将查询构建器代码转换为 Eloquent?