首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据CSV列中的元素在Matplotlib-Basemap图上设置不同的标记?

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

Stack Overflow用户
提问于 2020-10-17 19:32:48
回答 1查看 815关注 0票数 4

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

代码语言:javascript
复制
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,...。在这里,如何根据其对应的状态改变点的标记,并与现有的图例一起绘制它的图例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-17 23:28:15

你想做的事情会带来不同的问题。

  1. plt.scatter使用单个标记类型,要在子图中具有不同的标记类型,您必须调用scatter的次数与要绘制的不同类别的数量(即状态)相同。

  1. Matplotlib可用的不同标记数少于映射中的状态数.

  1. 在您使用的大小很难识别不同的标记。

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

  1. Basemap不赞成Cartopy.

  1. jet颜色映射不再是Matplotlib中的默认颜色映射,原因很多,

如果这些问题不是你的问题,你可以这样做。

代码语言:javascript
复制
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(...列表中即可。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64406546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档