Colormap with colored quiver
Asked Answered
A

2

5

I am plotting a map with arrows on top of it. These arrows represent winddirections, average windspeed (per direction) and the occurence (per direction).

The direction is indicated by the direction of the arrow. The length of the arrow indicated the average windspeed in that direction. The color of the arrow indicates the occurence of winds in such a 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 plot shows the arrows well, but now I want to add a colormap that indicates the percentage of occurence next to the plot. How would I do this?

Ashmore answered 31/5, 2017 at 8:15 Comment(2)
You may find these answers useful, an answer of mine about adding a colorbar to a line plot and another one about adding a colorbar to a scatter plot. — If you have any problem I could try to give a detailed answer — If the linked answer are good enough, upvote them... Forgot to mention, if you like you can also answer your own questionVtarj
I find it confusing that you use color=cm.jet. Does this define the color of the arrow? If so, how does it relate to "occurence of winds"? In order to define a colorbar you would need a quantity according to which the colorbar is defined, but I don't see this quantity here in the code. Also mind that it would tremendously help to have a minimal reproducible example of the issue.Marrymars
V
6

OK

Usual imports, plus import matplotlib

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

Fake the data to be plotted (tx for the 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 mappable so that Matplotib has no reason to complain "RuntimeError: No mappable was found to use for colorbar creation."

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

References:

  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.


P.S. In recent (for sure in 3.+) Matplotlib releases the cm.set_array incantation is no more necessary

Vtarj answered 31/5, 2017 at 13:19 Comment(0)
R
1

Do you want the colorbar to show the different wind speeds? If so, it might be sufficient to place plt.colorbar() between the lines Q = m.quiver(...) and qk = ....

Ragland answered 31/5, 2017 at 9:14 Comment(1)
No, the windspeed is already clear by the quiverkey and length of the arrow. I want the colors which indicate the occurence to be in a colorbar. just plt.colorbar() gives the following error: RuntimeError: No mappable was found to use for colorbar creation. First define a mappable such as an image (with imshow) or a contour set (with contourf).Ashmore

© 2022 - 2024 — McMap. All rights reserved.