0

0

Matplotlib 地图多图例定制:整合色块与符号标记

心靈之曲

心靈之曲

发布时间:2025-11-02 12:00:30

|

710人浏览过

|

来源于php中文网

原创

matplotlib 地图多图例定制:整合色块与符号标记

本文详细介绍了在 Matplotlib 中如何为地图生成包含多种元素的图例,特别是如何将代表区域的色块图例与代表特定点的自定义符号标记图例有效地整合到同一个图例框中。通过使用 `matplotlib.lines.Line2D` 代替传统的 `matplotlib.patches.Patch`,可以确保图例中的标记准确无误地呈现为用户指定的符号,从而提升图例的清晰度和信息表达能力。

数据可视化中,尤其是在地图应用中,我们经常需要在一个图例中展示多种类型的信息。例如,地图上的区域可能通过颜色来表示不同的类别(如犯罪率等级),而特定的地理点(如资产位置)则可能通过自定义的符号标记来突出显示。将这两种不同类型的视觉元素(色块和符号)清晰地呈现在同一个图例中,是提升地图可读性的关键。

问题分析与原始实现

最初的实现尝试将表示区域风险等级的色块图例与表示资产位置的符号标记图例合并。对于区域风险等级,使用 matplotlib.patches.Patch 来创建颜色方块作为图例项是标准且有效的方法。然而,当尝试为资产位置创建一个带有自定义标记(例如 'x')的图例时,如果仍然使用 Patch,则会出现问题。

考虑以下原始代码片段:

import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import matplotlib.lines as mlines # 导入但未用于原始图例

# 假设 color_list 已定义,用于生成区域色块图例
patches = []
for category, color in color_list.items():
    patch = Patch(color=color, label=category)
    patches.append(patch)

# 假设 sao 和 asset 是 GeoDataFrame,ax 是 Matplotlib 轴对象
# sao.plot(...) # 绘制区域
# asset.plot(color='black', markersize = 110, marker= "$x$", ax=ax, label = "assets")

# 原始的图例创建方式,问题在于资产图例项
plt.legend(handles=patches + [Patch(color='black', label="assets")], loc='lower right', title = 'Crime Rate Level for Districts')
plt.show()

这段代码的问题在于,Patch(color='black', label="assets") 会在图例中生成一个黑色的方块,而不是一个黑色的 'x' 标记。这与地图上实际绘制的资产标记 '$x$' 不符,导致图例信息不准确,降低了图例的有效性。

解决方案:利用 matplotlib.lines.Line2D

为了在图例中准确地表示自定义符号标记,我们需要使用 matplotlib.lines.Line2D 对象。Line2D 不仅可以用于表示线条,还可以通过设置 linestyle='' 和 marker 参数来专门表示没有线条的标记。

富兰氏手机商城系统源码 2011
富兰氏手机商城系统源码 2011

全国首个为手机行业定制的网站,外观豪华、时尚。DIV+CSS构建,符合W3C标准,完美搜索引擎优化迅速提高搜索引擎排名,稳定性、执行效率、负载能力均居国内同类产品领先地位。安装简单,傻瓜式操作,在线下单、支付、发货,轻松管理网站。 多套模板更换,界面更加豪华 完美搜索引擎优化 集成支付宝、财付通、网银等多种在线支付平台 手机、配件商品不同颜色、型号不同价格设置 图片化多种参数设置、搜索、评论 新闻

下载

通过 Line2D,我们可以精确控制图例中标记的样式,包括其形状、颜色和大小。

from matplotlib.lines import Line2D

# ... (假设 patches 已经按照上述方式创建) ...

# 为资产点创建 Line2D 图例项
asset_legend_handle = Line2D(
    [], [],               # 空列表表示没有实际数据点,仅用于图例
    marker='x',           # 指定标记样式为 'x'
    linestyle='',         # 不显示线条
    color='black',        # 标记颜色
    markersize=10,        # 标记大小,可根据图中实际标记大小调整
    label="Assets"        # 图例标签
)

# 整合所有图例项:色块图例和 Line2D 标记图例
plt.legend(
    handles=patches + [asset_legend_handle],
    loc='lower right',
    title='Risk Areas - São Paulo, Brazil'
)

通过这种方式,图例中“Assets”对应的条目将正确显示为一个黑色的 'x' 标记,与地图上的实际标记保持一致。

完整示例代码

为了更清晰地展示这一解决方案,下面是一个包含模拟数据和完整绘图逻辑的示例:

