地理特征类可视化图像

一、蜂窝热力地图

蜂窝热力地图是一种将地图划分为六边形单元格,并根据每个单元格中的数据密度或数量来着色的地图,颜色深浅表示数据的浓度或强度。

1、特点

覆盖均匀清晰:使用六边形网格聚合数据点,相比其他形状,六边形能更均匀地覆盖地图,视觉上也更加清晰。
处理密集数据:适合处理密集型空间数据,可减少视觉杂乱,突出数据的分布密度。
避免边界干扰:能避免行政边界不规则的干扰,适合展示连续分布的数据。
支持多尺度分析:可通过调整网格大小,实现从宏观趋势到微观细节的多尺度分析。

2、应用场景

城市规划:展示城市或区域内不同区域的人口分布,帮助城市规划者合理分配资源,如学校、医院、商场等公共设施的布局。
交通管理:分析不同区域的交通流量密度,帮助决策者制定交通管理政策,如设置单行道、调整信号灯时长、规划公交专用道等。
环境监测:用于展示空气质量监测、污染浓度等环境数据,帮助环保部门及时发现环境问题,采取相应的治理措施。
公共安全:可展示犯罪频发区域,帮助执法部门合理调配警力资源,加强对高犯罪率地区的巡逻和管控。
商业布局:分析共享单车、出租车等的需求热点,优化车辆投放,提高资源利用效率;也可用于分析商业网点的分布和需求情况,为企业选址、布局提供参考。

3、用python实现

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

# 设置中文字体显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题

def generate_sample_data(n=1000):
    """生成示例数据"""
    # 生成两个正态分布的点集
    x1, y1 = np.random.multivariate_normal([0, 0], [[1, 0], [0, 1]], int(n/2)).T
    x2, y2 = np.random.multivariate_normal([3, 3], [[0.5, 0], [0, 0.5]], int(n/2)).T
    
    # 合并数据
    x = np.concatenate([x1, x2])
    y = np.concatenate([y1, y2])
    
    return x, y

def plot_honeycomb_heatmap(x, y, title="蜂窝热力地图示例", bins=None, gridsize=20):
    """绘制蜂窝热力地图"""
    fig, ax = plt.subplots(figsize=(10, 8))
    
    # 创建自定义颜色映射
    colors = [(0.122, 0.471, 0.706), (0.682, 0.780, 0.902), 
              (0.984, 0.984, 0.984), (0.992, 0.753, 0.604), 
              (0.835, 0.369, 0.392)]  # 蓝->白->红渐变
    cmap = LinearSegmentedColormap.from_list('custom_cmap', colors, N=256)
    
    # 绘制蜂窝热力图
    hexbin = ax.hexbin(x, y, gridsize=gridsize, cmap=cmap, bins=bins, mincnt=1, edgecolors='none')
    
    # 添加颜色条
    cbar = plt.colorbar(hexbin, ax=ax)
    cbar.set_label('数据密度')
    
    # 设置标题和坐标轴标签
    ax.set_title(title, fontsize=15)
    ax.set_xlabel('经度', fontsize=12)
    ax.set_ylabel('纬度', fontsize=12)
    
    # 添加网格
    ax.grid(True, linestyle='--', alpha=0.6)
    
    return fig, ax

def main():
    # 生成示例数据
    x, y = generate_sample_data(n=5000)
    
    # 绘制蜂窝热力图(两种方式)
    fig1, ax1 = plot_honeycomb_heatmap(x, y, "蜂窝热力地图 - 自动计算密度", gridsize=30)
    fig2, ax2 = plot_honeycomb_heatmap(x, y, "蜂窝热力地图 - 对数密度", bins='log', gridsize=30)
    
    # 显示图形
    plt.tight_layout()
    plt.show()

if __name__ == "__main__":
    main()    

实现结果
在这里插入图片描述
在这里插入图片描述
六边形网格:整个绘图区域被划分为大小均匀的六边形单元格
颜色映射:从蓝色(低密度)到红色(高密度)的渐变色
数据分布:可以看到两个明显的高密度区域(红色),对应代码中生成的两个正态分布点集
密度值:颜色条显示了密度的绝对值,颜色越深表示该区域数据点越多

