首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有彩色箭图的Colormap

带有彩色箭图的Colormap
EN

Stack Overflow用户
提问于 2017-05-31 16:15:46
回答 2查看 11.1K关注 0票数 5

我正在绘制一张地图,上面有箭头。这些箭头表示风向、平均风速(每个方向)和位置(每个方向)。

方向由箭头的方向指示。箭头的长度表示该方向的平均风速。箭头的颜色表示在这样的方向上有风的出现。

这一切都可以通过下面的脚本很好地工作:

代码语言:javascript
复制
windData = pd.read_csv(src+'.txt'), sep='\t', names=['lat', 'lon', 'wind_dir_start', 'wind_dir_end', 'total_num_data_points','num_data_points', 'avg_windspeed']).dropna()

# plot map
m = Basemap(llcrnrlon=minLon, llcrnrlat=minLat, urcrnrlon=maxLon, urcrnrlat=maxLat, resolution='i')
Left, Bottom = m(minLon, minLat)
Right, Top = m(maxLon, maxLat)

# get x y
x, y = m(windData['lon'], windData['lat'])

# angles
angleStart = -windData['wind_start']+90
angleStart[angleStart<0] = np.radians(angleStart[angleStart<0]+360.)

angleEnd = -windData['wind_end']+90
angleEnd[angleEnd<0] = np.radians(angleEnd[angleEnd<0]+360.)

angle = angleStart + math.radians(binSize/2.)

xux = np.cos(angle) * windData['avg_windspeed']
yuy = np.sin(angle) * windData['avg_windspeed']

# occurence
occurence = (windData['num_data_points']/windData['total_num_data_points'])

xi = np.linspace(minLon, maxLon, 300)
yi = np.linspace(minLat, maxLat, 300)

# plotting
## xux and yuy are used negatively because they are measured as "coming from" and displayed as "going to"
# To make things more readable I left a threshold for the occurence out
# I usually plot x, y, xux, yuy and the colors as var[occurence>threshold]
Q = m.quiver(x, y, -xux, -yuy, scale=75, zorder=6, color=cm.jet, width=0.0003*Width, cmap=cm.jet)
qk = plt.quiverkey(Q, 0.5, 0.92, 3, r'$3 \frac{m}{s}$', labelpos='S', fontproperties={'weight': 'bold'})
m.scatter(x, y, c='k', s=20*np.ones(len(x)), zorder=10, vmin=4.5, vmax=39.)

这个图很好地显示了箭头,但现在我想在图的旁边添加一个颜色映射表,以指示出现的百分比。我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2017-05-31 21:19:20

好的

常规导入,外加import matplotlib

代码语言:javascript
复制
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

伪造要绘制的数据(MCVE的tx)

代码语言:javascript
复制
NP = 10
np.random.seed(1)
x = np.random.random(NP)
y = np.random.random(NP)
angle = 1.07+np.random.random(NP) # NE to NW
velocity = 1.50+np.random.random(NP)
o = np.random.random(NP)
occurrence = o/np.sum(o)
dx = np.cos(angle)*velocity
dy = np.sin(angle)*velocity

创建一个mappable,这样Matplotib就没有理由抱怨"RuntimeError:没有mappable可用于创建色条“。

代码语言:javascript
复制
norm = matplotlib.colors.Normalize()
norm.autoscale(occurrence)
cm = matplotlib.cm.copper

sm = matplotlib.cm.ScalarMappable(cmap=cm, norm=norm)
sm.set_array([])

并绘制数据

代码语言:javascript
复制
plt.quiver(x, y, dx, dy, color=cm(norm(o)))
plt.colorbar(sm)
plt.show()

参考文献:

  1. A logarithmic colorbar in matplotlib scatter plot
  2. Drawing a colorbar aside a line plot, using Matplotlib and
  3. Different colours for arrows in quiver plot.

附言:在最近(肯定是在3.+) Matplotlib发布了cm.set_array咒语不再是必要的

票数 5
EN

Stack Overflow用户

发布于 2017-05-31 17:14:04

你想让色条显示不同的风速吗?如果是这样的话,在Q = m.quiver(...)qk = ...行之间放置plt.colorbar()可能就足够了。

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

https://stackoverflow.com/questions/44279270

复制
相关文章

相似问题

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