【问题标题】:How to plot lines between multiple x,y points in matplotlib/basemap如何在 matplotlib/basemap 中的多个 x,y 点之间绘制线
【发布时间】:2019-06-26 13:48:00
【问题描述】:

我正在尝试使用底图在 matplotlib 中的 2 个不同 X 和 Y 点之间绘制多条线。

import matplotlib.pyplot as plt
import numpy as np

Map=pd.read_excel(r'file.xlsx')

lat=Map['Start Latitude'] 
long=Map['Start Longitude'] 
lat1=Map['Fin Latitude'] 
long2=Map['Fin Longitude']

x,y=m(lon.values,lat.values)
plt=m.scatter(x,y, marker="o", latlon=False)

例如:

Line1 would be between 1x,1y and 1x1,1y1
Line3 would be between 2x,2y and 2x1,2y1
Line3 would be between 3x,3y and 3x1,3y1
etc

其中“x”、“y”、“x1”和“y1”位于不同的列中(“起始纬度”、“起始经度”、“fin latitude”、“fin longitude”)。

会有100多个不同的行

我可以在上面绘制“起始纬度”和“起始经度”(使用x,y=m(lon.values,lat.values)plt=m.scatter(x,y, marker="o", latlon=False),但无法绘制第二个点并将一条线连接到它。

任何建议将不胜感激!谢谢你。

【问题讨论】:

  • 目前你的问题太宽泛了。您没有提供任何数据,因此人们必须首先创建一个示例数据集,然后为您从头开始编写代码。也许,由于您是新的贡献者,我建议您阅读How to create a Minimal, Complete, and Verifiable example。此外,您的问题中有一些未定义的内容。
  • 什么是m?你在用basemap吗?根据我的经验,这与普通的 matplotlib 完全不同,应该得到这个标签。
  • 一般来说,您使用plt.plot([x1,x2], [y1,y2]) 绘制一条连接点的线。您可以将其放在 for 循环中,作为最简单的情况,循环将运行您的 x,y 值,可以使用 np.loadtxt 例如从包含数据的文件中读取这些值。
  • @roganjosh:不幸的是,我还是素食主义者;)
  • 如您所见,这在评论中难以辨认。您可以edit您的问题以包含相关信息。

标签: python matplotlib mapping matplotlib-basemap


【解决方案1】:

由于“100+”行,我建议在这里使用LineCollection。当然,您首先需要在底图系统中投影坐标。然后你可以再次将它们堆叠成一个numpy数组并为LineCollection创建段数组。

import numpy as np; np.random.seed(42)
import pandas as pd
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection


df = pd.DataFrame({"lon1" : np.random.randint(-15,30,10),
                   "lat1" : np.random.randint(33,66,10),
                   "lon2" : np.random.randint(-15,30,10),
                   "lat2" : np.random.randint(33,66,10)})

m = Basemap(llcrnrlon=-12,llcrnrlat=30,urcrnrlon=50,urcrnrlat=69.,
             resolution='i', projection='tmerc', lat_0 = 48.9, lon_0 = 15.3)

m.drawcoastlines(linewidth=0.72, color='gray')
m.drawcountries(zorder=0, color='gray')


lon1, lat1 = m(df.lon1.values, df.lat1.values)
lon2, lat2 = m(df.lon2.values, df.lat2.values)

pts = np.c_[lon1, lat1, lon2, lat2].reshape(len(lon1), 2, 2)
plt.gca().add_collection(LineCollection(pts, color="crimson", label="Lines"))

m.plot(lon1, lat1, marker="o", ls="", label="Start")
m.plot(lon2, lat2, marker="o", ls="", label="Fin")

plt.legend()
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 2021-11-21
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多