如何在python中绘制形状文件中的虚线?

如何在python中绘制形状文件中的虚线?,python,matplotlib,shapefile,matplotlib-basemap,linestyle,Python,Matplotlib,Shapefile,Matplotlib Basemap,Linestyle,我不知道如何从Python中的形状文件中绘制虚线。readshapefile()似乎没有任何要设置的线型。下面我有一个工作代码,其中我获取一个shapefile并绘制它,但它只绘制一条实线。有什么想法能让我走上正确的方向吗?谢谢 可以在此处找到形状文件:,其中开始日期为2月15日,结束日期为2月17日,日期类型为Ice Edge。这应该是第一个环节 #!/awips2/python/bin/python from mpl_toolkits.basemap import Basemap impo

我不知道如何从Python中的形状文件中绘制虚线。readshapefile()似乎没有任何要设置的线型。下面我有一个工作代码,其中我获取一个shapefile并绘制它,但它只绘制一条实线。有什么想法能让我走上正确的方向吗?谢谢

可以在此处找到形状文件:,其中开始日期为2月15日,结束日期为2月17日,日期类型为Ice Edge。这应该是第一个环节

#!/awips2/python/bin/python

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap(llcrnrlon=-84.37,llcrnrlat=42.11,urcrnrlon=-20.93,urcrnrlat=66.48,
     resolution='i', projection='tmerc', lat_0 = 55., lon_0 = -50.)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='#ddaa66',lake_color='aqua')
map.drawcoastlines(zorder = 3)

map.readshapefile('nic_autoc2018046n_pl_a', 'IceEdge', zorder = 2, color = 'blue')

plt.show()

从Basemap文档中:

包含形状文件信息的元组(num_shapes,type,min,max)为 返回。num_shapes是形状的数量,type是类型代码 (shapelib模块中定义的SHPT*常量之一,请参见 )最小值和最大值是 包含顶点最小值和最大值的4元素列表。 如果drawbounds=True,则将创建matplotlib.patches.LineCollection对象 附加到元组。

默认情况下,
drawbounds
True
,因此您只需收集
readshapefile
的返回值,并更改返回的
LineCollection
对象的
linestyle
,这可以通过
LineCollection.set\u linestyle()
完成。因此,原则上,您可以使用以下方法更改打印形状文件的线型:

result = m.readshapefile('shapefiles/nic_autoc2018046n_pl_a', 'IceEdge', zorder = 10, color = 'blue')#, drawbounds = False)
col = result[-1]
col.set_linestyle('dotted')
plt.show()
但是,
shapefile
包含5429条不同长度的独立线段,matplotlib似乎无法处理如此大量的非连续线。至少在我的机器上,绘图没有在一小时内完成,所以我中断了这个过程。我对你的文件做了一些处理,似乎很多线条都被不必要地分割成了几段(我猜这是因为冰盖的轮廓是在瓷砖上确定的,然后再拼接在一起,但只有供应商才会真正知道)。也许把相邻的部分拼凑起来会有帮助,但我不确定

我还想知道,如果用虚线表示,结果是否会那么好,因为有太多的急弯。下面我展示了一张图片,其中我仅使用此代码绘制了100条最长的线段(不包括
绘制海岸线
和较粗的线):

import numpy as np
result = m.readshapefile('shapefiles/nic_autoc2018046n_pl_a', 'IceEdge', zorder = 10, color = 'blue')#, drawbounds = False)

col = result[-1]
segments = col.get_segments()
seglens =  [len(seg) for seg in col.get_segments()]

segments = np.array(segments)
seglens  = np.array(seglens)

idx = np.argsort(seglens)
seglens  = seglens[idx]
segments = segments[idx]

col.remove()

new_col = LineCollection(segments[-100:],linewidths = 2, linestyles='dotted', colors='b')
ax.add_collection(new_col)

plt.show()
结果如下所示:

result = m.readshapefile('shapefiles/nic_autoc2018046n_pl_a', 'IceEdge', zorder = 10, color = 'blue')#, drawbounds = False)
col = result[-1]
col.set_linestyle('dotted')
plt.show()

没有shapefile很难运行您的代码。Thomas Kühn-很抱歉!因为我无法直接在堆栈上发布shapefile,所以我编辑了找到shapefile的帖子。可以在此处找到形状文件:,其中开始日期为2月15日,结束日期为2月17日,日期类型为Ice Edge。这应该是第一个环节。”nic_autoc2018046n_pl_a'