如何使用 Python 在底图中添加图例
How to add legend in Basemap with Python
我想在我的世界地图上添加一个图例。每个点都是来自不同推文的不同类型的设备。
这是我的代码:
import geocoder
import json
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
def openJSON(file, path):
with open(path + file + '.json', 'r') as fp:
data = json.load(fp)
return data
def App_users(data):
android_users = []
iphone_users = []
other_users = []
#3 types of users: Android, Iphone and others:
for a, b, c, d in data:
if "Twitter for Android" in d:
android_users.append([a, b])
elif "Twitter for iPhone" in d:
iphone_users.append([a, b])
else:
other_users.append([a, b])
data = (android_users, iphone_users, other_users)
return data
if __name__ == '__main__':
posXY_add = []
for d in data[0:50]:
if d["user"]["location"] != None:
g = geocoder.google(d["user"]["location"])
if g.latlng != None:
a = g.latlng + [g.address] + [str(d["source"])]
posXY_add.append(a)
data = App_users(posXY_add)
map = Basemap(llcrnrlat=-70, urcrnrlat=70,
llcrnrlon=-180, urcrnrlon=180, epsg=3395)
map.arcgisimage(service='ESRI_Imagery_World_2D', xpixels = 1500, verbose= True)
colors = ['r', 'g', 'b']
increment = 0
for app in data:
for item in app:
if len(item) == 2:
lat, lon = item[0], item[1]
x, y = map(lon, lat)
map.plot(x, y, colors[increment] + 'o')
increment += 1
plt.title("Geo-position Twitter Devices")
plt.show()
您对改进我的地图有什么建议吗?不同的颜色,不同的地图还是其他?
我正在使用 Pycharm 的 Python 2.7。我的示例数据是:
([[21.8974003, 83.39496319999999], [40.2671941, -86.1349019], [10.4805937, -66.90360629999999]], [[50.719164, -1.880769], [37.0903748, -94.5134078], [44.9862701, -93.39398279999999], [47.6062095, -122.3320708], [-27.4697707, 153.0251235], [20.593684, 78.96288]], [[43.2648545, -79.9492978], [39.1767262, -94.4867155], [33.7489954, -84.3879824], [39.7392358, -104.990251], [38.8761634, -77.0337777], [41.0082376, 28.9783589], [36.0753128, -95.95646269999999], [36.0595387, -95.90582429999999], [29.7604267, -95.3698028], [21.3014947, 106.6291304], [21.3014947, 106.6291304], [-16.6868982, -49.2648114], [10.4805937, -66.90360629999999], [45.037149, -92.825929], [33.760818, -78.967556], [45.49340369999999, -73.82329179999999], [39.750545, 37.0150217]])
图例部分: 这与将图例放入情节中的方式相同 - 只需调用 plt.legend()
和 m.plot()
具有 label
争论。所以,在你的情况下它将是:
handle_dict = {
"Andriod" : 0,
"iPhone" : 0,
"Other" : 0
}
colors = ['r', 'g', 'b']
increment = 0
for app in data:
for item in app:
if len(item) == 2:
lat, lon = item[0], item[1]
x, y = map(lon, lat)
map.plot(x, y, colors[increment] + 'o', label =
handle_dict[type_phone] if handle_dict[type_phone] == 0
else "_no-legend_")
handle_dict[type_phone] += 1
increment += 1
plt.legend()
plt.title("Geo-position Twitter Devices")
plt.show()
您还必须修改代码以识别正在绘制的 phone 的类型(因此变量 type_phone
)。
这里是link到documentation关于修改图例的图例。
改进地图:
就个人而言,我喜欢使用 map.shadedrelief()
来表示这些世界观 - 它不像 map.bluemarble()
那样黑暗,而且您可以轻松地更好地看到要点。这里真的不需要 map.arcgisimage()
参数,因为你有一个世界观而不是一个放大的视图——如果你使用内置函数,它会更快地生成你的地图。我还将 markeredgewidth
参数添加到 map.plot()
以使标记边缘宽度不为零,因为现在您的点看起来像是与背景融为一体。它会让你的圆点更突出。
哦 - 如果可以的话,也抽出时间升级到 Python3。
我刚刚用一个技巧解决了这个问题。在 "a" 上对我的代码进行迭代;通过这种方式,我只绘制了该类别的第一个标签。在代码中:
handles = [("Android",None), ("iPhone",None), ("Other devices",None)]
colors = ['r', 'g','b']
increment = 0
for app in data:
a = 0
for item in app:
if len(item) == 2:
lat, lon = item[0], item[1]
x, y = map(lon, lat)
map.plot(x, y, colors[increment] + 'o', alpha=0.8, markersize=0.1, label=handles[increment][a])
a = 1
increment += 1
plt.legend(loc='lower left', shadow=True)
我想在我的世界地图上添加一个图例。每个点都是来自不同推文的不同类型的设备。
这是我的代码:
import geocoder
import json
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
def openJSON(file, path):
with open(path + file + '.json', 'r') as fp:
data = json.load(fp)
return data
def App_users(data):
android_users = []
iphone_users = []
other_users = []
#3 types of users: Android, Iphone and others:
for a, b, c, d in data:
if "Twitter for Android" in d:
android_users.append([a, b])
elif "Twitter for iPhone" in d:
iphone_users.append([a, b])
else:
other_users.append([a, b])
data = (android_users, iphone_users, other_users)
return data
if __name__ == '__main__':
posXY_add = []
for d in data[0:50]:
if d["user"]["location"] != None:
g = geocoder.google(d["user"]["location"])
if g.latlng != None:
a = g.latlng + [g.address] + [str(d["source"])]
posXY_add.append(a)
data = App_users(posXY_add)
map = Basemap(llcrnrlat=-70, urcrnrlat=70,
llcrnrlon=-180, urcrnrlon=180, epsg=3395)
map.arcgisimage(service='ESRI_Imagery_World_2D', xpixels = 1500, verbose= True)
colors = ['r', 'g', 'b']
increment = 0
for app in data:
for item in app:
if len(item) == 2:
lat, lon = item[0], item[1]
x, y = map(lon, lat)
map.plot(x, y, colors[increment] + 'o')
increment += 1
plt.title("Geo-position Twitter Devices")
plt.show()
您对改进我的地图有什么建议吗?不同的颜色,不同的地图还是其他? 我正在使用 Pycharm 的 Python 2.7。我的示例数据是:
([[21.8974003, 83.39496319999999], [40.2671941, -86.1349019], [10.4805937, -66.90360629999999]], [[50.719164, -1.880769], [37.0903748, -94.5134078], [44.9862701, -93.39398279999999], [47.6062095, -122.3320708], [-27.4697707, 153.0251235], [20.593684, 78.96288]], [[43.2648545, -79.9492978], [39.1767262, -94.4867155], [33.7489954, -84.3879824], [39.7392358, -104.990251], [38.8761634, -77.0337777], [41.0082376, 28.9783589], [36.0753128, -95.95646269999999], [36.0595387, -95.90582429999999], [29.7604267, -95.3698028], [21.3014947, 106.6291304], [21.3014947, 106.6291304], [-16.6868982, -49.2648114], [10.4805937, -66.90360629999999], [45.037149, -92.825929], [33.760818, -78.967556], [45.49340369999999, -73.82329179999999], [39.750545, 37.0150217]])
图例部分: 这与将图例放入情节中的方式相同 - 只需调用 plt.legend()
和 m.plot()
具有 label
争论。所以,在你的情况下它将是:
handle_dict = {
"Andriod" : 0,
"iPhone" : 0,
"Other" : 0
}
colors = ['r', 'g', 'b']
increment = 0
for app in data:
for item in app:
if len(item) == 2:
lat, lon = item[0], item[1]
x, y = map(lon, lat)
map.plot(x, y, colors[increment] + 'o', label =
handle_dict[type_phone] if handle_dict[type_phone] == 0
else "_no-legend_")
handle_dict[type_phone] += 1
increment += 1
plt.legend()
plt.title("Geo-position Twitter Devices")
plt.show()
您还必须修改代码以识别正在绘制的 phone 的类型(因此变量 type_phone
)。
这里是link到documentation关于修改图例的图例。
改进地图:
就个人而言,我喜欢使用 map.shadedrelief()
来表示这些世界观 - 它不像 map.bluemarble()
那样黑暗,而且您可以轻松地更好地看到要点。这里真的不需要 map.arcgisimage()
参数,因为你有一个世界观而不是一个放大的视图——如果你使用内置函数,它会更快地生成你的地图。我还将 markeredgewidth
参数添加到 map.plot()
以使标记边缘宽度不为零,因为现在您的点看起来像是与背景融为一体。它会让你的圆点更突出。
哦 - 如果可以的话,也抽出时间升级到 Python3。
我刚刚用一个技巧解决了这个问题。在 "a" 上对我的代码进行迭代;通过这种方式,我只绘制了该类别的第一个标签。在代码中:
handles = [("Android",None), ("iPhone",None), ("Other devices",None)]
colors = ['r', 'g','b']
increment = 0
for app in data:
a = 0
for item in app:
if len(item) == 2:
lat, lon = item[0], item[1]
x, y = map(lon, lat)
map.plot(x, y, colors[increment] + 'o', alpha=0.8, markersize=0.1, label=handles[increment][a])
a = 1
increment += 1
plt.legend(loc='lower left', shadow=True)