我正在使用住房数据集来完成我自己的学习目的,我希望能够在地图上叠加我的情节,让我更好地了解“热点”。
我的代码如下:
housing = pd.read_csv('https://raw.githubusercontent.com/ageron/handson-ml/master/datasets/housing/housing.csv')
plt.figure()
housing.plot(x='longitude', y='latitude', kind='scatter', alpha=0.4,
s= housing['population']/100, label='population', figsize=(10,7),
c= 'median_house_value', cmap=plt.get_cmap('jet'), colorbar=True, zorder=5)
plt.legend()
plt.show()
我保存为'California.png'
的图片这就是我的尝试:
img=imread('California.png')
plt.figure()
plt.imshow(img,zorder=0)
housing.plot(x='longitude', y='latitude', kind='scatter', alpha=0.4,
s= housing['population']/100, label='population', figsize=(10,7),
c= 'median_house_value', cmap=plt.get_cmap('jet'), colorbar=True, zorder=5)
plt.legend()
plt.show()
但这只给了我两个情节。我试过切换索引无济于事。
有一种简单的方法可以实现这一目标吗?感谢。
编辑:使用@nbeuchat下面的代码:
plt.figure(figsize=(10,7))
img=imread('California.png')
plt.imshow(img,zorder=0)
ax = plt.gca()
housing.plot(x='longitude', y='latitude', kind='scatter', alpha=0.4,
s= housing['population']/100, label='population', ax=ax,
c= 'median_house_value', cmap=plt.get_cmap('jet'), colorbar=True,
zorder=5)
plt.legend()
plt.show()
我得到以下情节:
答案 0 :(得分:1)
您正在使用数据框图功能创建新图形。您应该传递要绘制第二个图的轴。一种方法是使用gca
来获取当前轴。
以下内容应该有效(尽管未经过测试):
plt.figure(figsize=(10,7))
img=imread('California.png')
plt.imshow(img,zorder=0,extent=[housing['longitude'].min(),housing['longitude'].max(),housing['latitude'].min(),housing['latitude'].max()])
ax = plt.gca()
housing.plot(x='longitude', y='latitude', kind='scatter', alpha=0.4,
s= housing['population']/100, label='population', ax=ax,
c= 'median_house_value', cmap=plt.get_cmap('jet'), colorbar=True,
zorder=5)
plt.legend()
plt.show()
编辑:使用extent
imshow
参数,您的经度和纬度数据的最小值和最大值将正确缩放图像。
答案 1 :(得分:1)
好的,这个问题很旧,但是我有一个不同的答案,可能对某人很有趣...
我一直在处理完全相同的问题。 GitHub(https://github.com/ageron/handson-ml.git)上可用的代码可以满足您的需求(请参见02_end_to_end_machine_learning_project.ipynb)。
但是,该代码使用加利福尼亚地图作为图像,并在其顶部绘制点。一种替代方法是构建真实地图,并在上面绘制点,而无需读取ma图像。为此,我使用了下面的代码。您将需要install cartopy,并且如果您还想要县线,则必须使用here中的说明来绘制它们。
这是我使用的代码:
# Trying to use a real map
import cartopy.crs as ccrs
import cartopy.feature as cfeature
plt.figure(figsize=(10,7))
# Creates the map
ca_map = plt.axes(projection=ccrs.PlateCarree())
ca_map.add_feature(cfeature.LAND)
ca_map.add_feature(cfeature.OCEAN)
ca_map.add_feature(cfeature.COASTLINE)
ca_map.add_feature(cfeature.BORDERS, linestyle=':')
ca_map.add_feature(cfeature.LAKES, alpha=0.5)
ca_map.add_feature(cfeature.RIVERS)
ca_map.add_feature(cfeature.STATES.with_scale('10m'))
# To add county lines
import cartopy.io.shapereader as shpreader
reader = shpreader.Reader('datasets/housing/countyl010g.shp')
counties = list(reader.geometries())
COUNTIES = cfeature.ShapelyFeature(counties, ccrs.PlateCarree())
ca_map.add_feature(COUNTIES, facecolor='none', edgecolor='gray')
ca_map.xaxis.set_visible(True)
ca_map.yaxis.set_visible(True)
# Plots the data onto map
plt.scatter(housing['longitude'], housing['latitude'], alpha=0.4,
s=housing["population"]/100, label="population",
c=housing['median_house_value'],
cmap=plt.get_cmap("jet"),
transform=ccrs.PlateCarree())
# Colorbar
prices = housing["median_house_value"]
tick_values = np.linspace(prices.min(), prices.max(), 11)
cbar = plt.colorbar()
cbar.ax.set_yticklabels(["$%dk"%(round(v/1000)) for v in tick_values], fontsize=14)
cbar.set_label('Median House Value', fontsize=16)
# Plot labels
plt.ylabel("Latitude", fontsize=14)
plt.xlabel("Longitude", fontsize=14)
plt.legend()
save_fig("housing_prices_scatterplot_cartopy")
这里的优势是使用真实的地图,并且现在您可以轻松地将此代码更改为您要使用的世界的任何部分。玩得开心!