如何根据 CSV 列中的元素在 Matplotlib-Basemap 图上设置不同的标记?

How to set different markers on a Matplotlib-Basemap plot based on elements in a CSV column?

我正在使用 matplotlib 的底图在世界地图上绘制点。我正在从 CSV 文件中的两列 cordb['Latitude']cordb['Longitude'] 中提取纬度和经度值。此外,图中点的颜色是根据同一 CSV 中 cordb['level'] 列中的相应值制作的,如下图所示。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

cordb = pd.read_csv(r'data.csv')
 
lat = cordb['Latitude'].values
lon = cordb['Longitude'].values

level = cordb['level'].values

fig = plt.figure(figsize=(20, 8))
#basemap
m = Basemap(projection='cyl', resolution='h', 
            llcrnrlat=10, urcrnrlat=70,
            llcrnrlon=-140, urcrnrlon=-40, )

m.drawcoastlines(linewidth=0.3)

m.scatter(lon, lat, latlon=True,
          c= level ,
          cmap='jet', s=4, alpha=1)

# create colorbar and legend
plt.colorbar(label= 'level')

plt.legend()
plt.show()

我在 CSV 文件中还有另一列 cordb['state'],其元素类似于 Texas, Alaska, Washington,...。在这里,如何根据其对应的状态更改点的标记并将其图例与现有图例一起绘制。

你想做什么会出现不同的问题。

  1. plt.scatter 使用 SINGLE 标记类型,有不同的 子图中的标记类型你必须多次调用 scatter 作为您要绘制的不同类别(即状态)的数量。

  2. Matplotlib可用的不同标记的数量是 少于地图中的州数。

  3. 以您使用的尺寸很难辨别 不同的标记。

  4. 您提供的标记信息是多余的, 因为可以指示 Basemap 绘制州边界以及加拿大各省之间的边界。

  5. 已弃用底图,转而使用 Cartopy。

  6. jet 颜色图不再是 Matplotlib 中的默认颜色图,原因有很多

如果这些问题对你来说不是问题,你可以这样进行

from matplotlib.colors import Normalize
...

# we want to use the same normalization for all the scatter plots
norm = Normalize(vmin=np.min(level), vmax=np.max(level))

states = cordb['states']
state_list = sorted(set(states))
marker = {'Texas':'*', 'Ontario':'o', ...}

# create a list of Artists to provide handles to plt.legend
scatters = [m.scatter(lon[ix], lat[ix], c= level[ix], marker=marker[state],
                      latlon=True, norm=norm, s=4, alpha=1)
             for state in state_list for ix in (states==state,)]
plt.legend(scatters, state_list)

如果有人急需 jet 颜色图,他们只需将 cmap='jet' 附加到 m.scatter(... 参数列表即可。


警告:我已经检查了伪造数据的等效实现,您可能需要适应您的用例