Draw part of Africa


In [2]:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import math
# set up orthographic map projection with
# perspective of satellite looking down at 50N, 100W.
# use low resolution coastlines.
# don't plot features that are smaller than 1000 square km.
plt.figure(figsize=(14,14))

map = Basemap(projection='lcc',lat_0 = 3, lon_0 = 0, width=5000000,height=4000000,
               area_thresh = 2000., resolution='l')

shp_info_path = "/Users/fransua/Downloads/basemap-1.0.7/examples/st99_d00"
shp_info = map.readshapefile(shp_info_path,'states',drawbounds=True)

# draw coastlines, country boundaries, fill continents.
map.drawcoastlines()
map.drawcountries()
map.drawmapscale(-15, -13, -15, -13, 1000)
map.fillcontinents(color = 'lightgrey')
#map.drawrivers()
#map.etopo()

# draw the edge of the map projection region (the projection limb)
map.drawmapboundary()
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0, 360, 10))
map.drawparallels(np.arange(-90, 90, 10))


Out[2]:
{-10: ([<matplotlib.lines.Line2D at 0x109441d10>], []),
 0: ([<matplotlib.lines.Line2D at 0x10944c310>], []),
 10: ([<matplotlib.lines.Line2D at 0x10944c8d0>], []),
 20: ([<matplotlib.lines.Line2D at 0x10944ce90>], [])}

Plot country specific data

Load coordinates from google tsv file


