繁体   English   中英

在地图上叠加散点图(img)

[英]Overlay scatter plot on map (img)

我正在为自己的学习目的而使用住房数据集,我希望能够将地块覆盖在地图上,以使我对“热点”有更好的了解。

我的代码如下:

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()

我得到以下情节:

在此处输入图片说明

您正在使用数据框绘图功能创建一个新图形。 您应该传递要在其上绘制第二个绘图的轴。 一种方法是使用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具有最小和您的经度和纬度数据的最大值将正确地缩放图像。

好的,这个问题很旧,但是我有一个不同的答案,可能对某人很有趣...

我一直在处理完全相同的问题。 GitHub( https://github.com/ageron/handson-ml.git )上可用的代码可以满足您的需要(请参见02_end_to_end_machine_learning_project.ipynb)。

但是,该代码将加利福尼亚地图用作图像,并在其顶部绘制点。 一种替代方法是构建真实地图,并在上面绘制点,而无需读取ma图像。 为此,我使用了下面的代码。 您将需要安装cartopy ,如果还需要County线,则必须按照此处的说明进行绘制。

最后,生成的图像是这样的: 用Cartopy绘制的加利福尼亚房价

这是我使用的代码:

# 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")

这样做的好处是可以使用真实的地图,并且现在可以轻松地针对您要使用的世界任何地方更改此代码。 玩得开心!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM