如何使用python在地理地图上以3D弧线绘制边缘?

时间:2018-07-21 11:53:18

标签: python matplotlib-basemap network-analysis

我想创建类似于

的网络地图

enter image description here

在python中。到目前为止,我已经能够在2D上绘制它。边缘的密度使图形变得不整齐。在3-D中绘制边缘会增强美感,并使其更具吸引力。 任何帮助将不胜感激。预先感谢

1 个答案:

答案 0 :(得分:0)

原则上,Basemap可以实现您想做的事情。您可以在this tutorial之后的3D轴上绘制Basemap,然后在其上方绘制圆弧。但是,如果您想按照示例数字所暗示的方式为不同的国家/地区着色,则必须开始处理shapefiles(例如,参见herehere)。无论如何,在示例代码下可以绘制底图和3D图中的弧。在3D轴上绘制底图的部分直接来自我上面链接的教程。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import PolyCollection
import numpy as np

m = Basemap()

fig = plt.figure()
ax = Axes3D(fig)

ax.azim = 270
ax.elev = 50
ax.dist = 8

ax.add_collection3d(m.drawcoastlines(linewidth=0.25))
ax.add_collection3d(m.drawcountries(linewidth=0.35))

polys = []
for polygon in m.landpolygons:
    polys.append(polygon.get_coords())


lc = PolyCollection(polys, edgecolor='black',facecolor='#DDDDDD', closed=False)
ax.add_collection3d(lc)

def plot_arc(ax,p1,p2,height,N=100):
    x = np.linspace(p1[0],p2[0],N)
    y = np.linspace(p1[1],p2[1],N)
    z = (1-np.linspace(-1,1,N)**2)*height
    ax.plot(x,y,z)

plot_arc(ax,(-70,0),(80,50),1)
plot_arc(ax,(80,50),(125,-25),1)
plot_arc(ax,(125,-25),(-70,0),1)

plt.show()

这里是示例代码的结果:

result of the above code

希望这会有所帮助。