您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python怎么实现香港地图、房价可视化和绘制气泡图
## 引言
在数据分析和可视化领域,地理空间数据的呈现一直是重要课题。香港作为国际金融中心,其房地产市场数据具有极高的分析价值。本文将详细介绍如何利用Python实现香港地图的可视化、房价数据的展示以及气泡图的绘制,帮助读者掌握地理数据可视化的核心技能。
## 一、准备工作
### 1.1 所需工具和库
实现地理可视化需要以下Python库:
- `geopandas`:处理地理空间数据
- `matplotlib`/`seaborn`:基础可视化
- `folium`/`plotly`:交互式地图
- `contextily`:添加底图
- `pandas`:数据处理
安装命令:
```bash
pip install geopandas matplotlib seaborn folium plotly contextily pandas
需要准备两类数据: 1. 香港行政区划GeoJSON文件(可从Hong Kong GeoData Store获取) 2. 香港房价数据集(示例数据可模拟生成)
import pandas as pd
import numpy as np
# 模拟生成2023年香港各区房价数据(单位:万港元/平方米)
districts = ['中西区', '湾仔区', '东区', '南区',
'油尖旺区', '深水埗区', '九龙城区', '黄大仙区',
'观塘区', '荃湾区', '屯门区', '元朗区',
'北区', '大埔区', '沙田区', '西贡区',
'离岛区']
housing_data = pd.DataFrame({
'District': districts,
'AvgPrice': np.random.uniform(15, 30, len(districts)),
'TransactionCount': np.random.randint(100, 500, len(districts))
})
import geopandas as gpd
# 加载香港行政区划数据
hk_map = gpd.read_file('path_to_hk_districts.geojson')
print(hk_map.head())
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(12, 10))
hk_map.plot(ax=ax, color='lightblue', edgecolor='black')
plt.title('香港行政区划图', fontsize=16)
plt.axis('off')
plt.show()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 确保区名一致
housing_data['District'] = housing_data['District'].str.replace('区', '')
hk_map['name_zh'] = hk_map['name_zh'].str.replace('區', '')
# 合并地理数据与房价数据
merged_data = hk_map.merge(housing_data, left_on='name_zh', right_on='District')
fig, ax = plt.subplots(figsize=(14, 12))
# 绘制分级设色地图
merged_data.plot(column='AvgPrice',
ax=ax,
legend=True,
scheme='quantiles',
cmap='OrRd',
edgecolor='black',
linewidth=0.5)
# 添加标注
for idx, row in merged_data.iterrows():
plt.annotate(text=f"{row['District']}\n{row['AvgPrice']:.1f}万",
xy=row['geometry'].centroid.coords[0],
ha='center',
fontsize=9)
plt.title('香港各区平均房价(万港元/平方米)', fontsize=18)
plt.axis('off')
plt.show()
import folium
# 计算地图中心点
center = [hk_map.geometry.centroid.y.mean(), hk_map.geometry.centroid.x.mean()]
# 创建基础地图
m = folium.Map(location=center, zoom_start=11, tiles='CartoDB positron')
# 添加分级设色图层
folium.Choropleth(
geo_data=hk_map,
name='choropleth',
data=housing_data,
columns=['District', 'AvgPrice'],
key_on='feature.properties.name_zh',
fill_color='YlOrRd',
fill_opacity=0.7,
line_opacity=0.2,
legend_name='平均房价(万港元/平方米)'
).add_to(m)
# 添加交互标签
style_function = lambda x: {'fillColor': '#ffffff',
'color':'#000000',
'fillOpacity': 0.1,
'weight': 0.1}
highlight_function = lambda x: {'fillColor': '#000000',
'color':'#000000',
'fillOpacity': 0.50,
'weight': 0.1}
for idx, row in merged_data.iterrows():
html = f"""
<b>地区</b>: {row['District']}<br/>
<b>平均房价</b>: {row['AvgPrice']:.1f}万/㎡<br/>
<b>交易量</b>: {row['TransactionCount']}宗
"""
popup = folium.Popup(html, max_width=300)
folium.GeoJson(
row['geometry'],
style_function=style_function,
highlight_function=highlight_function,
tooltip=row['District'],
).add_child(popup).add_to(m)
folium.LayerControl().add_to(m)
m.save('hk_housing.html')
fig, ax = plt.subplots(figsize=(14, 10))
# 绘制底图
hk_map.plot(ax=ax, color='lightgrey', edgecolor='black')
# 绘制气泡图
scatter = merged_data.plot(ax=ax,
marker='o',
color='red',
markersize=merged_data['TransactionCount']/10,
alpha=0.6)
# 添加标注
for idx, row in merged_data.iterrows():
ax.annotate(text=f"{row['District']}\n{row['AvgPrice']:.1f}万",
xy=(row['geometry'].centroid.x, row['geometry'].centroid.y),
xytext=(5, 5),
textcoords='offset points',
fontsize=9)
plt.title('香港各区房价气泡图(大小表示交易量)', fontsize=18)
plt.axis('off')
# 添加图例
for size in [100, 200, 300]:
plt.scatter([], [], c='red', alpha=0.6, s=size/10,
label=f'{size}宗交易')
plt.legend(scatterpoints=1, frameon=False, labelspacing=1.5)
plt.show()
import plotly.express as px
# 准备数据
plotly_data = merged_data.copy()
plotly_data['lon'] = plotly_data.geometry.centroid.x
plotly_data['lat'] = plotly_data.geometry.centroid.y
fig = px.scatter_mapbox(plotly_data,
lon="lon",
lat="lat",
size="TransactionCount",
color="AvgPrice",
color_continuous_scale=px.colors.sequential.OrRd,
size_max=30,
zoom=10,
hover_name="District",
hover_data={"AvgPrice": ":.1f", "TransactionCount": True},
mapbox_style="carto-positron")
fig.update_layout(
title='香港各区房价气泡图(2023年)',
width=1000,
height=800,
coloraxis_colorbar=dict(title="平均房价(万/㎡)")
)
fig.show()
import seaborn as sns
# 创建网格数据
grid = merged_data.copy()
grid['x'] = grid.geometry.centroid.x
grid['y'] = grid.geometry.centroid.y
fig, ax = plt.subplots(figsize=(14, 12))
hk_map.plot(ax=ax, color='lightgrey', edgecolor='black')
# 绘制热力图
sns.kdeplot(x=grid['x'],
y=grid['y'],
weights=grid['AvgPrice'],
cmap='Reds',
alpha=0.6,
levels=10,
thresh=0.3,
ax=ax)
# 添加气泡
scatter = ax.scatter(x=grid['x'],
y=grid['y'],
s=grid['TransactionCount']/5,
c=grid['AvgPrice'],
cmap='OrRd',
alpha=0.8,
edgecolors='black')
# 添加颜色条
plt.colorbar(scatter, label='平均房价(万/㎡)')
plt.title('香港房价热力图与交易量气泡图', fontsize=18)
plt.axis('off')
plt.show()
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(16, 14))
ax = fig.add_subplot(111, projection='3d')
# 创建3D柱状图
for idx, row in merged_data.iterrows():
poly = row['geometry']
if poly.geom_type == 'Polygon':
x, y = poly.exterior.xy
z = np.ones(len(x)) * row['AvgPrice']
ax.plot(x, y, z, color='black', linewidth=0.5)
ax.fill_between(x, y, z, color='red', alpha=0.3)
ax.set_title('香港3D房价地图', fontsize=20)
ax.set_zlabel('平均房价(万/㎡)')
ax.grid(False)
plt.axis('off')
plt.tight_layout()
plt.show()
通过上述可视化,我们可以得出以下观察: 1. 香港岛北部(中西区、湾仔区)房价明显高于新界地区 2. 交易量最大的区域集中在九龙城区和沙田区 3. 房价与交易量呈现一定的负相关关系 4. 离岛区虽然房价较低,但交易量也相对较少
本文完整介绍了: 1. 香港地理数据的加载和处理方法 2. 静态和交互式地图的创建技巧 3. 气泡图、热力图等多种可视化形式 4. 3D地理数据的展示方式
完整代码和数据可参考:[GitHub仓库链接]
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。