Python 如何基于CSV列中的元素在Matplotlib Basemap打印上设置不同的标记?

Python 如何基于CSV列中的元素在Matplotlib Basemap打印上设置不同的标记?,python,matplotlib,matplotlib-basemap,Python,Matplotlib,Matplotlib Basemap,我正在使用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 cor

我正在使用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,
。在这里,如何根据点的相应状态更改点的标记,并将其图例与现有图例一起绘制。

要执行的操作会带来不同的问题

  • plt.scatter
    使用单个标记类型,以具有不同的 子批次中的标记类型必须调用
    scatter
    多次 作为要绘制的不同类别(即状态)的数量

  • Matplotlib可用的不同标记数为 少于地图中的州数

  • 按照您所使用的尺寸,很难辨别 不同的标记

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

  • Basemap已被弃用,取而代之的是Cartopy

  • 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
    colormap,他们只需将
    cmap='jet'
    附加到
    m.scatter(…
    参数列表中即可


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