二、变形地图

1、图表特点

变形地图是通过对地理区域的面积、形状进行变形,以可视化呈现非地理属性数据(如人口、GDP、选举结果等)的特殊地图。其核心特点包括:
属性主导变形:
区域面积或形状根据目标数据(如人口数量)按比例缩放,而非实际地理面积。例如:人口多的国家 / 地区面积被放大,人口少的则缩小,地理轮廓可能被扭曲。
突出数据分布:
弱化地理位置和边界,强化数据的空间分布差异,便于快速识别高值或低值区域。
类型多样:
面积变形地图:最常见,通过面积缩放反映数据(如全球人口分布)。
比例符号地图:用符号大小(如气泡)叠加在地理区域上,不改变区域形状。
流变形地图:展示数据流动(如移民、贸易)的方向和强度。
局限性:
地理准确性降低,可能误导对真实空间关系的认知。
需配合原始地图或注释说明,避免误读。

2、应用场景

社会经济数据可视化:
人口分布、GDP、贫困率、教育水平等(如各国人均 GDP 变形地图)。
政治与选举分析:
展示选票分布(如美国大选各州支持率变形地图)。
公共卫生与环境:
疾病发病率、碳排放、自然灾害影响范围(如新冠疫情全球感染率变形地图)。
市场与商业分析:
消费者分布、销售数据、门店覆盖密度(如某品牌全球门店数量变形地图)。

3、工具实现:用 Python 制作面积变形地图

实现此变形图需要访问 Natural Earth 下载页面
下载 “110m Cultural Vectors” 中的 “Admin 0 - Countries”

import geopandas as gpd
import matplotlib.pyplot as plt
import os

import matplotlib.pyplot as plt
plt.rc('font', family='SimHei', size=13)

# ----------------------------
# 步骤1:下载并准备数据
# ----------------------------
# 1. 访问Natural Earth下载页面:https://www.naturalearthdata.com/downloads/110m-cultural-vectors/
# 2. 下载"Admin 0 - Countries"数据集(ne_110m_admin_0_countries.zip)
# 3. 解压到本地目录,例如:E:/maps/

# 替换为你的实际文件路径
DATA_PATH = "E:\\桌面\\hhh\\ne_110m_admin_0_countries.shp"

# 检查文件是否存在
if not os.path.exists(DATA_PATH):
    raise FileNotFoundError(
        f"未找到Natural Earth数据文件,请确认路径是否正确:{DATA_PATH}\n"
        "请从 https://www.naturalearthdata.com/downloads/110m-cultural-vectors/ 下载并解压"
    )

# ----------------------------
# 步骤2:加载数据
# ----------------------------
try:
    world = gpd.read_file(DATA_PATH)
    print("数据加载成功!包含国家数量:", len(world))
except Exception as e:
    print("数据加载失败:", str(e))
    raise

# ----------------------------
# 步骤3:数据预处理
# ----------------------------
# 移除南极洲(通常在地图中不需要)
world = world[world["NAME"] != "Antarctica"]

# 检查是否有缺失的人口数据
if "POP_EST" not in world.columns:
    available_columns = ", ".join(world.columns)
    raise KeyError(
        f"数据中未找到'POP_EST'列,可用列包括: {available_columns}\n"
        "请确认下载的是正确的Natural Earth数据集版本"
    )

# 计算缩放后的人口数据(用于变形)
world["population_scaled"] = (world["POP_EST"] / world["POP_EST"].max()) * 100

# ----------------------------
# 步骤4:创建变形地图
# ----------------------------
plt.figure(figsize=(16, 10))
ax = plt.gca()

# 绘制地图(颜色深浅表示人口多少)
world.plot(
    column="population_scaled",  # 使用缩放后的人口数据
    ax=ax,
    legend=True,
    legend_kwds={
        "label": "人口相对比例 (%)",
        "orientation": "horizontal",
        "shrink": 0.5,
        "aspect": 40
    },
    cmap="YlOrRd",       # 使用黄色到红色的渐变色
    edgecolor="black",   # 国家边界颜色
    linewidth=0.3        # 边界线宽
)