In [3]:
country_coords = """
AD 	42.546245 	1.601554 	Andorra
AE 	23.424076 	53.847818 	United Arab Emirates
AF 	33.93911 	67.709953 	Afghanistan
AG 	17.060816 	-61.796428 	Antigua and Barbuda
AI 	18.220554 	-63.068615 	Anguilla
AL 	41.153332 	20.168331 	Albania
AM 	40.069099 	45.038189 	Armenia
AN 	12.226079 	-69.060087 	Netherlands Antilles
AO 	-11.202692 	17.873887 	Angola
AQ 	-75.250973 	-0.071389 	Antarctica
AR 	-38.416097 	-63.616672 	Argentina
AS 	-14.270972 	-170.132217 	American Samoa
AT 	47.516231 	14.550072 	Austria
AU 	-25.274398 	133.775136 	Australia
AW 	12.52111 	-69.968338 	Aruba
AZ 	40.143105 	47.576927 	Azerbaijan
BA 	43.915886 	17.679076 	Bosnia and Herzegovina
BB 	13.193887 	-59.543198 	Barbados
BD 	23.684994 	90.356331 	Bangladesh
BE 	50.503887 	4.469936 	Belgium
BF 	12.238333 	-1.561593 	Burkina Faso
BG 	42.733883 	25.48583 	Bulgaria
BH 	25.930414 	50.637772 	Bahrain
BI 	-3.373056 	29.918886 	Burundi
BJ 	9.30769 	2.315834 	Benin
BM 	32.321384 	-64.75737 	Bermuda
BN 	4.535277 	114.727669 	Brunei
BO 	-16.290154 	-63.588653 	Bolivia
BR 	-14.235004 	-51.92528 	Brazil
BS 	25.03428 	-77.39628 	Bahamas
BT 	27.514162 	90.433601 	Bhutan
BV 	-54.423199 	3.413194 	Bouvet Island
BW 	-22.328474 	24.684866 	Botswana
BY 	53.709807 	27.953389 	Belarus
BZ 	17.189877 	-88.49765 	Belize
CA 	56.130366 	-106.346771 	Canada
CC 	-12.164165 	96.870956 	Cocos [Keeling] Islands
CD 	-4.038333 	21.758664 	Congo [DRC]
CF 	6.611111 	20.939444 	Central African Republic
CG 	-0.228021 	15.827659 	Congo [Republic]
CH 	46.818188 	8.227512 	Switzerland
CI 	7.539989 	-5.54708 	Côte d'Ivoire
CK 	-21.236736 	-159.777671 	Cook Islands
CL 	-35.675147 	-71.542969 	Chile
CM 	7.369722 	12.354722 	Cameroon
CN 	35.86166 	104.195397 	China
CO 	4.570868 	-74.297333 	Colombia
CR 	9.748917 	-83.753428 	Costa Rica
CU 	21.521757 	-77.781167 	Cuba
CV 	16.002082 	-24.013197 	Cape Verde
CX 	-10.447525 	105.690449 	Christmas Island
CY 	35.126413 	33.429859 	Cyprus
CZ 	49.817492 	15.472962 	Czech Republic
DE 	51.165691 	10.451526 	Germany
DJ 	11.825138 	42.590275 	Djibouti
DK 	56.26392 	9.501785 	Denmark
DM 	15.414999 	-61.370976 	Dominica
DO 	18.735693 	-70.162651 	Dominican Republic
DZ 	28.033886 	1.659626 	Algeria
EC 	-1.831239 	-78.183406 	Ecuador
EE 	58.595272 	25.013607 	Estonia
EG 	26.820553 	30.802498 	Egypt
EH 	24.215527 	-12.885834 	Western Sahara
ER 	15.179384 	39.782334 	Eritrea
ES 	40.463667 	-3.74922 	Spain
ET 	9.145 	40.489673 	Ethiopia
FI 	61.92411 	25.748151 	Finland
FJ 	-16.578193 	179.414413 	Fiji
FK 	-51.796253 	-59.523613 	Falkland Islands [Islas Malvinas]
FM 	7.425554 	150.550812 	Micronesia
FO 	61.892635 	-6.911806 	Faroe Islands
FR 	46.227638 	2.213749 	France
GA 	-0.803689 	11.609444 	Gabon
GB 	55.378051 	-3.435973 	United Kingdom
GD 	12.262776 	-61.604171 	Grenada
GE 	42.315407 	43.356892 	Georgia
GF 	3.933889 	-53.125782 	French Guiana
GG 	49.465691 	-2.585278 	Guernsey
GH 	7.946527 	-1.023194 	Ghana
GI 	36.137741 	-5.345374 	Gibraltar
GL 	71.706936 	-42.604303 	Greenland
GM 	13.443182 	-15.310139 	Gambia
GN 	9.945587 	-9.696645 	Guinea
GP 	16.995971 	-62.067641 	Guadeloupe
GQ 	1.650801 	10.267895 	Equatorial Guinea
GR 	39.074208 	21.824312 	Greece
GS 	-54.429579 	-36.587909 	South Georgia and the South Sandwich Islands
GT 	15.783471 	-90.230759 	Guatemala
GU 	13.444304 	144.793731 	Guam
GW 	11.803749 	-15.180413 	Guinea-Bissau
GY 	4.860416 	-58.93018 	Guyana
GZ 	31.354676 	34.308825 	Gaza Strip
HK 	22.396428 	114.109497 	Hong Kong
HM 	-53.08181 	73.504158 	Heard Island and McDonald Islands
HN 	15.199999 	-86.241905 	Honduras
HR 	45.1 	15.2 	Croatia
HT 	18.971187 	-72.285215 	Haiti
HU 	47.162494 	19.503304 	Hungary
ID 	-0.789275 	113.921327 	Indonesia
IE 	53.41291 	-8.24389 	Ireland
IL 	31.046051 	34.851612 	Israel
IM 	54.236107 	-4.548056 	Isle of Man
IN 	20.593684 	78.96288 	India
IO 	-6.343194 	71.876519 	British Indian Ocean Territory
IQ 	33.223191 	43.679291 	Iraq
IR 	32.427908 	53.688046 	Iran
IS 	64.963051 	-19.020835 	Iceland
IT 	41.87194 	12.56738 	Italy
JE 	49.214439 	-2.13125 	Jersey
JM 	18.109581 	-77.297508 	Jamaica
JO 	30.585164 	36.238414 	Jordan
JP 	36.204824 	138.252924 	Japan
KE 	-0.023559 	37.906193 	Kenya
KG 	41.20438 	74.766098 	Kyrgyzstan
KH 	12.565679 	104.990963 	Cambodia
KI 	-3.370417 	-168.734039 	Kiribati
KM 	-11.875001 	43.872219 	Comoros
KN 	17.357822 	-62.782998 	Saint Kitts and Nevis
KP 	40.339852 	127.510093 	North Korea
KR 	35.907757 	127.766922 	South Korea
KW 	29.31166 	47.481766 	Kuwait
KY 	19.513469 	-80.566956 	Cayman Islands
KZ 	48.019573 	66.923684 	Kazakhstan
LA 	19.85627 	102.495496 	Laos
LB 	33.854721 	35.862285 	Lebanon
LC 	13.909444 	-60.978893 	Saint Lucia
LI 	47.166 	9.555373 	Liechtenstein
LK 	7.873054 	80.771797 	Sri Lanka
LR 	6.428055 	-9.429499 	Liberia
LS 	-29.609988 	28.233608 	Lesotho
LT 	55.169438 	23.881275 	Lithuania
LU 	49.815273 	6.129583 	Luxembourg
LV 	56.879635 	24.603189 	Latvia
LY 	26.3351 	17.228331 	Libya
MA 	31.791702 	-7.09262 	Morocco
MC 	43.750298 	7.412841 	Monaco
MD 	47.411631 	28.369885 	Moldova
ME 	42.708678 	19.37439 	Montenegro
MG 	-18.766947 	46.869107 	Madagascar
MH 	7.131474 	171.184478 	Marshall Islands
MK 	41.608635 	21.745275 	Macedonia [FYROM]
ML 	17.570692 	-3.996166 	Mali
MM 	21.913965 	95.956223 	Myanmar [Burma]
MN 	46.862496 	103.846656 	Mongolia
MO 	22.198745 	113.543873 	Macau
MP 	17.33083 	145.38469 	Northern Mariana Islands
MQ 	14.641528 	-61.024174 	Martinique
MR 	21.00789 	-10.940835 	Mauritania
MS 	16.742498 	-62.187366 	Montserrat
MT 	35.937496 	14.375416 	Malta
MU 	-20.348404 	57.552152 	Mauritius
MV 	3.202778 	73.22068 	Maldives
MW 	-13.254308 	34.301525 	Malawi
MX 	23.634501 	-102.552784 	Mexico
MY 	4.210484 	101.975766 	Malaysia
MZ 	-18.665695 	35.529562 	Mozambique
NA 	-22.95764 	18.49041 	Namibia
NC 	-20.904305 	165.618042 	New Caledonia
NE 	17.607789 	8.081666 	Niger
NF 	-29.040835 	167.954712 	Norfolk Island
NG 	9.081999 	8.675277 	Nigeria
NI 	12.865416 	-85.207229 	Nicaragua
NL 	52.132633 	5.291266 	Netherlands
NO 	60.472024 	8.468946 	Norway
NP 	28.394857 	84.124008 	Nepal
NR 	-0.522778 	166.931503 	Nauru
NU 	-19.054445 	-169.867233 	Niue
NZ 	-40.900557 	174.885971 	New Zealand
OM 	21.512583 	55.923255 	Oman
PA 	8.537981 	-80.782127 	Panama
PE 	-9.189967 	-75.015152 	Peru
PF 	-17.679742 	-149.406843 	French Polynesia
PG 	-6.314993 	143.95555 	Papua New Guinea
PH 	12.879721 	121.774017 	Philippines
PK 	30.375321 	69.345116 	Pakistan
PL 	51.919438 	19.145136 	Poland
PM 	46.941936 	-56.27111 	Saint Pierre and Miquelon
PN 	-24.703615 	-127.439308 	Pitcairn Islands
PR 	18.220833 	-66.590149 	Puerto Rico
PS 	31.952162 	35.233154 	Palestinian Territories
PT 	39.399872 	-8.224454 	Portugal
PW 	7.51498 	134.58252 	Palau
PY 	-23.442503 	-58.443832 	Paraguay
QA 	25.354826 	51.183884 	Qatar
RE 	-21.115141 	55.536384 	Réunion
RO 	45.943161 	24.96676 	Romania
RS 	44.016521 	21.005859 	Serbia
RU 	61.52401 	105.318756 	Russia
RW 	-1.940278 	29.873888 	Rwanda
SA 	23.885942 	45.079162 	Saudi Arabia
SB 	-9.64571 	160.156194 	Solomon Islands
SC 	-4.679574 	55.491977 	Seychelles
SD 	12.862807 	30.217636 	Sudan
SE 	60.128161 	18.643501 	Sweden
SG 	1.352083 	103.819836 	Singapore
SH 	-24.143474 	-10.030696 	Saint Helena
SI 	46.151241 	14.995463 	Slovenia
SJ 	77.553604 	23.670272 	Svalbard and Jan Mayen
SK 	48.669026 	19.699024 	Slovakia
SL 	8.460555 	-11.779889 	Sierra Leone
SM 	43.94236 	12.457777 	San Marino
SN 	14.497401 	-14.452362 	Senegal
SO 	5.152149 	46.199616 	Somalia
SR 	3.919305 	-56.027783 	Suriname
ST 	0.18636 	6.613081 	São Tomé and Príncipe
SV 	13.794185 	-88.89653 	El Salvador
SY 	34.802075 	38.996815 	Syria
SZ 	-26.522503 	31.465866 	Swaziland
TC 	21.694025 	-71.797928 	Turks and Caicos Islands
TD 	15.454166 	18.732207 	Chad
TF 	-49.280366 	69.348557 	French Southern Territories
TG 	8.619543 	0.824782 	Togo
TH 	15.870032 	100.992541 	Thailand
TJ 	38.861034 	71.276093 	Tajikistan
TK 	-8.967363 	-171.855881 	Tokelau
TL 	-8.874217 	125.727539 	Timor-Leste
TM 	38.969719 	59.556278 	Turkmenistan
TN 	33.886917 	9.537499 	Tunisia
TO 	-21.178986 	-175.198242 	Tonga
TR 	38.963745 	35.243322 	Turkey
TT 	10.691803 	-61.222503 	Trinidad and Tobago
TV 	-7.109535 	177.64933 	Tuvalu
TW 	23.69781 	120.960515 	Taiwan
TZ 	-6.369028 	34.888822 	Tanzania
UA 	48.379433 	31.16558 	Ukraine
UG 	1.373333 	32.290275 	Uganda
UM 	19.2784823	166.653968	U.S. Minor Outlying Islands
US 	37.09024 	-95.712891 	United States
UY 	-32.522779 	-55.765835 	Uruguay
UZ 	41.377491 	64.585262 	Uzbekistan
VA 	41.902916 	12.453389 	Vatican City
VC 	12.984305 	-61.287228 	Saint Vincent and the Grenadines
VE 	6.42375 	-66.58973 	Venezuela
VG 	18.420695 	-64.639968 	British Virgin Islands
VI 	18.335765 	-64.896335 	U.S. Virgin Islands
VN 	14.058324 	108.277199 	Vietnam
VU 	-15.376706 	166.959158 	Vanuatu
WF 	-13.768752 	-177.156097 	Wallis and Futuna
WS 	-13.759029 	-172.104629 	Samoa
XK 	42.602636 	20.902977 	Kosovo
YE 	15.552727 	48.516388 	Yemen
YT 	-12.8275 	45.166244 	Mayotte
ZA 	-30.559482 	22.937506 	South Africa
ZM 	-13.133897 	27.849332 	Zambia
ZW 	-19.015438 	29.154857 	Zimbabwe
"""
country_coords = dict([(c.split('\t')[3], (float(c.split('\t')[1]), float(c.split('\t')[2]))) if c.split('\t')[1] 
                       else (c.split('\t')[3], (0, 0)) for c in country_coords.split('\n') if len(c.split('\t'))>2])

In [4]:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import math
# set up orthographic map projection with
# perspective of satellite looking down at 50N, 100W.
# use low resolution coastlines.
# don't plot features that are smaller than 1000 square km.
plt.figure(figsize=(14,14))

map = Basemap(projection='lcc',lat_0 = 3, lon_0 = 0, width=5000000,height=4000000,
               area_thresh = 2000., resolution='l')

shp_info_path = "/Users/fransua/Downloads/basemap-1.0.7/examples/st99_d00"
shp_info = map.readshapefile(shp_info_path,'states',drawbounds=True)

# draw coastlines, country boundaries, fill continents.
map.drawcoastlines()
map.drawcountries()
map.drawmapscale(-15, -13, -15, -13, 1000)
#map.fillcontinents(color = 'lightgrey')
map.drawrivers(color='blue')
#map.etopo()
map.shadedrelief()

# draw the edge of the map projection region (the projection limb)
map.drawmapboundary()
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0, 360, 10))
map.drawparallels(np.arange(-90, 90, 10))

for country in ['Guinea', 'Nigeria']:
    # some points on a circle cos,sin
    xo, yo = map(country_coords[country][1], country_coords[country][0])
    plt.plot(xo, yo, 'ro')
    plt.text(xo, yo + 20000, country, va='bottom', ha='center')


