1
    map = Basemap(resolution ='c')
    map.drawcoastlines()
    map.drawcountries()
    map.drawmeridians(np.arange(0, 360, 30))
    map.drawparallels(np.arange(-90, 90, 30))
    map.bluemarble()
    lat_list=worksheet.col_values(16)
    long_list=worksheet.col_values(17)
    lat_list.remove('lat')
    long_list.remove('lon')
    for index in range(0,len(lat_list)):
        x, y = map(long_list[index],lat_list[index])
        map.plot(x, y, 'bo', markersize=5)

The above plots points on a map. I have a list of size same as lat_list and long_list. I want to make the points on the map colored according to that also show a color scale on the map with corresponding label.

Abhishek Bhatia
  • 9,404
  • 26
  • 87
  • 142

1 Answers1

2

Take a look at this tutorial. I would recommend on reading it in its entirety; part of becoming an adept programmer is reading other peoples code and understanding what they did. But, if you're only interested in your answer, scroll down until you see the subtitle "Adding Color", or click on the link that is at the top of the page. Hope this helps!

As it relates to coloring your values, I have some sort of a work around for your problem, which I found here. I modified the rgb function found in the answer to return hex colors, HTML format. Then you will need to create your own color bar based on your the values that are mapped to those colors. You will also need to use something like gridspec to size the figure appropriately.

import matplotlib as mpl
import matplotlib.pyplot as plot
from mpl_toolkits.basemap import Basemap
import matplotlib.gridspec as gridspec

def rgb(mini,maxi,value):
    mini, maxi, value = float(mini), float(maxi), float(value)
    ratio = 2 * (value - mini) / (maxi-mini)
    b = int(max(0,255*(1-ratio)))
    r = int(max(0,255*(ratio -1)))
    g = 255 - b - r
    b = hex(b)
    r = hex(r)
    g = hex(g)
    if len(b) == 3:
        b = b[0:2] + '0' + b[-1]
    if len(r) == 3:
        r = r[0:2] + '0' + r[-1]
    if len(g) == 3:
        g = g[0:2] + '0' + g[-1]
    color = '#'+r[2:]+g[2:]+b[2:]
    return color


#gridspec will ensure that we get good size ratios when we display the figure
gs = gridspec.GridSpec(1,2, width_ratios = [20,1], height_ratios = [10,1])

#generate the default map
fig = plot.figure(figsize=(17,10))
ax1 = plot.subplot(gs[:, :-1])
map1 = Basemap(ax=ax1)
#code to add more things to the map


#coloring values

correspondance = {}
minimum = min(list_of_values)
maximum = max(list_of_values)
for lon,lat,val in zip(list_of_longitude, list_of_latitude,list_of_values):
   #get the color for this value and add it on to the end of our list
   color = rgb(minimum,maximum,value)
   #make a dictionary that has each value corresponding to its color
   #will be used later to make the color bar
   correspondance[val] = color
   map1.plot(lon,lat, marker = 'o', color = color)



ax2 = plot.subplot(gs[:-1, 1])

#making a color bar requires the values to be in an ordered list
#as well as the colors to be in an ordered list corresponding to the values
bounds = sorted(set(list_of_values))    #get a list of unique sorted values
colors = [correspondance[value] for value in bounds]   #a list of colors corresponding to its value in bounds

cmap = mpl.colorbar.Colorbase(colors, 'indexed')

#bounds needs to of size length of colors + 1
bounds += [max(bounds) + .001]

norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

cb = mpl.colorbar.ColorbarBase(ax2, cmap = cmap, norm = norm, \
        boundaries = [float(min(list_of_values)-.1)] + bounds + [float(max(list_of_values)+.1)],\
        ticks = bounds, spacing = 'proportional', orientation = 'vertical'  )
Community
  • 1
  • 1
K. Shores
  • 875
  • 1
  • 18
  • 46