# 添加地图标题和说明
plt.title("世界人口分布变形地图", fontsize=16, pad=20)
plt.figtext(
    0.5, 0.05,
    "注:地图区域大小根据各国人口比例进行了变形调整",
    ha="center",
    fontsize=10,
    color="gray"
)

# 移除坐标轴
ax.set_axis_off()

# 调整布局
plt.tight_layout()

# ----------------------------
# 步骤5:保存或显示结果
# ----------------------------
output_path = "world_population_cartogram.png"
plt.savefig(output_path, dpi=300, bbox_inches="tight")
print(f"地图已保存至: {output_path}")

plt.show()

实现结果:
在这里插入图片描述
通过颜色深浅反映各国人口相对比例。

三、关联地图

1、特点

​​精准空间定位​​:直观标注地理要素(国家/城市/山川等),如火山分布图可清晰显示板块交界处的活跃带。
​​多维数据融合​​:通过颜色(人口密度)、线条(交通流量)、符号(经济指标)等叠加多元数据,实现一图多维度分析。
​​快速区域对比​​:利用视觉差异(如色阶、气泡大小)直接比较不同区域数据,例如人均GDP色块图可秒辨富裕与贫困国家分布。
​​视觉吸引力强化​​:3D地形、动态交互等设计(如旅游景点3D地图)显著提升用户关注度,激发数据探索兴趣。

2、应用场景

土地利用规划:通过可视化图像关联地图,清晰呈现城市土地当前的使用状况,如住宅、商业、工业、绿地等不同用途的分布,辅助规划人员分析土地利用的合理性及空间布局情况,为科学规划土地提供依据 。
交通规划与管理:可用于展示城市交通网络,涵盖道路、地铁、公交等线路布局以及交通流量信息,助力交通部门优化交通规划,缓解拥堵 。
市场区域划分:企业依据消费者的地理位置、购买行为、人口统计学特征等因素,利用可视化图像关联地图划分市场区域,精准定位目标客户群体,制定营销策略 。
生态环境评估:用于展示生态系统分布,如森林、湿地、草原等,以及环境指标,像空气质量、水质、土壤污染等在空间上的变化,为生态环境评估和保护提供支持 。
自然资源管理:清晰展示自然资源,如矿产资源、水资源、能源资源等的地理分布和储量情况,便于合理开发和管理自然资源 。
应急响应与救援:灾害发生时,作为应急指挥平台,实时展示灾害影响范围、受灾群众分布、救援力量和物资的位置等关键信息,为救援决策提供及时准确的依据 。

3、使用Basemap绘制基础关联地图

import pydeck as pdk
import pandas as pd

# 创建示例数据
data = pd.DataFrame({
    'start_lon': [-74.0060, -0.1278, 139.6917],
    'start_lat': [40.7128, 51.5074, 35.6895],
    'end_lon': [-0.1278, 116.4074, -74.0060],
    'end_lat': [51.5074, 39.9042, 40.7128],
    'value': [100, 80, 60]
})

# 创建弧线层
arc_layer = pdk.Layer(
    "ArcLayer",
    data=data,
    get_source_position=["start_lon", "start_lat"],
    get_target_position=["end_lon", "end_lat"],
    get_source_color=[255, 0, 0, 160],
    get_target_color=[0, 255, 0, 160],
    get_width="value / 10",
    pickable=True,
    auto_highlight=True
)

# 设置视图
view_state = pdk.ViewState(
    latitude=30,
    longitude=0,
    zoom=1,
    pitch=50
)

# 创建地图
r = pdk.Deck(
    layers=[arc_layer],
    initial_view_state=view_state,
    tooltip={
        "html": "<b>From:</b> [{start_lon}, {start_lat}]<br/><b>To:</b> [{end_lon}, {end_lat}]",
        "style": {
            "backgroundColor": "steelblue",
            "color": "white"
        }
    }
)

r.to_html("arc_map.html")

在这里插入图片描述
​​3D地球​​:倾斜视角(pitch=50)的全球地图
​​彩色弧线​​:连接起点(红色)和终点(绿色)的3D曲线
弧线宽度:与value值成正比(value/10)
颜色渐变:从红色(起点)过渡到绿色(终点)

四、气泡地图

1、特点

将地理位置与多维数据相结合,用气泡表示地理位置点,气泡大小表示某数据值,颜色可表示另一数据维度,能有效展示地点数据分布与关联,突出差异、趋势和热点,但在数据密集区气泡可能重叠,且需谨慎选择气泡大小和颜色编码以准确传达数据含义。

2、应用场景

适用于需要融合展示地理位置和多维数据的情况,如展示不同城市的人口数量和经济发展水平,分析区域发展差异;展示不同地区的资源储量和开采量,为资源开发提供决策依据等。

3、使用python中的Plotly Express实现

import plotly.express as px
import pandas as pd
import numpy as np

# 设置随机种子保证可复现性
np.random.seed(42)

# 创建包含50个城市的高密度数据集
cities = [
    'New York', 'London', 'Tokyo', 'Beijing', 'Paris', 'Sydney',
    'Los Angeles', 'Chicago', 'Singapore', 'Dubai', 'Mumbai',
    'Shanghai', 'Moscow', 'Berlin', 'Toronto', 'Seoul', 'Bangkok',
    'Hong Kong', 'São Paulo', 'Mexico City', 'Cairo', 'Jakarta',
    'Istanbul', 'Lagos', 'Buenos Aires', 'Kolkata', 'Manila',
    'Rio de Janeiro', 'Osaka', 'Karachi', 'Delhi', 'Melbourne',
    'Johannesburg', 'Bangalore', 'Chennai', 'Hyderabad', 'Kuala Lumpur',
    'Miami', 'San Francisco', 'Seattle', 'Houston', 'Boston', 'Atlanta',
    'Washington', 'Dallas', 'Philadelphia', 'Phoenix', 'Detroit', 'Montreal',
    'Vancouver'
]

data = pd.DataFrame({
    'city': cities,
    'lat': np.concatenate([
        np.random.normal(40, 5, 10),    # 北美洲
        np.random.normal(50, 5, 10),    # 欧洲
        np.random.normal(20, 5, 10),    # 亚洲南部
        np.random.normal(35, 5, 10),    # 亚洲东部
        np.random.normal(-30, 5, 10)    # 南半球
    ]),
    'lon': np.concatenate([
        np.random.normal(-100, 20, 10),  # 美洲
        np.random.normal(10, 15, 10),    # 欧洲/非洲
        np.random.normal(80, 15, 10),     # 亚洲
        np.random.normal(120, 15, 10),   # 东亚/澳洲
        np.random.normal(150, 30, 10)    # 太平洋区域
    ]),
    'population': np.random.randint(1000000, 25000000, 50),
    'gdp': np.round(np.random.uniform(0.2, 5.0, 50), 1)
})

# 对人口数据取对数(避免极端值影响气泡大小)
data['pop_log'] = np.log10(data['population'])

# 创建高密度气泡地图
fig = px.scatter_geo(
    data,
    lat='lat',
    lon='lon',
    size='pop_log',  # 使用对数缩放后的人口数据
    color='gdp',
    hover_name='city',
    hover_data={
        'population': ':,.0f',  # 格式化显示
        'gdp': '$.1f',
        'lat': False,  # 隐藏原始纬度
        'lon': False,  # 隐藏原始经度
        'pop_log': False  # 隐藏对数数据
    },
    projection='natural earth',
    size_max=20,  # 减小最大尺寸使气泡更密集
    title='全球50个主要城市人口与GDP分布(密集气泡地图)',
    width=1200,    # 增加画布宽度
    height=700,    # 增加画布高度
    color_continuous_scale=px.colors.sequential.Plasma,  # 使用更好的色标
    opacity=0.8    # 设置透明度
)

# 高级布局调整
fig.update_layout(
    geo=dict(
        landcolor='rgb(240, 240, 240)',  # 浅灰色陆地
        oceancolor='rgb(212, 230, 242)', # 浅蓝色海洋
        showcountries=True,
        countrycolor='rgb(200, 200, 200)',
        coastlinecolor='rgb(150, 150, 150)',
        projection_scale=1.15,  # 放大显示比例
        center=dict(lat=20, lon=0)  # 调整地图中心点
    ),
    margin={"r": 20, "t": 60, "l": 20, "b": 20},
    coloraxis_colorbar=dict(
        title="GDP (万亿美元)",
        thickness=20,
        len=0.75,
        yanchor="middle",
        y=0.5
    )
)

# 优化悬停信息显示
fig.update_traces(
    hovertemplate="<b>%{hovertext}</b><br>"
                 "<b>人口</b>: %{customdata[0]:,}<br>"
                 "<b>GDP</b>: %{customdata[1]}万亿<br>"
                 "<b>坐标</b>: (%{lat:.2f}°, %{lon:.2f}°)"
)

# 显示图形
fig.show()

# 保存为HTML文件
fig.write_html("dense_bubble_map.html")

实现结果:
在这里插入图片描述
模拟50个全球城市数据,按地理区域分组生成
对人口数据使用对数缩放,避免极端值影响可视化效果

五、流线地图

1、特点

用带箭头的流线表示地理要素的流动方向和强度(如人口迁移、货物运输、洋流),流线的宽度或颜色代表流量大小。
动态感强,适合展示 “从 A 到 B” 的空间流动关系,但复杂流线可能导致视觉混乱。

2、应用场景

交通物流:展示港口货物运输路线及吞吐量。
人口迁移:呈现不同城市间的人口流动趋势(如春运迁徙路线)。
自然地理:模拟洋流、风向等自然现象的运动方向。

3、使用geopandas库实现

import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import LineString
import os

# 1. 初始化设置
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

# 2. 数据加载与处理
DATA_URL = "https://naciscdn.org/naturalearth/110m/cultural/ne_110m_admin_0_countries.zip"

try:
    world = gpd.read_file(DATA_URL)
    print("数据成功从网络加载!")

    # 检测国家名称列
    name_col = 'NAME' if 'NAME' in world.columns else 'name'
    print(f"使用列名 '{name_col}' 作为国家名称字段")

    # 转换到投影坐标系
    world = world.to_crs("EPSG:3857")
    world = world[world[name_col] != "Antarctica"]
    print(f"处理后数据包含 {len(world)} 个国家/地区")

except Exception as e:
    print(f"数据加载失败: {str(e)}")
    exit()

# 3. 创建流线数据
flow_data = [
    {"from": "United States", "to": "China", "value": 100},
    {"from": "Germany", "to": "India", "value": 80},
    {"from": "Brazil", "to": "Japan", "value": 60},
    {"from": "Australia", "to": "South Africa", "value": 40}
]

lines = []
for flow in flow_data:
    try:
        from_country = world[world[name_col].str.contains(flow["from"], case=False)]
        to_country = world[world[name_col].str.contains(flow["to"], case=False)]

        if len(from_country) == 0 or len(to_country) == 0:
            print(f"警告:未找到精确匹配 '{flow['from']}' 或 '{flow['to']}'")
            continue

        orig = from_country.geometry.centroid.values[0]
        dest = to_country.geometry.centroid.values[0]

        lines.append({
            "geometry": LineString([orig, dest]),
            "from_country": from_country[name_col].values[0],
            "to_country": to_country[name_col].values[0],
            "value": flow["value"]
        })
        print(f"成功创建流线: {from_country[name_col].values[0]}{to_country[name_col].values[0]}")

    except Exception as e:
        print(f"创建流线失败: {str(e)}")

if not lines:
    raise ValueError("未生成任何有效流线")

flow_gdf = gpd.GeoDataFrame(lines, crs=world.crs)

# 4. 可视化(调整图例大小)
plt.figure(figsize=(16, 10))
ax = plt.gca()

# 绘制底图
world.plot(ax=ax, color="lightgray", edgecolor="white", linewidth=0.5)

