Как нарисовать края в виде 3D-дуг на географической карте с помощью Python?

Я хочу создать карту сети, похожую на

введите описание изображения здесь

в питоне. Пока я могу нарисовать его на 2D. Плотность ребер делает график неопрятным. Построение краев в 3-D увеличит красоту и сделает ее более привлекательной. Любая помощь будет высоко оценен. заранее спасибо

1 ответ

В принципе то, что вы хотите сделать, возможно с Basemap, Вы можете нарисовать Basemap в 3D-оси, следуя этому уроку, а затем просто нанесите ваши дуги поверх этого. Однако, если вы хотите раскрасить разные страны так, как это показывает пример, вам нужно начать shapefiles (см. например здесь или здесь). Во всяком случае, ниже пример кода, который строит базовую карту и дуги в 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()

Вот результат примера кода:

результат приведенного выше кода

Надеюсь это поможет.

Другие вопросы по тегам