分离数据框 lat/lon 对并根据列值绘制多个图形
Separate dataframe lat/lon pairs and plot multiple figures based on column value
我有一个由 lat/lon 对组成的多边形数据框。在 lat/lon 列中带有 'GAP' 和 NaN 的行是分隔符。所以在这种情况下,我有 4 个具有多个 lat/lon 位置的多边形。我的目标是将这些多边形彼此分开,然后使用 cartopy 进行绘图。
0 1 2
0 POINT 87.6298 9.397332
1 POINT 87.8435 9.842206
2 POINT 87.2354 9.472004
4 GAP NaN NaN
5 POINT 87.8354 9.397332
6 POINT 87.9544 9.472004
7 POINT 87.9632 9.191509
8 POINT 87.6244 9.221509
9 POINT 87.4554 9.397332
10 GAP NaN NaN
11 POINT 87.6249 9.397332
12 POINT 87.7556 9.221509
13 POINT 87.5567 9.086767
14 POINT 87.3222 9.397332
15 GAP NaN NaN
16 POINT 87.6554 9.221509
17 POINT 87.9667 9.191509
18 POINT 87.8854 9.056767
19 POINT 87.4452 9.086767
假设在任何时候这是 运行,多边形的数量和每个多边形中 lat/lon 对的数量可以改变。
下面的设置示例代码:
df = pd.read_excel(xl, sheet_name=0, header=None)
#change column names
df.rename(columns={1:'lon', 2:'lat'},inplace=True)
#replace GAP with nan so i can separate by group numbers with each line of nans (didnt work with 'GAP')
df.replace('GAP',np.nan, inplace=True)
df['group_no'] = df.isnull().all(axis=1).cumsum()
#define amount of unique numbers and put into list for looping
numbers = df['group_no'].unique()
aa = list(numbers)
这是我迷路的地方(设置之后和绘制代码之前的区域)如下所示。
a_lon, a_lat = 87.8544, 8.721576
b_lon, b_lat = 87.6554, 8.585951
fig,ax = plt.subplots()
plt.figure(figsize=(10.6,6))
proj = ccrs.PlateCarree()
ax = plt.axes(projection=proj)
ax.stock_img()
ax.set_extent([90, 85, 7, 11], crs=ccrs.PlateCarree())
proj = ccrs.Geodetic()
plt.plot([a_lon, b_lon], [a_lat, b_lat], linewidth=1, color='blue', transform=proj)
#plt.show()
如您所见,我用 NaN 替换了 'GAP',然后用 'group_no' 分隔行,这是一个新列。然后删除了Nan的。结果数据框:
0 lon lat group_no
0 POINT 87.6298 9.397332 0
1 POINT 87.8435 9.842206 0
2 POINT 87.2354 9.472004 0
4 POINT 87.8354 9.397332 1
5 POINT 87.9544 9.472004 1
6 POINT 87.9632 9.191509 1
7 POINT 87.6244 9.221509 1
8 POINT 87.4554 9.397332 1
10 POINT 87.6249 9.397332 2
11 POINT 87.7556 9.221509 2
12 POINT 87.5567 9.086767 2
13 POINT 87.3222 9.397332 2
15 POINT 87.6554 9.221509 3
16 POINT 87.9667 9.191509 3
17 POINT 87.8854 9.056767 3
18 POINT 87.4452 9.086767 3
我尝试了一些方法,但似乎无法完成交易。我试过使用 group_by 在字典中将它们分开,键是 group_no,值是 lat/lon 对,但我不太了解字典来操纵它们并为每个'key'。
我还尝试将每个分离到一个新的数据框中。我想我可以循环并创建一个 df0、df1 等,然后使用 for 循环进行绘图,但也无法弄清楚。
如有任何帮助,我们将不胜感激,请询问是否需要更多详细信息。
你就快完成了,如果你在组号上调用 groupby,你可以拉出每个组并获得 lat/lon 对。确保您也设置了正确的投影。
from shapely.geometry import Polygon
for group_no,group_data in df.groupby('group_no'):
poly_coords = group_data[['lon','lat']].values
# Whatever function you are using to create shape with the 'poly_coords e.g.'
polygon = Polygon(poly_coords)
#add to map ...
我有一个由 lat/lon 对组成的多边形数据框。在 lat/lon 列中带有 'GAP' 和 NaN 的行是分隔符。所以在这种情况下,我有 4 个具有多个 lat/lon 位置的多边形。我的目标是将这些多边形彼此分开,然后使用 cartopy 进行绘图。
0 1 2
0 POINT 87.6298 9.397332
1 POINT 87.8435 9.842206
2 POINT 87.2354 9.472004
4 GAP NaN NaN
5 POINT 87.8354 9.397332
6 POINT 87.9544 9.472004
7 POINT 87.9632 9.191509
8 POINT 87.6244 9.221509
9 POINT 87.4554 9.397332
10 GAP NaN NaN
11 POINT 87.6249 9.397332
12 POINT 87.7556 9.221509
13 POINT 87.5567 9.086767
14 POINT 87.3222 9.397332
15 GAP NaN NaN
16 POINT 87.6554 9.221509
17 POINT 87.9667 9.191509
18 POINT 87.8854 9.056767
19 POINT 87.4452 9.086767
假设在任何时候这是 运行,多边形的数量和每个多边形中 lat/lon 对的数量可以改变。
下面的设置示例代码:
df = pd.read_excel(xl, sheet_name=0, header=None)
#change column names
df.rename(columns={1:'lon', 2:'lat'},inplace=True)
#replace GAP with nan so i can separate by group numbers with each line of nans (didnt work with 'GAP')
df.replace('GAP',np.nan, inplace=True)
df['group_no'] = df.isnull().all(axis=1).cumsum()
#define amount of unique numbers and put into list for looping
numbers = df['group_no'].unique()
aa = list(numbers)
这是我迷路的地方(设置之后和绘制代码之前的区域)如下所示。
a_lon, a_lat = 87.8544, 8.721576
b_lon, b_lat = 87.6554, 8.585951
fig,ax = plt.subplots()
plt.figure(figsize=(10.6,6))
proj = ccrs.PlateCarree()
ax = plt.axes(projection=proj)
ax.stock_img()
ax.set_extent([90, 85, 7, 11], crs=ccrs.PlateCarree())
proj = ccrs.Geodetic()
plt.plot([a_lon, b_lon], [a_lat, b_lat], linewidth=1, color='blue', transform=proj)
#plt.show()
如您所见,我用 NaN 替换了 'GAP',然后用 'group_no' 分隔行,这是一个新列。然后删除了Nan的。结果数据框:
0 lon lat group_no
0 POINT 87.6298 9.397332 0
1 POINT 87.8435 9.842206 0
2 POINT 87.2354 9.472004 0
4 POINT 87.8354 9.397332 1
5 POINT 87.9544 9.472004 1
6 POINT 87.9632 9.191509 1
7 POINT 87.6244 9.221509 1
8 POINT 87.4554 9.397332 1
10 POINT 87.6249 9.397332 2
11 POINT 87.7556 9.221509 2
12 POINT 87.5567 9.086767 2
13 POINT 87.3222 9.397332 2
15 POINT 87.6554 9.221509 3
16 POINT 87.9667 9.191509 3
17 POINT 87.8854 9.056767 3
18 POINT 87.4452 9.086767 3
我尝试了一些方法,但似乎无法完成交易。我试过使用 group_by 在字典中将它们分开,键是 group_no,值是 lat/lon 对,但我不太了解字典来操纵它们并为每个'key'。
我还尝试将每个分离到一个新的数据框中。我想我可以循环并创建一个 df0、df1 等,然后使用 for 循环进行绘图,但也无法弄清楚。
如有任何帮助,我们将不胜感激,请询问是否需要更多详细信息。
你就快完成了,如果你在组号上调用 groupby,你可以拉出每个组并获得 lat/lon 对。确保您也设置了正确的投影。
from shapely.geometry import Polygon
for group_no,group_data in df.groupby('group_no'):
poly_coords = group_data[['lon','lat']].values
# Whatever function you are using to create shape with the 'poly_coords e.g.'
polygon = Polygon(poly_coords)
#add to map ...