如何根据特定范围获取具有不同颜色的散点图的散点
How to get scatter points for a scatter plot with different colors in accordance to a particular range
希望每个人在这些困难时期都过得很好。我正在尝试在底图上绘制带有散点的旋风的轨迹。我成功绘制了它,但我想要的是根据一定范围用不同颜色绘制散点图,例如黑色小于 17 节,蓝色 17-27 节之间,青色 27-33 节之间, 33-47 绿色,47-63 橙色和大于 120 节的红色。我能够用各种颜色绘制散点图,但不能根据范围绘制。因此,如果有人可以通过向我展示如何做来帮助我,我将不胜感激。
我使用的代码和生成的图附在下面。
import os
os.environ["PROJ_LIB"] = "C:\Utilities\Python\Anaconda\Library\share"; #fixr
from mpl_toolkits.basemap import Basemap
import proplot as plot
import pandas as pd
import matplotlib as mpl
m=Basemap()
#dt = pd.read_excel('E:/tracks.xlsx',sheet_name='amp')
data = [25,25,35,40,45,55,70,80,100,120,125,130,125,115,105,100,95]
lon= [87,86.3,86.3,86.1,86,86,86,86.1,86.3,86.2,86.3,86.5,86.7,86.9,87,87.2,87.5]
lat= [10.4,10.9,10.9,11.1,11.4,11.5,12,12.5,13.2,13.4,14,14.9,15.6,16.5,17.4,18.4,19.1]
cmap = mpl.cm.get_cmap('bwr')
norm = mpl.colors.Normalize(vmin=25, vmax=130)
colors = cmap(norm(data))
x,y=m(lon,lat)
fig, axs = plot.subplots(ncols=1, axwidth=3, proj='merc', proj_kw={'lon_0': 180})
axs.format(
latlim=(0, 30), lonlim=(50, 100),linewidth=1,
gridlinewidth=0,coast=True, latlines=30, lonlines=60,)
l=axs.scatter(x,y,c=colors,s=10)
fig.colorbar(colors)
您可以使用 ListedColormap
with BoundaryNorm
生成您的自定义离散颜色条。这是一个使用 cartopy
:
的例子
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib as mpl
data = [25,25,35,40,45,55,70,80,100,120,125,130,125,115,105,100,95]
lon = [87,86.3,86.3,86.1,86,86,86,86.1,86.3,86.2,86.3,86.5,86.7,86.9,87,87.2,87.5]
lat = [10.4,10.9,10.9,11.1,11.4,11.5,12,12.5,13.2,13.4,14,14.9,15.6,16.5,17.4,18.4,19.1]
cmap = mpl.colors.ListedColormap(['blue', 'cyan', 'green', 'orange'])
norm = mpl.colors.BoundaryNorm([17, 27, 33, 47, 63], cmap.N)
cmap.set_under('black')
cmap.set_over('red')
colors = cmap(norm(data))
fig, ax = plt.subplots(figsize=(10, 5), subplot_kw={'projection': ccrs.PlateCarree()})
ax.coastlines() # draw coastlines
ax.set_extent([65, 95, 5, 25]) # zoom into India
ax.scatter(lon, lat, s=20, c=colors, cmap=cmap, norm=norm, transform=ccrs.Geodetic())
fig.colorbar(mpl.cm.ScalarMappable(norm, cmap), extend='both')
希望每个人在这些困难时期都过得很好。我正在尝试在底图上绘制带有散点的旋风的轨迹。我成功绘制了它,但我想要的是根据一定范围用不同颜色绘制散点图,例如黑色小于 17 节,蓝色 17-27 节之间,青色 27-33 节之间, 33-47 绿色,47-63 橙色和大于 120 节的红色。我能够用各种颜色绘制散点图,但不能根据范围绘制。因此,如果有人可以通过向我展示如何做来帮助我,我将不胜感激。 我使用的代码和生成的图附在下面。
import os
os.environ["PROJ_LIB"] = "C:\Utilities\Python\Anaconda\Library\share"; #fixr
from mpl_toolkits.basemap import Basemap
import proplot as plot
import pandas as pd
import matplotlib as mpl
m=Basemap()
#dt = pd.read_excel('E:/tracks.xlsx',sheet_name='amp')
data = [25,25,35,40,45,55,70,80,100,120,125,130,125,115,105,100,95]
lon= [87,86.3,86.3,86.1,86,86,86,86.1,86.3,86.2,86.3,86.5,86.7,86.9,87,87.2,87.5]
lat= [10.4,10.9,10.9,11.1,11.4,11.5,12,12.5,13.2,13.4,14,14.9,15.6,16.5,17.4,18.4,19.1]
cmap = mpl.cm.get_cmap('bwr')
norm = mpl.colors.Normalize(vmin=25, vmax=130)
colors = cmap(norm(data))
x,y=m(lon,lat)
fig, axs = plot.subplots(ncols=1, axwidth=3, proj='merc', proj_kw={'lon_0': 180})
axs.format(
latlim=(0, 30), lonlim=(50, 100),linewidth=1,
gridlinewidth=0,coast=True, latlines=30, lonlines=60,)
l=axs.scatter(x,y,c=colors,s=10)
fig.colorbar(colors)
您可以使用 ListedColormap
with BoundaryNorm
生成您的自定义离散颜色条。这是一个使用 cartopy
:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib as mpl
data = [25,25,35,40,45,55,70,80,100,120,125,130,125,115,105,100,95]
lon = [87,86.3,86.3,86.1,86,86,86,86.1,86.3,86.2,86.3,86.5,86.7,86.9,87,87.2,87.5]
lat = [10.4,10.9,10.9,11.1,11.4,11.5,12,12.5,13.2,13.4,14,14.9,15.6,16.5,17.4,18.4,19.1]
cmap = mpl.colors.ListedColormap(['blue', 'cyan', 'green', 'orange'])
norm = mpl.colors.BoundaryNorm([17, 27, 33, 47, 63], cmap.N)
cmap.set_under('black')
cmap.set_over('red')
colors = cmap(norm(data))
fig, ax = plt.subplots(figsize=(10, 5), subplot_kw={'projection': ccrs.PlateCarree()})
ax.coastlines() # draw coastlines
ax.set_extent([65, 95, 5, 25]) # zoom into India
ax.scatter(lon, lat, s=20, c=colors, cmap=cmap, norm=norm, transform=ccrs.Geodetic())
fig.colorbar(mpl.cm.ScalarMappable(norm, cmap), extend='both')