Aalok kapoor wrote: > Hi all, > > I have tried to use basemap to plot world map and successfully plotted > points on it by giving lists of latitudes and longitudes. One problem > i have is i want to give different colors for different countries, > i.e. regarding population. For ex. for range 2-20 -- green. 20-100 -- > red.. etc.. > How can i give colors to different countries according to data I pass > to it? please help me in knowing whether it is possible or not. > > Thanks in advance, > -Aalok > > Aaolok: If you have access to the individual country polygons by ccountry name, it's easy. Unfortunately, the built-in country database is not accessible that way. Googling 'country shapefiles' came up with this.
http://www.cipotato.org/DIVA/data/MoreData.htm Using that shapefile is was pretty easy to adapt the 'fillstates.py' example to fill the country polygons. Here each country is filled with a random color, so you can just replace the random number with a value from your dataset. import pylab as p from matplotlib.toolkits.basemap import Basemap as Basemap from matplotlib.colors import rgb2hex import random # Miller projection world map. m = Basemap(llcrnrlon=-180,llcrnrlat=-90,urcrnrlon=180,urcrnrlat=90, projection='mill') # draw country boundaries. # data from http://www.cipotato.org/DIVA/data/MoreData.htm shp_info = m.readshapefile('world_adm0','countries',drawbounds=True) # choose a color for each state based on population density. colors={} countrynames=[] cmap = p.cm.jet # use 'jet' colormap vmin = 0; vmax = 1000000 # set range of population for shapedict in m.countries_info: countryname = shapedict['NAME'] # set population to a random number # (replace with a real value) pop = float(random.randint(0,1000000)) # calling colormap with value between 0 and 1 returns # rgba value. Invert color range (hot colors are high # population), take sqrt root to spread out colors more. colors[countryname] = cmap(1.-p.sqrt((pop-vmin)/(vmax-vmin)))[:3] countrynames.append(countryname) # cycle through country names, color each one. for nshape,seg in enumerate(m.countries): xx,yy = zip(*seg) color = rgb2hex(colors[countrynames[nshape]]) p.fill(xx,yy,color,edgecolor=color) # draw meridians and parallels. m.drawparallels(p.arange(-90,91,30),labels=[1,0,0,0]) m.drawmeridians(p.arange(-180,181,60),labels=[0,0,0,1]) p.title('Filling Country Polygons') p.show() HTH, -Jeff -- Jeffrey S. Whitaker Phone : (303)497-6313 NOAA/OAR/CDC R/PSD1 FAX : (303)497-6449 325 Broadway Boulder, CO, USA 80305-3328 ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel