Python绘制克利夫兰点图:从入门到实战

Python绘制克利夫兰点图:从入门到实战

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

引言

克利夫兰点图(Cleveland Dot Plot)是一种强大的数据可视化工具,由统计学家William Cleveland在1984年提出。这种图表特别适合展示多个类别的数值比较,比传统的条形图更直观、更精确。本文将详细介绍如何使用Python创建克利夫兰点图,从基础概念到实际应用。

什么是克利夫兰点图?

克利夫兰点图是一种简洁而有效的数据可视化方式,它通过点和水平线的组合来展示数据。每个数据点都通过一条水平线连接到坐标轴,使得数据之间的比较更加直观。

主要特点:

  1. 使用点和水平线展示数据
  2. 适合展示多个类别的数值比较
  3. 数据排序后更容易观察趋势
  4. 支持多数据系列的对比展示

环境准备

在开始之前,我们需要安装必要的Python库:

pip install matplotlib seaborn pandas numpy

代码实现

让我们通过实际的例子来学习如何创建克利夫兰点图。我们将使用matplotlib和seaborn来实现这个可视化效果。

1. 基础设置

首先,我们需要导入必要的库并设置中文字体支持:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

2. 准备数据

在我们的示例中,我们使用城市温度数据来展示克利夫兰点图的效果:

# 示例数据:不同城市的平均温度
cities = ['北京', '上海', '广州', '深圳', '成都', '杭州']
temperatures = [12, 16, 22, 24, 18, 17]# 创建DataFrame
df = pd.DataFrame({'城市': cities,'温度': temperatures
})# 按温度排序
df = df.sort_values('温度')

3. 创建基础点图

使用matplotlib创建基础克利夫兰点图:

# 创建图形
plt.figure(figsize=(10, 6))# 绘制点
plt.scatter(df['温度'], range(len(df)), s=100, color='blue', alpha=0.6)# 添加水平线
for i, temp in enumerate(df['温度']):plt.hlines(i, 0, temp, colors='gray', linestyles='--', alpha=0.5)# 设置y轴标签
plt.yticks(range(len(df)), df['城市'])# 添加标题和标签
plt.title('各城市平均温度对比', fontsize=14)
plt.xlabel('温度 (°C)', fontsize=12)# 添加网格线
plt.grid(True, axis='x', linestyle='--', alpha=0.3)

实际应用场景

克利夫兰点图在以下场景特别有用:

  1. 数据对比:比较不同类别之间的数值差异
  2. 趋势分析:展示数据的变化趋势
  3. 多维度分析:同时展示多个指标
  4. 时间序列对比:比较不同时间点的数据

进阶技巧

1. 多数据系列对比

可以同时展示多个数据系列:

# 创建更复杂的示例数据
categories = ['产品A', '产品B', '产品C', '产品D', '产品E']
sales_2022 = [120, 85, 150, 95, 110]
sales_2023 = [140, 95, 160, 105, 130]# 创建DataFrame
df = pd.DataFrame({'类别': categories,'2022年': sales_2022,'2023年': sales_2023
})

2. 多维度分析

展示产品的多个指标:

# 创建业务数据
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
metrics = {'销售额': [120, 85, 150, 95, 110],'利润率': [25, 18, 30, 22, 28],'客户满意度': [4.2, 3.8, 4.5, 4.0, 4.3],'市场份额': [15, 10, 20, 12, 18]
}

3. 自定义样式

可以通过修改各种参数来优化图表外观:

# 设置颜色
colors = ['blue', 'green', 'red', 'purple']# 设置透明度
alpha = 0.6# 设置点的大小
s = 100# 设置网格线样式
plt.grid(True, axis='x', linestyle='--', alpha=0.3)

多数据序列演示

让我们通过一个实际的例子来展示如何使用克利夫兰点图比较多个数据序列。这个例子将展示不同产品在2022年和2023年的销售数据对比。

1. 数据准备