Plot Ebola data


In [6]:
import matplotlib.dates as mdates
# from http://www.who.int/csr/don/archive/disease/ebola/en/

data = """
DATE	Guinea	Liberia	Sierra Leone	Nigeria
22.03.2014	49/29			
24.03.2014	86/59			
25.03.2014	86/60			
26.03.2014	86/62			
27.03.2014	103/66			
28.03.2014	112/70	2/0		
31.03.2014	122/80	8/2	2/2		
01.04.2014	127/83	8/5	2/2		
05.04.2014	143/86	18/7	2/2		
07.04.2014	151/95	21/10	2/2		
09.04.2014	158/101	20/10	2/2		
10.04.2014	158/101	20/12	2/2		
14.04.2014	168/108	26/13	2/2		
16.04.2014	197/122	27/13	2/2		
17.04.2014	203/129	27/13	2/2		
20.04.2014	208/136	34/11	2/2		
23.04.2014	218/141	35/11	2/2		
26.04.2014	224/143	35/11	2/2		
01.05.2014	226/149	13/11	2/2	
03.05.2014	231/155	13/11	2/2	
05.05.2014	235/157	13/11	2/2	
07.05.2014	236/158	13/11	2/2	
10.05.2014	233/157	12/11	2/2	
12.05.2014	248/171	12/11	2/2	
23.05.2014	258/174	12/11	2/2	
27.05.2014	281/186	12/11	16/5	
29.05.2014	291/193	12/11	50/6	
01.06.2014	328/208	12/11	79/6	
03.06.2014	344/215	12/11	79/6	
05.06.2014	344/215	12/11	81/6	
10.06.2014	351/226	12/11	89/7	
17.06.2014	398/264	33/24	97/49	
19.06.2014	390/267	41/25	136/58	
22.06.2014	390/270	51/34	158/34	
30.06.2014	413/303	107/65	239/99	
02.07.2014	412/305	115/75	252/101	
06.07.2014	408/307	131/84	305/127	
08.07.2014	409/309	142/88	337/142	
12.07.2014	406/304	172/105	386/194	
14.07.2014	411/310	174/106	397/197	
17.07.2014	410/310	196/116	442/206	
20.07.2014	415/314	224/127	454/219	
23.07.2014	427/319	249/129	525/224	
27.07.2014	460/339	329/156	533/233	1/1
01.08.2014	485/358	468/255	646/273	4/1
04.08.2014	495/363	516/282	691/286	9/1
06.08.2014	495/367	554/294	717/298	13/2
09.08.2014	506/373	599/323	730/315	13/2
11.08.2014	510/377	670/355	783/334	12/3
13.08.2014	519/380	786/413	810/348	12/4
16.08.2014	543/394	834/466	848/365	15/4
18.08.2014	579/396	972/576	907/374	15/4
20.08.2014	607/406	1082/624	910/392	16/4
"""
countries = {}
dates = []
for day in data.split('\n'):
    if not day: 
        continue
    if day.startswith("DATE"):
        country_list = day.split('\t')[1:]
        continue
    date = [int(i) for i in day.split()[0].split('.')]
    data = [v if v else '0/0' for v in day.split('\t')[1:]]
    dates.append(date)
    for i, country in enumerate(country_list):
        countries.setdefault(country, []).append((int(data[i].split('/')[0]), int(data[i].split('/')[1])))
# clean data, remove false casualties:
#for c in countries:
#    maxd = 0
#    maxi = 0
#    for j, (d, i) in enumerate(countries[c]):
#        if d > maxd:
#            maxd = d
#        if i > maxi:
#            maxi = i
#        countries[c][j] = (maxd, maxi)
dates = [mdates.datetime.datetime(*d[::-1]) for d in dates]

In [ ]:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.optimize import curve_fit
from scipy.stats import t as t_distr

fig = plt.figure(figsize=(18, 11.4))

map = Basemap(projection='lcc',lat_0 = 7.0, lon_0 = .1, width=4000000, height=3000000,
              area_thresh = 500., resolution='l')

shp_info_path = "/Users/fransua/Downloads/basemap-1.0.7/examples/st99_d00"
shp_info = map.readshapefile(shp_info_path,'states',drawbounds=True)

# draw coastlines, country boundaries, fill continents.
#map.drawcoastlines()
map.drawrivers(color='lightblue')
map.drawcountries()
#map.drawmapscale(-15, -6, -15, -6, 500)
#map.fillcontinents(color = 'lightgrey')
# map.etopo()
map.shadedrelief()

# draw the edge of the map projection region (the projection limb)
map.drawmapboundary()
# draw lat/lon grid lines every 30 degrees.
# map.drawmeridians(np.arange(0, 360, 10))
# map.drawparallels(np.arange(-90, 90, 10))

