python - 如何根据强度用标记颜色绘制气旋的轨迹

标签 python python-3.x pandas matplotlib matplotlib-basemap

我正在尝试在 basemap 上绘制气旋的轨迹。我成功地用相同颜色的标记绘制了它,我想要的是根据强度变化绘制标记。我将附上我的代码部分,我可以在其中使用相同的颜色标记绘制轨道。如果有人可以在如何根据强度绘制轨迹方面帮助我,我将不胜感激。
我的代码:

llons, llats = np.meshgrid(lons, lats)
x,y = map(llons,llats)
plt.style.use('seaborn-white')
clevels=[-1.6,-1.2,-0.8,-0.4,0.0,0.4,0.8]
cs = map.contourf(x,y,plt_data,clevels,cmap=plt.cm.jet)
#cs = map.contourf(x,y,plt_data,cmap=plt.cm.jet)
#CS2 = ax.contour(cs, levels=cs.levels, colors='k')
#ax.clabel(cs,inline=True, fontsize=10)
map.colorbar(cs)
####################track##########################
import pandas as pd
df = pd.read_excel('E:/bst_trc.xls',sheet_name='1990')
latitude = df.Latitude.values[0:25]
longitude = df.Longitude.values[0:25]
it = df.Grade.values[0:25]
x,y = map(longitude, latitude)
colors = {'SUCS':'red', 'ESCS':'blue', 'SCS':'green', 'D':'black','VSCS':'orange','DD':'cyan'}
plt.scatter(x,y, s=50,edgecolors="red", facecolors='none', linewidth=2)
plt.plot(x,y,'k',linewidth=1.5 )

另外,我附上了经纬度和强度值:

enter image description here

最佳答案

使用您的数据和此代码:

import matplotlib.pyplot as plt
import pandas as pd
plt.style.use('seaborn-white')

df = pd.read_csv('data.csv')

colors = {'SUCS': 'red', 'ESCS': 'blue', 'SCS': 'green', 'D': 'black', 'VSCS': 'orange', 'DD': 'cyan', 'CS': 'magenta'}

fig, ax = plt.subplots(1, 1)

for grade in list(df['grade'].unique()):
    ax.scatter(df[df['grade'] == grade]['lon'],
               df[df['grade'] == grade]['lat'],
               s = 50,
               label = grade,
               facecolors = colors[grade])

plt.plot(df['lon'], df['lat'], 'k-', lw = 1)

ax.set_xlabel('Longitude')
ax.set_ylabel('Latitude')
ax.axis('equal')

plt.legend()
plt.show()

我得到这个散点图:

enter image description here


如果您想将其重叠到 map 上,请检查此代码:

import matplotlib.pyplot as plt
import pandas as pd
from mpl_toolkits.basemap import Basemap
plt.style.use('seaborn-white')

df = pd.read_csv('data.csv')

colors = {'SUCS': 'red', 'ESCS': 'blue', 'SCS': 'green', 'D': 'black', 'VSCS': 'orange', 'DD': 'cyan', 'CS': 'magenta'}

fig, ax = plt.subplots(1, 1)

m = Basemap(llcrnrlon = 75, llcrnrlat = 5, urcrnrlon = 90, urcrnrlat = 20, resolution = 'i', projection = 'merc')
m.drawcoastlines(color = 'black')

df['x'], df['y'] = m(list(df['lon']), list(df['lat']))

for grade in list(df['grade'].unique()):
    ax.scatter(df[df['grade'] == grade]['x'],
               df[df['grade'] == grade]['y'],
               s = 50,
               label = grade,
               facecolors = colors[grade])

plt.plot(df['x'], df['y'], 'k-', lw = 1)

plt.legend()
plt.show()

给出了这张 map :

enter image description here


如果您想要更简单的解决方案,可以将上面代码中的 for 循环替换为:

import seaborn as sns
sns.scatterplot(data = df,
                x = 'x',
                y = 'y',
                hue = 'grade',
                s = 50)

关于python - 如何根据强度用标记颜色绘制气旋的轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62282616/

相关文章:

python - 如何让 Pandas 列返回另一列和 min_val 之间的最小值

python - Pandas 数据帧值拒绝被评估为带有 `.apply(eval)` 的 float 。为什么?

python - 在numpy中生成一维缩小范围数组

python-3.x - 向 http.server.BaseHTTPRequestHandler 的子类添加一个新的实例变量

macos - mac 上的 python 3 的 openCV 3 有问题吗

python - Pandas 数据帧 : Pipe separated values in a cell

python - Mavericks 之后 Pandas 找不到 dateutil.parser

python - 用于语音识别的流输入

python - 是否可以在 matplotlib hexbin 图中命名 x 轴和 y 轴?

python - 从 nx1 二进制标签数组生成 one-hot 向量