# 创建示例数据
categories = ['产品A', '产品B', '产品C', '产品D', '产品E']
sales_2022 = [120, 85, 150, 95, 110]
sales_2023 = [140, 95, 160, 105, 130]# 创建DataFrame
df = pd.DataFrame({'类别': categories,'2022年': sales_2022,'2023年': sales_2023
})# 计算增长率
df['增长率'] = ((df['2023年'] - df['2022年']) / df['2022年'] * 100).round(1)# 按2023年销售额排序
df = df.sort_values('2023年')

2. 创建双图表对比

# 创建图形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))# 绘制销售额对比图
for year, color in zip(['2022年', '2023年'], ['gray', 'blue']):ax1.scatter(df[year], range(len(df)), s=100, color=color, alpha=0.6, label=year)for i, value in enumerate(df[year]):ax1.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)ax1.set_yticks(range(len(df)))
ax1.set_yticklabels(df['类别'])
ax1.set_title('2022-2023年销售额对比', fontsize=14)
ax1.set_xlabel('销售额 (万元)', fontsize=12)
ax1.legend()
ax1.grid(True, axis='x', linestyle='--', alpha=0.3)# 绘制增长率图
ax2.scatter(df['增长率'], range(len(df)), s=100, color='green', alpha=0.6)
for i, rate in enumerate(df['增长率']):ax2.hlines(i, 0, rate, colors='green', linestyles='--', alpha=0.3)ax2.set_yticks(range(len(df)))
ax2.set_yticklabels(df['类别'])
ax2.set_title('2022-2023年增长率对比', fontsize=14)
ax2.set_xlabel('增长率 (%)', fontsize=12)
ax2.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()
plt.show()

3. 图表解读

这个多数据序列的克利夫兰点图展示了:

  1. 销售额对比

    • 左侧图表展示了2022年和2023年的销售额对比
    • 使用不同颜色区分不同年份
    • 通过水平线连接点,便于比较同一产品在不同年份的表现
  2. 增长率分析

    • 右侧图表展示了各产品的年度增长率
    • 使用绿色表示增长情况
    • 可以直观看出哪些产品增长最快
  3. 数据排序

    • 按2023年销售额排序,便于观察产品表现
    • 清晰的标签和图例,提高可读性

4. 完整的多数据序列代码

def create_multi_series_cleveland_plot():# 创建示例数据categories = ['产品A', '产品B', '产品C', '产品D', '产品E']sales_2022 = [120, 85, 150, 95, 110]sales_2023 = [140, 95, 160, 105, 130]# 创建DataFramedf = pd.DataFrame({'类别': categories,'2022年': sales_2022,'2023年': sales_2023})# 计算增长率df['增长率'] = ((df['2023年'] - df['2022年']) / df['2022年'] * 100).round(1)# 按2023年销售额排序df = df.sort_values('2023年')# 创建图形fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))# 绘制销售额对比图for year, color in zip(['2022年', '2023年'], ['gray', 'blue']):ax1.scatter(df[year], range(len(df)), s=100, color=color, alpha=0.6, label=year)for i, value in enumerate(df[year]):ax1.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)ax1.set_yticks(range(len(df)))ax1.set_yticklabels(df['类别'])ax1.set_title('2022-2023年销售额对比', fontsize=14)ax1.set_xlabel('销售额 (万元)', fontsize=12)ax1.legend()ax1.grid(True, axis='x', linestyle='--', alpha=0.3)# 绘制增长率图ax2.scatter(df['增长率'], range(len(df)), s=100, color='green', alpha=0.6)for i, rate in enumerate(df['增长率']):ax2.hlines(i, 0, rate, colors='green', linestyles='--', alpha=0.3)ax2.set_yticks(range(len(df)))ax2.set_yticklabels(df['类别'])ax2.set_title('2022-2023年增长率对比', fontsize=14)ax2.set_xlabel('增长率 (%)', fontsize=12)ax2.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()if __name__ == '__main__':create_multi_series_cleveland_plot()

注意事项

  1. 数据量不宜过多,建议控制在10-15个类别以内
  2. 确保数据之间的差异足够明显
  3. 选择合适的颜色方案,避免使用过于相似的颜色
  4. 添加适当的图例和标签
  5. 注意中文字体的显示问题,确保系统安装了所需的中文字体

总结