for country in country_coords:
    if country in countries:
        continue
    # some points on a circle cos,sin
    xo, yo = map(country_coords[country][1], country_coords[country][0])
    if plt.xlim()[0]<xo<plt.xlim()[1]:
        if plt.ylim()[0]<yo<plt.ylim()[1]:
            plt.text(xo, yo, unicode(country, 'utf-8'), 
                     va='center', ha='center', color='grey', zorder=1000, weight='bold')

xxx = []
yyy = []
xy1s = []
xy2s = []
cmonth = None
months = []
for i, d in enumerate(dates):
    if cmonth == d.month:
        continue
    cmonth = d.month
    months.append(i)

sizes = [[] for _ in xrange(len(months) + 1)]

for country in countries:
    # some points on a circle cos,sin
    xo, yo = map(country_coords[country][1], country_coords[country][0])
    xxx.append(xo)
    yyy.append(yo)
    sizes[-1].append(countries[country][-1][0] * 15)
    for m in xrange(len(months)):
        sizes[m].append(countries[country][months[m]][0] * 15)
    plt.text(xo, yo + 20000, unicode(country), va='bottom', ha='center', color='black', zorder=1000, 
             weight='bold', size=13)
scat = []
for size in sizes:
    scat.append(plt.scatter(xxx, yyy, s=size, facecolor='red', edgecolor='darkred', zorder=100, alpha=.1, linewidth=1))
plt.scatter(xxx, yyy, s=size, facecolor='none', edgecolor='darkred', zorder=100, alpha=.4, linewidth=1)

months = mdates.MonthLocator()  # every month
days   = mdates.DayLocator()  # every month
# http://strftime.org/
yearsFmt = mdates.DateFormatter("%B")

ax2 = fig.add_subplot(111, axisbelow=False, frame_on=False)
ax2.xaxis.set_major_locator(months)
ax2.xaxis.set_major_formatter(yearsFmt)
# ax2.xaxis.set_minor_locator(days)

datemin = min(dates)
datemax = max(dates)
ax2.set_xlim(datemin, mdates.datetime.datetime(datemax.year, datemax.month, datemax.day.real + 10))
y1max = [sum([countries[c][i][0] for c in countries]) for i in xrange(len(dates))][-1]
y2max = [sum([countries[c][i][1] for c in countries]) for i in xrange(len(dates))][-1]
ax2.set_ylim(0, y1max + 100)

#ax2.text(dates[-1], y1max + 40, ' Infected', horizontalalignment='center', 
#         verticalalignment='bottom', color='darkorange', weight='bold', size=14)

#ax2.text(dates[-1], y2max + 40, ' Fatalities', horizontalalignment='center', 
#         verticalalignment='bottom', color='darkred', weight='bold', size=14)

ax2.plot(dates, [sum([countries[c][i][0] for c in countries]) for i in xrange(len(dates))], lw=3, c='k', alpha=.7)
line1 = ax2.plot(dates, [sum([countries[c][i][0] for c in countries]) for i in xrange(len(dates))], lw=2, c='darkorange', alpha=1)
ax2.plot(dates, [sum([countries[c][i][1] for c in countries]) for i in xrange(len(dates))], lw=3, c='k', alpha=.7)
line2 = ax2.plot(dates, [sum([countries[c][i][1] for c in countries]) for i in xrange(len(dates))], lw=2, c='darkred', alpha=1)
ax2.set_ylabel('Casualties', size=14)
ax2.set_xlabel('2014', size=14)

# fit
def func(x, c, a, z):
    return a+c*x**z

def get_r2 (fun, X, Y, *args):
    sstot = sum([(Y[i]-np.mean(Y))**2 for i in xrange(len(Y))])
    sserr = sum([(Y[i] - fun(X[i], *args))**2 for i in xrange(len(Y))])
    return 1 - sserr/sstot