import matplotlib.pyplot as plt
from matplotlib.patches import Patch
from matplotlib.lines import Line2D
import pandas as pd
import geopandas as gpd
from shapely.geometry import Polygon, Point

# --- 模拟数据 ---
# 模拟犯罪率区域及颜色
color_list = {
    'Low Risk': 'green',
    'Medium Risk': 'orange',
    'High Risk': 'red'
}

# 模拟区域几何数据 (简化为矩形)
data = {
    'district': ['A', 'B', 'C'],
    'geometry': [
        Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]),
        Polygon([(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)]),
        Polygon([(2, 2), (2, 3), (3, 3), (3, 2), (2, 2)])
    ],
    'Colors': ['green', 'orange', 'red'] # 对应color_list
}
sao = gpd.GeoDataFrame(data, geometry='geometry')

# 模拟资产点
asset_data = {'geometry': [Point(0.5, 0.5), Point(1.5, 1.5)]}
asset = gpd.GeoDataFrame(asset_data, geometry='geometry')

# --- 绘图部分 ---
fig, ax = plt.subplots(figsize=(10, 8))

# 绘制区域
sao.plot(color=sao["Colors"], ax=ax, edgecolor='black', linewidth=0.5)

# 绘制资产点
asset.plot(color='black', markersize=200, marker="$x$", ax=ax, label="assets")

# 创建区域风险等级的图例项 (Patch)
patches = []
for category, color in color_list.items():
    patch = Patch(color=color, label=category)
    patches.append(patch)

# --- 解决方案:使用 Line2D 创建资产点的图例项 ---
asset_legend_handle = Line2D(
    [], [],
    marker='x',         # 使用 'x' 标记
    linestyle='',       # 不显示线条
    color='black',      # 标记颜色
    markersize=10,      # 标记大小 (可以调整以匹配图中实际大小)
    label="Assets"      # 图例标签
)

# 整合所有图例项
plt.legend(
    handles=patches + [asset_legend_handle],
    loc='lower right',
    title='Risk Areas - São Paulo, Brazil'
)

# 设置标题和移除坐标轴
ax.set_title('Risk Areas - São Paulo, Brazil', fontweight='bold')
ax.axis('off')

plt.show()

Line2D 关键参数解析

在创建 Line2D 对象作为图例项时,以下参数至关重要:

  • []:前两个空列表表示该 Line2D 对象不关联实际的 x 和 y 数据点。它仅作为图例的视觉占位符。
  • marker:指定要显示的标记样式,例如 'o' (圆圈), 's' (方块), '^' (三角形), '$x$' (文本 'x') 等。
  • linestyle:控制线条样式。设置为 '' 或 'None' 表示不绘制线条,只显示标记。
  • color:标记的颜色。
  • markersize:标记在图例中的显示大小。这个值通常需要根据地图上实际绘制的标记大小进行调整,以保持视觉上的一致性。
  • label:图例中显示的文本标签。

注意事项与最佳实践

  1. 标记大小一致性:图例中的 markersize 应尽可能与地图上实际绘制的标记大小相匹配。这有助于读者快速准确地理解图例与地图内容之间的对应关系。
  2. 选择合适的图例项类型
    • 对于表示颜色区域、填充色块或条形的图例,matplotlib.patches.Patch 是首选。
    • 对于表示点、线、散点图中的标记或自定义符号的图例,matplotlib.lines.Line2D 是更准确的选择。
  3. 图例位置与标题:合理设置 loc 参数(如 'lower right'、'upper left' 等)以避免图例遮挡重要地图内容。使用 title 参数为图例提供清晰的整体说明。
  4. 自定义图例处理器:对于更复杂的图例需求,例如需要自定义图例项的绘制方式,可以探索使用 matplotlib.legend.LegendHandler 和 handler_map。这允许您为特定类型的艺术家(Artist)或自定义对象定义如何生成其图例条目。

总结

在 Matplotlib 中创建包含多种元素的地图图例,特别是整合色块和自定义符号标记时,关键在于选择正确的图例项类型。通过将表示区域的色块与使用 matplotlib.lines.Line2D 创建的自定义符号标记相结合,我们可以确保图例的准确性和专业性。Line2D 提供了灵活的参数来精确控制标记的样式,从而有效提升了地图的可读性和信息传达效率。掌握这一技巧,将使您在 Matplotlib 中创建更具表现力的可视化作品。

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

7

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

4

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号