克利夫兰点图是一种强大的数据可视化工具,特别适合展示多个类别的数值比较。通过Python和matplotlib,我们可以轻松创建美观且功能丰富的克利夫兰点图。在实际应用中,要根据具体需求选择合适的展示方式,并注意数据的可读性和美观性。

完整代码

完整的代码实现如下,包含基础示例和多数据序列示例:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef create_basic_cleveland_plot():"""创建基础克利夫兰点图"""# 示例数据cities = ['北京', '上海', '广州', '深圳', '成都', '杭州']temperatures = [12, 16, 22, 24, 18, 17]# 创建DataFramedf = pd.DataFrame({'城市': cities,'温度': temperatures})# 按温度排序df = df.sort_values('温度')# 创建图形plt.figure(figsize=(10, 6))# 绘制点plt.scatter(df['温度'], range(len(df)), s=100, color='blue', alpha=0.6)# 添加水平线for i, temp in enumerate(df['温度']):plt.hlines(i, 0, temp, colors='gray', linestyles='--', alpha=0.5)# 设置y轴标签plt.yticks(range(len(df)), df['城市'])# 添加标题和标签plt.title('各城市平均温度对比', fontsize=14)plt.xlabel('温度 (°C)', fontsize=12)# 添加网格线plt.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()def create_multi_series_cleveland_plot():"""创建多数据序列克利夫兰点图"""# 创建示例数据categories = ['产品A', '产品B', '产品C', '产品D', '产品E']sales_2022 = [120, 85, 150, 95, 110]sales_2023 = [140, 95, 160, 105, 130]# 创建DataFramedf = pd.DataFrame({'类别': categories,'2022年': sales_2022,'2023年': sales_2023})# 计算增长率df['增长率'] = ((df['2023年'] - df['2022年']) / df['2022年'] * 100).round(1)# 按2023年销售额排序df = df.sort_values('2023年')# 创建图形fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))# 绘制销售额对比图for year, color in zip(['2022年', '2023年'], ['gray', 'blue']):ax1.scatter(df[year], range(len(df)), s=100, color=color, alpha=0.6, label=year)for i, value in enumerate(df[year]):ax1.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)ax1.set_yticks(range(len(df)))ax1.set_yticklabels(df['类别'])ax1.set_title('2022-2023年销售额对比', fontsize=14)ax1.set_xlabel('销售额 (万元)', fontsize=12)ax1.legend()ax1.grid(True, axis='x', linestyle='--', alpha=0.3)# 绘制增长率图ax2.scatter(df['增长率'], range(len(df)), s=100, color='green', alpha=0.6)for i, rate in enumerate(df['增长率']):ax2.hlines(i, 0, rate, colors='green', linestyles='--', alpha=0.3)ax2.set_yticks(range(len(df)))ax2.set_yticklabels(df['类别'])ax2.set_title('2022-2023年增长率对比', fontsize=14)ax2.set_xlabel('增长率 (%)', fontsize=12)ax2.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()def create_multi_metrics_cleveland_plot():"""创建多维度指标克利夫兰点图"""# 创建业务数据products = ['产品A', '产品B', '产品C', '产品D', '产品E']metrics = {'销售额': [120, 85, 150, 95, 110],'利润率': [25, 18, 30, 22, 28],'客户满意度': [4.2, 3.8, 4.5, 4.0, 4.3],'市场份额': [15, 10, 20, 12, 18]}# 创建DataFramedf = pd.DataFrame(metrics, index=products)# 标准化数据df_normalized = (df - df.min()) / (df.max() - df.min())# 创建图形plt.figure(figsize=(12, 8))# 为每个指标绘制点colors = ['blue', 'green', 'red', 'purple']for (metric, color) in zip(metrics.keys(), colors):plt.scatter(df_normalized[metric], range(len(products)), s=100, color=color, alpha=0.6, label=metric)for i, value in enumerate(df_normalized[metric]):plt.hlines(i, 0, value, colors=color, linestyles='--', alpha=0.3)plt.yticks(range(len(products)), products)plt.title('产品多维度分析', fontsize=14)plt.xlabel('标准化得分', fontsize=12)plt.legend()plt.grid(True, axis='x', linestyle='--', alpha=0.3)plt.tight_layout()plt.show()if __name__ == '__main__':print("运行基础克利夫兰点图示例...")create_basic_cleveland_plot()print("\n运行多数据序列克利夫兰点图示例...")create_multi_series_cleveland_plot()print("\n运行多维度指标克利夫兰点图示例...")create_multi_metrics_cleveland_plot()

这个完整的代码包含了三个主要函数:

  1. create_basic_cleveland_plot(): 创建基础克利夫兰点图
  2. create_multi_series_cleveland_plot(): 创建多数据序列克利夫兰点图
  3. create_multi_metrics_cleveland_plot(): 创建多维度指标克利夫兰点图

运行代码时会依次展示这三种不同类型的克利夫兰点图,帮助读者理解不同场景下的应用。

参考资料

  1. Matplotlib官方文档
  2. 数据可视化最佳实践指南
  3. Cleveland Dot Plot的历史与应用

希望这篇文章能帮助你理解并掌握克利夫兰点图的创建方法。如果你有任何问题或建议,欢迎在评论区留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVGL- Calendar 日历控件

1 日历控件 1.1 日历背景 lv_calendar 是 LVGL(Light and Versatile Graphics Library)提供的标准 GUI 控件之一,用于显示日历视图。它支持用户查看某年某月的完整日历,还可以实现点击日期、标记日期、导航月份等操作。这个控件…

多指标组合策略

该策略(MultiConditionStrategy)是一种基于多种技术指标和市场条件的交易策略。它通过综合考虑多个条件来生成交易信号,从而决定买入或卖出的时机。 以下是对该策略的详细分析: 交易逻辑思路 1. 条件1:星期几和价格变化判断 - 该条件根据当前日期是星期几以及价格的变化…

BC 范式与 4NF

接下来我们详细解释 BC 范式(Boyce-Codd范式,简称 BCNF),并通过具体例子说明其定义和应用。 一、BC范式的定义 BC范式(Boyce-Codd范式,BCNF)是数据库规范化理论中的一种范式,它比第…

基于 CSS Grid 的网页,拆解页面整体布局结构

通过以下示例拆解网页整体布局结构&#xff1a; 一、基础结构&#xff08;HTML骨架&#xff09; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作

采购审批流程全靠人推进&#xff0c;内耗严重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;结果功能有局限、不灵活&#xff1f; 问题出在哪里&#xff1f;是我们的要求太多、太苛刻吗&#xff1f;NO&#xff01; 流程名称&#xff1a; 采购审批管理 流程功能…

全栈项目搭建指南:Nuxt.js + Node.js + MongoDB

全栈项目搭建指南&#xff1a;Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用&#xff0c;包含&#xff1a; 前端&#xff1a;Nuxt.js (SSR渲染)后端&#xff1a;Node.js (Express/Koa框架)数据库&#xff1a;MongoDB后台管理系统&#xff1a;集成在同…

NVMe简介6之PCIe事务层

PCIe的事务层连接了PCIe设备核心与PCIe链路&#xff0c;这里主要基于PCIe事务层进行分析。事务层采用TLP传输事务&#xff0c;完整的TLP由TLPPrefix、TLP头、Payload和TLP Digest组成。TLP头是TLP中最关键的部分&#xff0c;一般由三个或四个双字的长度&#xff0c;其格式定义如…

Python异常模块和包

异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG 例如&#xff1a;以r方式打开一个不存在的文件。 f open(‘python1.txt’,‘r’,encoding‘utf-8’) 当我们…

汇编:循环程序设计

一、 实验要求 熟练掌握循环程序设计的基本方法熟练掌握单片机外部存储空间的访问方法 二、 实验设计 1.整体思路 先初始化一些寄存器和数据存储位置&#xff0c;然后调用两个子程序Procedure1和Procedure2&#xff0c;分别从SRC复制数据到DEST&#xff0c;一个从开头到末尾&…

典籍知识问答模块AI问答bug修改

一、修改流式数据处理问题 1.问题描述&#xff1a;由于传来的数据形式如下&#xff1a; event:START data:350 data:< data:t data:h data:i data:n data:k data:> data: data: data: data: data:嗯 data:&#xff0c; 导致需要修改获取正常的当前信息id并更…

【金仓数据库征文】- 金融HTAP实战:KingbaseES实时风控与毫秒级分析一体化架构

文章目录 引言&#xff1a;金融数字化转型的HTAP引擎革命一、HTAP架构设计与资源隔离策略1.1 混合负载物理隔离架构1.1.1 行列存储分区策略1.1.2 四级资源隔离机制 二、实时流处理与增量同步优化2.1 分钟级新鲜度保障2.1.1 WAL日志增量同步2.1.2 流计算优化 2.2 物化视图实时刷…

季报中的FPGA行业:U型反转,春江水暖

上周Lattice,AMD两大厂商相继发布2025 Q1季报,尽管恢复速度各异,但同时传递出FPGA行业整体回暖的复苏信号。 5月5日,Lattice交出了“勉强及格”的答卷,报告季度营收1亿2000万,与华尔街的预期基本相符。 对于这家聚焦在中小规模器件的领先厂商而言,按照其CEO的预期,长…

使用 javap 深入理解 Java 字节码

引言 Java 是一种广泛使用的高级编程语言,其独特之处在于编译后的代码不是直接的机器码,而是一种称为字节码的中间表示形式。字节码存储在 .class 文件中,由 Java 虚拟机 (JVM) 解释或即时编译为特定平台的机器码。这种设计赋予了 Java 平台无关性,即“一次编写,到处运行…

LeetCode_sql刷题(3482.分析组织层级)

题目描述&#xff1a;3482. 分析组织层级 - 力扣&#xff08;LeetCode&#xff09; 表&#xff1a;Employees ------------------------- | Column Name | Type | ------------------------- | employee_id | int | | employee_name | varchar | | manager_id …

工业场景轮式巡检机器人纯视觉识别导航的优势剖析与前景展望

一、引言 1.1 研究背景与意义 在工业 4.0 的大背景下&#xff0c;工业生产的智能化、自动化水平不断提高&#xff0c;对工业场景的巡检工作提出了更高的要求。传统的人工巡检方式不仅效率低下、成本高昂&#xff0c;而且容易受到人为因素的影响&#xff0c;难以满足现代工业生…

《棒球万事通》球类运动有哪些项目·棒球1号位

以棒球运动为例&#xff0c;棒球运动涉及多个核心项目和比赛形式&#xff0c;以下为主要分类&#xff1a; 一、比赛环节 投球&#xff08;Pitching&#xff09; 防守方投手向击球员投球&#xff0c;目标是让对方难以击中或制造出局。 击球&#xff08;Batting&#xff09; …

第五项修炼:打造学习型组织

最近一直接到的需求&#xff0c;都是公司董事长或总经理都特别推崇《第五项修炼&#xff1a;打造学习型组织》的内容&#xff0c;让各个层级的管理者都持续学习、应用、实践。我不禁开始反思&#xff0c;这背后到底隐藏着什么原因&#xff1f; 随着商业环境的变化和复杂性的增加…

国内AWS CloudFront与S3私有桶集成指南:安全访问静态内容

在现代web应用架构中,将静态内容存储在Amazon S3中并通过CloudFront分发是一种常见且高效的做法。本指南将详细介绍如何创建私有S3桶,配置CloudFront分配,并使用Origin Access Identity (OAI)来确保安全访问。 步骤1:创建S3桶 首先,我们需要创建一个名为"b-static&…

BUUCTF——Nmap

BUUCTF——Nmap 进入靶场 类似于一个nmap的网站 尝试一下功能 没什么用 看看数据包 既然跟IP相关 伪造一个XXF看看 拼接了一下没什么用 果然没这么简单 尝试一下命令注入 构造payload 127.0.0.1 | ls 应该有过滤 加了个\ 直接构造个php木马上传试试 127.0.0.1 | <?…

NPN、PNP三极管的应用

由于电路知识实在是难以拿出手&#xff0c;在面试的时候被问到三极管相关问题&#xff0c;相当地尴尬。在网上简要地学习了相关的理论知识&#xff0c;在这里给出自己的理解。更为基础的原理在这里并不提及。我们面向实际应用学习即可。 我们知道常见的三极管总是硅管&#xff…