在地图上绘制不同大小的圆圈
Draw different sized circles on a map
我有以下 sorted DataFrame(数字是完全随机的):
In[1]: df
Out[1]:
Total Count
Location 1 20 5
Location 2 15 4
Location 3 13 3
...
Location 10 1 1
每个位置都有纬度和经度。
我想用圆圈在地图上标出这些位置。圆的半径需要对应Total
中的数量。换句话说,Location 1需要有最大的圆,Location 2需要有较小的圆,等等
另外,我想在颜色上进行过渡。最大的圆圈是红色的,下一个是橙色的,下一个是黄色的,等等
最后,我想在每个圆圈旁边做一个注释。
我设法在地图上画了蓝色的点,但是我不知道如何画出相应大小和颜色的圆圈。
到目前为止,这是我的代码:
m = Basemap(resolution='i', projection='merc', llcrnrlat=49.0, urcrnrlat=52.0, llcrnrlon=1., urcrnrlon=8.0, lat_ts=51.0)
m.drawcountries()
m.drawcoastlines()
m.fillcontinents()
for row_index, row in df.iterrows():
x, y = db.getLocation(row_index)
lat, lon = m(y, x)
m.plot(lat, lon, 'b.', alpha=0.5)
#This draws blue dots.
plt.title('Top 10 Locations')
plt.show()
matplotlib scatter
函数具有 s
和 c
参数,可让您绘制不同大小和颜色的点。
当您指定 kind='scatter'
时,Pandas DataFrame.plot
方法调用 matplotlib scatter
函数。它还将额外的参数传递给对 scatter
的调用,因此您可以使用
之类的东西
df.plot(kind='scatter', x='lon', y='lat', s=df['Total']*50, c=df['Total'], cmap=cmap)
绘制你的点。
Annotating the points 可以通过调用 plt.annotate
.
来完成
The gist_rainbow
colormap 从红色变为橙色再变为黄色……变为紫色。 gist_rainbow_r
是反转的颜色图,它使 red
对应于最大值。
例如,
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'Total': [20,15,13,1],
'lat': [40,0,-30,50],
'lon': [40,50,60,70], },
index=['Location {}'.format(i) for i in range(1,5)])
cmap = plt.get_cmap('gist_rainbow_r')
df.plot(kind='scatter', x='lon', y='lat', s=df['Total']*50, c=df['Total'], cmap=cmap)
for idx, row in df.iterrows():
x, y = row[['lon','lat']]
plt.annotate(
str(idx),
xy = (x, y), xytext = (-20, 20),
textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
plt.show()
产量
不要为每个点调用一次 df.plot
或 plt.scatter
。随着点数的增加,这将变得非常缓慢。相反,在 DataFrame 中收集必要的数据(经度和纬度),以便可以通过 one call 到 df.plot
:
来绘制点
longitudes, latitudes = [], []
for row_index, row in df.iterrows():
x, y = db.getLocation(row_index)
lat, lon = m(y, x)
longitudes.append(lon)
latitudes.append(lat)
plt.annotate(
str(row_index),
xy = (x, y), xytext = (-20, 20),
textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
df['lon'] = longitudes
df['lat'] = latitudes
cmap = plt.get_cmap('gist_rainbow_r')
ax = plt.gca()
df.plot(kind='scatter', x='lon', y='lat', s=df['Total']*50, c=df['Total'],
cmap=cmap, ax=ax)
我有以下 sorted DataFrame(数字是完全随机的):
In[1]: df
Out[1]:
Total Count
Location 1 20 5
Location 2 15 4
Location 3 13 3
...
Location 10 1 1
每个位置都有纬度和经度。
我想用圆圈在地图上标出这些位置。圆的半径需要对应Total
中的数量。换句话说,Location 1需要有最大的圆,Location 2需要有较小的圆,等等
另外,我想在颜色上进行过渡。最大的圆圈是红色的,下一个是橙色的,下一个是黄色的,等等
最后,我想在每个圆圈旁边做一个注释。
我设法在地图上画了蓝色的点,但是我不知道如何画出相应大小和颜色的圆圈。
到目前为止,这是我的代码:
m = Basemap(resolution='i', projection='merc', llcrnrlat=49.0, urcrnrlat=52.0, llcrnrlon=1., urcrnrlon=8.0, lat_ts=51.0)
m.drawcountries()
m.drawcoastlines()
m.fillcontinents()
for row_index, row in df.iterrows():
x, y = db.getLocation(row_index)
lat, lon = m(y, x)
m.plot(lat, lon, 'b.', alpha=0.5)
#This draws blue dots.
plt.title('Top 10 Locations')
plt.show()
matplotlib
scatter
函数具有s
和c
参数,可让您绘制不同大小和颜色的点。当您指定
之类的东西kind='scatter'
时,PandasDataFrame.plot
方法调用 matplotlibscatter
函数。它还将额外的参数传递给对scatter
的调用,因此您可以使用df.plot(kind='scatter', x='lon', y='lat', s=df['Total']*50, c=df['Total'], cmap=cmap)
绘制你的点。
Annotating the points 可以通过调用
plt.annotate
. 来完成
The
gist_rainbow
colormap 从红色变为橙色再变为黄色……变为紫色。gist_rainbow_r
是反转的颜色图,它使red
对应于最大值。
例如,
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'Total': [20,15,13,1],
'lat': [40,0,-30,50],
'lon': [40,50,60,70], },
index=['Location {}'.format(i) for i in range(1,5)])
cmap = plt.get_cmap('gist_rainbow_r')
df.plot(kind='scatter', x='lon', y='lat', s=df['Total']*50, c=df['Total'], cmap=cmap)
for idx, row in df.iterrows():
x, y = row[['lon','lat']]
plt.annotate(
str(idx),
xy = (x, y), xytext = (-20, 20),
textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
plt.show()
产量
不要为每个点调用一次 df.plot
或 plt.scatter
。随着点数的增加,这将变得非常缓慢。相反,在 DataFrame 中收集必要的数据(经度和纬度),以便可以通过 one call 到 df.plot
:
longitudes, latitudes = [], []
for row_index, row in df.iterrows():
x, y = db.getLocation(row_index)
lat, lon = m(y, x)
longitudes.append(lon)
latitudes.append(lat)
plt.annotate(
str(row_index),
xy = (x, y), xytext = (-20, 20),
textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0.5),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
df['lon'] = longitudes
df['lat'] = latitudes
cmap = plt.get_cmap('gist_rainbow_r')
ax = plt.gca()
df.plot(kind='scatter', x='lon', y='lat', s=df['Total']*50, c=df['Total'],
cmap=cmap, ax=ax)