Matplotlib 地质勘探与开发;Mapplotlib,如何在没有轮廓的情况下绘制任何形状?

Matplotlib 地质勘探与开发;Mapplotlib,如何在没有轮廓的情况下绘制任何形状?,matplotlib,geopandas,Matplotlib,Geopandas,当我在Jupyter笔记本上运行下面的代码时, 我得到一张红色的世界地图 两国之间有细微的白色界线。 有没有一种方法可以让世界上所有的国家 是实心的,中间没有线 我这么问是因为我的真实世界用例是一个很好的网格 其行为与世界地图类似:每个栅格形状都有一个精细的轮廓 我不想让它出现在情节中。(更新,因为有人问:网格形状将不具有相同的填充颜色 ) 对于网格示例,网格文件位于 一个显示问题的简化示例 sf = 'Hexagone_125_km/Hexagone_125_km.shp' shp = gp

当我在Jupyter笔记本上运行下面的代码时, 我得到一张红色的世界地图

两国之间有细微的白色界线。 有没有一种方法可以让世界上所有的国家 是实心的,中间没有线

我这么问是因为我的真实世界用例是一个很好的网格 其行为与世界地图类似:每个栅格形状都有一个精细的轮廓 我不想让它出现在情节中。(更新,因为有人问:网格形状将不具有相同的填充颜色

)

对于网格示例,网格文件位于 一个显示问题的简化示例

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)

白线是由于抗锯齿造成的。这通常会使视觉更加平滑,但会导致不同形状之间出现白线。您可以通过以下方式关闭AniAlias:

antialiased=False
这不可避免地有一个缺点,那就是画面看起来像像素

另一种方法是为面片提供具有特定线宽的边。边可能与面具有相同的颜色,因此

edgecolor="face", linewidth=0.4
这将是一种选择。这消除了白线,但引入了轻微的“灼热”效应(你会注意到主要是在印度尼西亚或日本等岛屿上)。这一点越明显,特征越小,因此可能与显示hexbin图无关。不过,稍微调整一下线宽可能会进一步改善效果

复制代码:

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()

您的最终目标是为所有多边形提供统一的颜色(如示例中的红色)?或者,您真的想为具有不同值的列使用颜色贴图(从而为不同的多边形获得不同的颜色),但仍然要去除精细的轮廓吗?网格稍后会为每个网格条目使用不同的颜色,因此颜色不同。我只是不想要提纲。啊,那更难。对于统一颜色,您可以确保为“边”指定与多边形填充相同的颜色(默认情况下,不使用边颜色),但对于使用
cmap
关键字的可变颜色,没有容易的选项指定对边和填充(“面”)使用相同的颜色。因为默认情况下,不使用边颜色,如果您设置
linewidth=0.001
,视觉效果应该几乎等同于没有轮廓。我添加了一张图片,这样您可以看到网格,唉,linewidth=0.001仍然可以生成一个可见的网格完美解决方案,谢谢
antialiased=False
效果很好,因为
edgecolor='face'
我必须将线宽设置为1.0才能删除网格线。
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()