# 绘制流线(关键修改部分)
flow_gdf.plot(
    ax=ax,
    column="value",
    cmap="plasma",
    linewidth=flow_gdf["value"] / 10,
    legend=True,
    legend_kwds={
        'label': "流量强度",
        'orientation': "horizontal",
        'shrink': 0.3,  # 缩小图例宽度
        'aspect': 20,  # 增加长宽比
        'pad': 0.02,  # 减少内边距
        'anchor': (0.5, -0.1)  # 下移图例位置
    }
)

# 添加箭头
for _, row in flow_gdf.iterrows():
    start = row.geometry.coords[0]
    end = row.geometry.coords[1]
    ax.annotate(
        '',
        xy=end,
        xytext=start,
        arrowprops=dict(
            arrowstyle="->",
            color="red",
            lw=1,
            connectionstyle="arc3,rad=0.2"
        )
    )

    # 添加标签
    ax.text(
        row.geometry.centroid.x,
        row.geometry.centroid.y,
        f"{row['from_country']}{row['to_country']}",
        fontsize=8,
        ha='center',
        va='center',
        bbox=dict(facecolor='white', alpha=0.7, edgecolor='none')
    )

# 调整标题和布局
plt.title("全球国家间流量关系(流线地图)", fontsize=16, pad=25)
plt.tight_layout()

# 保存和显示
output_path = "flow_map_small_legend.png"
plt.savefig(output_path, dpi=300, bbox_inches="tight", facecolor="white")
print(f"地图已保存至: {output_path}")
plt.show()

实现结果
在这里插入图片描述
浅灰色背景的世界地图轮廓
四条彩色流线(美国-中国、德国-印度、巴西-日本、澳大利亚-南非)
每条流线包含:
渐变色表示流量强度
红色箭头指示流向
文字标注国家简称(如"美国→中国")
六、总结

以下是关于蜂窝热力地图、变形地图、关联地图、气泡地图和流线地图的地理特征类可视化图像总结表格:

图表类型特点应用场景优点缺点
蜂窝热力地图用蜂窝状网格单元表示数据密度,颜色深浅反映数值大小,呈现空间分布的集中趋势。城市人口密度分析、商业热点区域监测、交通流量分布展示等。直观展示空间聚集特征,数据密度对比明显,适合大尺度区域分析。网格划分可能掩盖局部细节,颜色过度依赖易导致视觉疲劳,对数据精度要求较高。
变形地图通过缩放区域面积突出特定数据指标,形状变形与数值成比例,弱化地理真实轮廓。人口分布、经济产值(如GDP)区域对比、选举结果票数可视化等。数据对比强烈,快速聚焦关键区域,适合强调数值差异的场景。地理形状失真可能影响空间认知,需结合常规地图辅助理解,不适用于高精度地理分析。
关联地图用线段或箭头连接不同地理实体,展示要素间的关联关系(如流动、贸易、迁徙等)。国际贸易路线、人口迁移路径、物流运输网络、互联网数据流动等。清晰呈现要素间的动态联系,直观展示方向和强度,适合分析空间交互关系。复杂网络易导致视觉混乱,需简化连线或分层展示,对数据关联性的梳理要求较高。
气泡地图在地理点位上用气泡大小表示数值,颜色区分类别,叠加于地图背景展示多维数据。城市经济指标(如企业规模、零售额)、环境数据(如污染物浓度)、人口统计等。兼顾空间定位与数据量化,支持多维度展示(大小+颜色),适合点状数据的分布与对比。气泡重叠可能遮挡信息,需交互缩放或动态展示,大范围内气泡分布易显得杂乱。
流线地图用带箭头的流线表示地理要素的流动方向和强度,线条粗细/透明度反映流量大小。洋流运动、航空航线、城市通勤路线、资金流动轨迹等动态数据可视化。动态感强,直观展示流动趋势与路径,支持多源数据叠加(如时间维度),增强空间动态理解。大量流线易导致画面拥堵,需优化线条透明度或分层处理,数据实时性要求较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值