Python怎么实现香港地图、房价可视化和绘制气泡图

发布时间:2021-11-25 09:23:44 作者:iii
来源:亿速云 阅读:415
# Python怎么实现香港地图、房价可视化和绘制气泡图

## 引言

在数据分析和可视化领域,地理空间数据的呈现一直是重要课题。香港作为国际金融中心,其房地产市场数据具有极高的分析价值。本文将详细介绍如何利用Python实现香港地图的可视化、房价数据的展示以及气泡图的绘制,帮助读者掌握地理数据可视化的核心技能。

## 一、准备工作

### 1.1 所需工具和库

实现地理可视化需要以下Python库:
- `geopandas`:处理地理空间数据
- `matplotlib`/`seaborn`:基础可视化
- `folium`/`plotly`:交互式地图
- `contextily`:添加底图
- `pandas`:数据处理

安装命令:
```bash
pip install geopandas matplotlib seaborn folium plotly contextily pandas

1.2 数据获取

需要准备两类数据: 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))
})

二、香港地图基础绘制

2.1 加载地理数据

import geopandas as gpd

# 加载香港行政区划数据
hk_map = gpd.read_file('path_to_hk_districts.geojson')
print(hk_map.head())

2.2 基础地图绘制

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

2.3 中文显示处理

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

三、房价数据可视化

3.1 数据合并

# 确保区名一致
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')

3.2 分级设色地图(Choropleth)

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

3.3 交互式地图(Folium实现)

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

四、气泡图绘制

4.1 基础气泡图

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

4.2 进阶气泡图(Plotly实现)

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

五、综合可视化案例

5.1 房价与交易量热力图

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

5.2 3D房价地图

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仓库链接]

参考资料

  1. GeoPandas官方文档
  2. 香港政府地理数据门户
  3. Matplotlib可视化指南
  4. Folium交互式地图教程

”`

推荐阅读:
  1. Python如何绘制个人足迹地图
  2. python如何绘制直方图和密度图

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:python怎么实现购物车

下一篇:如何进行.Net FrameWork SDK数据分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》