Colormap with colored quiver

I am drawing a map with arrows on top. These arrows represent wind direction, average wind speed (per direction), and location (per direction).

The direction is indicated by the direction of the arrow. The length of the arrow indicated the average wind speed in that direction. The color of the arrow indicates the presence of winds in that direction.

This all works fine with the script below:

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.)

      

This graph shows arrows well, but now I want to add a color code that indicates the percentage of occurrence next to the graph. How should I do it?

+3


source to share


2 answers


Do you want the color bar to display different wind speeds? If so, it may be sufficient to place plt.colorbar()

between the lines Q = m.quiver(...)

and qk = ...

.



+1


source


OK

Normal imports, plus import matplotlib

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

      

Tampering with data to be displayed (tx for MCVE)

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

      

Create a mapping so that Matplotib has no reason to complain about "RuntimeError: The mappable was not found to be used to create a color bar".



norm = matplotlib.colors.Normalize()
norm.autoscale(occurrence)
cm = matplotlib.cm.copper

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

      

and plot the data

plt.quiver(x, y, dx, dy, color=cm(norm(o)))
plt.colorbar(sm)
plt.show()

      

quiverplot cum colorbar

Literature:

+1


source







All Articles