def uncertainty_band(x, y, df=1, conf=0.95):
    """
    Calculates the confidence or prediction band of the polynomial regression 
    model at the desired confidence level. 
    The 2 sigma confidence interval is 95% sure to contain the best-fit 
    regression line.
    The 2 sigma prediction interval contains 95% of the data points.
    
    :params .95 conf: desired confidence level, by default 0.95 (2 sigma)
    :params x: data array or list
    :params y: data array or list
    :params 1 df: polynomial degree for the fit
    
    :returns: an array with the confidence values to add/substract, another 
       with prediction values, an array with the fitted x values, an array with
       the fitted y values and the scipy.poly1d object, the R-square value of
       the fit
       
    """
    if not isinstance(x, np.ndarray):
        x = np.array(x)
    if not isinstance(y, np.ndarray):
        y = np.array(y)
        
    # fit a curve to the data using a least squares 1st order polynomial fit
    z = np.polyfit(x, y, df)
    p = np.poly1d(z)
    # predict y values of origional data using the fit
    p_y = p(x)

    # create series of new test x values to predict for
    p_x = np.linspace(min(x), max(x), 100)

    # number of samples in origional fit
    n = x.size
    # alpha 1 minus the wanted probability
    alpha = 1. - conf
    # t distribution with n-2 degrees of freedom
    t = t_distr.ppf(1. - alpha / 2., n - df - 1)

    # mean of x
    mean_x = np.mean(x)
    # Error sum of squares
    sse = sum((y - p_y)**2)
    # Error mean square (estimate of the variance)
    mse = sse / (n - df - 1)
    # Square individual deviation
    sdi = (p_x - mean_x)**2
    # standard deviation
    sd = sum((x - mean_x)**2)
    # relative individual deviation
    sdi_sd = sdi / sd

    confs = t * np.sqrt(mse * (      1.0 / n + sdi_sd))
    preds = t * np.sqrt(mse * (1.0 + 1.0 / n + sdi_sd))

    # calculate R-square
    sstot = sum((y - np.mean(y))**2)
    sserr = sum((y - p(x))**2)
    r2 = 1 - sserr/sstot

    # now predict y based on test x-values
    p_y = p(p_x)

    return confs, preds, p_x, p_y, p, r2

confs, preds, p_x, p_y, p, r2 = uncertainty_band(np.array([d.toordinal() - 735314 for d in dates]), 
                                                 np.array([sum([countries[c][i][0] for c in countries])
                                                           for i in xrange(len(dates))]), df=6)

#plt.plot([mdates.num2date(d + 735314) for d in p_x], p_y, color='darkorange', lw=1, ls='--', label='Regression line')
# plot confidence limits
plt.fill_between([mdates.num2date(d + 735314) for d in p_x], p_y + confs, p_y - confs, color='darkorange', alpha=0.3)
plt.fill_between([mdates.num2date(d + 735314) for d in p_x], p_y - preds, p_y + preds, color='darkorange', alpha=0.2)



confs, preds, p_x, p_y, p, r2 = uncertainty_band(np.array([d.toordinal() - 735314 for d in dates]), 
                                                 np.array([sum([countries[c][i][1] for c in countries])
                                                           for i in xrange(len(dates))]), df=6)

#plt.plot([mdates.num2date(d + 735314) for d in p_x], p_y, color='darkorange', lw=1, ls='--', label='Regression line')
# plot confidence limits
plt.fill_between([mdates.num2date(d + 735314) for d in p_x], p_y + confs, p_y - confs, color='darkred', alpha=0.3)
plt.fill_between([mdates.num2date(d + 735314) for d in p_x], p_y - preds, p_y + preds, color='darkred', alpha=0.2)

p1 = Rectangle((0, 0), 1, 1, fc="darkorange", alpha=.3)
p2 = Rectangle((0, 0), 1, 1, fc="darkorange", alpha=.2)
p3 = Rectangle((0, 0), 1, 1, fc="darkred", alpha=.3)
p4 = Rectangle((0, 0), 1, 1, fc="darkred", alpha=.2)

plt.legend([scat[0]] + line1 + [p1, p2] + line2 + [p3, p4], ['Total cases each month', 
                                                             'Cases', 
                                                             '95% confidence band', '95% prediction band',
                                                             'Deaths', 
                                                             '95% confidence band', '95% prediction band'], 
           frameon=False, loc='upper left', bbox_to_anchor=[1,1])
fig.subplots_adjust(right=0.8)

plt.savefig('Ebola_map_25082014.pdf', format='pdf')
plt.savefig('Ebola_map_25082014.png', format='png')
plt.show()

In [ ]: