数据可视化是数据分析的重要环节,它能帮助我们直观地理解数据模式、趋势和关系。在数据比较与排序方面,不同的图表可以展现不同的数据特点。本篇文章将介绍几种常见的比较与排序类可视化图表,并使用 Python 代码实现它们。
1.柱状图
柱状图,也称为条形图或直方图,是一种以高度或长度差异来直观展示统计指标数值的图形。它具有简明、醒目的特点,是统计学和数据分析中常用的可视化工具。柱状图主要用于显示一段时间内的数据变化,或者用于比较不同项目之间的数值大小。
1.1 特点
(1)直观性
柱状图通过柱子的高度差异直观地展示数据间的比较关系,能够迅速理解数据的大小差异和趋势。
(2)适用性
柱状图适用于展示离散的分类数据,每个柱子代表一个特定的类别或组。
(3)可定制性
在制作柱状图时,可以根据具体需求对图表进行高度定制。这包括调整柱子的颜色、宽度、间距等外观属性,还能添加数据标签、标题、坐标轴标签等信息,使图表更加丰富和易于理解。
(4)组合灵活性
柱状图可以与其他类型的图表(如折线图、饼图等)组合使用。这种组合方式能够更全面地展示数据之间的多种关系,例如在展示销售数据的柱状图上叠加一条趋势折线,既可以直观地比较不同产品的销量,又能观察销量随时间的变化趋势。
1.2 应用场景
(1)类别数据的比较(如销售额、人口数量、产品销量等)。
(2)时间序列数据的分析(如年均降水量、每月支出、季度收入等)。
(3)分布情况的展示(如考试成绩分布、年龄段分布等)。
(4)业务分析与决策(如市场份额、客户满意度等)。
1.3 使用Python实现柱状图
首先,需要导入Matplotlib的pyplot模块和NumPy模块。NumPy是一个用于科学计算的库,可以方便地生成数据数组。定义柱状图的类别和对应的数值数据。这里以一个简单的销售数据为例,展示不同产品类别的销售额。然后使用pyplot的bar()函数创建柱状图,设置柱子的位置、高度、宽度等参数。通过调整这些参数,可以控制柱状图的基本外观。为了使图表更加清晰易读,需要添加标题、坐标轴标签等元素,并对刻度标签进行适当的调整。还可以添加网格线和数据标签,增强图表的可读性和信息量。实现代码如图所示:
) # 设置图表大小
bars = plt.bar(categories, sales, width=0.6, color='skyblue', edgecolor='black', alpha=0.8)
# 美化图表
plt.title("各类产品销售额对比", fontsize=16)
plt.xlabel("产品类别", fontsize=12)
plt.ylabel("销售额(万元)", fontsize=12)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 添加数据标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height}',
ha='center', va='bottom')
# 显示图表
plt.tight_layout()
plt.show()
2. 环形柱状图
环形柱状图,也称为环形条形图或环形直方图,是一种结合了环形图和柱状图特点的可视化图形。它通过环形的半径或面积差异来展示统计指标数值,同时能够体现数据的构成比例关系。环形柱状图不仅具有直观、适用性强的特点,还能在有限的空间内展示更多的数据信息,是数据分析和报告中的一种重要工具。
2.1 特点
(1)视觉吸引力强:相比于传统柱状图,环形柱状图能够增强可视化的美观性和创新性,适合展示在报告和仪表盘中。
(2)占用空间更小:由于环形排列方式,适用于有限空间的数据展示,尤其适用于多个数据类别的比较。
(3)突出数据层级:环形柱状图可以更直观地体现数据的分布情况,适用于表现数据的相对大小和比例。
(4)适用于循环型数据:如 24 小时内的用户访问量、年度销售额分布等,环形形式能够突出数据周期性。
2.2 应用场景
(1)比较各类别的数值大小(如市场份额、产品销量等)。
(2)展示周期性数据(如一天中的访问量、季节性销售额等)。
(3)用于仪表盘(如 KPI 监测、数据概览等)。
2.3 使用Python实现
定义环形柱状图的类别和对应的数值数据。这里以一个简单的销售数据为例,展示不同产品类别的销售额及其占总销售额的比例。使用Matplotlib的subplots()函数创建一个图形和坐标轴对象,以便更灵活地定制图表。然后,通过循环绘制环形柱状图的各个环形,每个环形代表一个产品类别,其半径根据销售额的大小进行调整。为了使图表更加清晰易读,需要添加标题、调整坐标轴范围和刻度标签,并对图表进行美化。可以设置坐标轴的显示范围,隐藏坐标轴边框,调整字体样式和大小等。
实现代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 准备数据
categories = ['电子产品', '服装', '食品', '家居用品', '化妆品']
sales = np.array([120, 80, 150, 70, 100])
percentages = sales / sales.sum() * 100
# 设置角度
angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False)
radius = sales / sales.max() # 归一化半径
# 创建极坐标图
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'projection': 'polar'})
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
# 绘制环形柱状图
bars = ax.bar(angles, radius, width=0.5, bottom=0.3, color='skyblue', edgecolor='black', alpha=0.8)
# 添加数据标签
for bar, category, sale, percentage, angle in zip(bars, categories, sales, percentages, angles):
ax.text(angle, bar.get_height() + 0.05, f'{category}\n{sale}万元\n{percentage:.1f}%',
ha='center', va='bottom', fontsize=10, color='black')
# 设置标题
ax.set_title("各类产品销售额及占比环形柱状图", fontsize=16, pad=20)
# 去除坐标轴
ax.set_xticks([])
ax.set_yticks([])
ax.spines['polar'].set_visible(False)
# 显示图表
plt.show()
环形柱状图如图所示:
3. 子弹图
子弹图是一种将目标值、实际值和预测值等信息集成在一起的可视化图形,通过颜色编码和标记来直观展示数据与目标之间的关系。它在数据分析和业务监控中具有独特的价值,能够帮助用户快速评估绩效和进度。
3.1 特点
(1)紧凑清晰:相比仪表盘(Gauge Chart),子弹图能够在有限空间内提供更多信息。
(2)支持目标对比:能够清晰地展示当前值(实际值)、目标值和性能区间(如差、中、优)。
(3)易于解读:适用于展示 KPI 指标,能快速识别数据是否达到目标或处于合理范围。
3.2 应用场景
(1)KPI 绩效评估(如销售业绩、客户满意度等)。
(2)目标 vs 实际值对比(如生产目标、财务目标完成情况等)。
(3)业务仪表盘(用于展示多个关键指标,适用于管理层数据分析)。
(4)数据密集型可视化(相比传统图表,子弹图在有限空间内能展示更多信息)。
3.3 使用python实现
定义子弹图的目标值、实际值和预测值等数据。这里以一个简单的销售数据为例,展示不同产品类别的销售目标和实际完成情况。使用Matplotlib的bar()函数创建子弹图的基本结构,设置目标值、实际值和预测值的柱子位置和样式。实现代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 准备数据
categories = ['电子产品', '服装', '食品', '家居用品', '化妆品']
target_sales = np.array([130, 90, 160, 80, 110]) # 目标销售额
actual_sales = np.array([120, 80, 150, 70, 100]) # 实际销售额
forecast_sales = np.array([125, 85, 155, 75, 105]) # 预测销售额
# 计算 y 轴位置(倒序,使子弹图自上而下排列)
y_pos = np.arange(len(categories))
# 创建图表
fig, ax = plt.subplots(figsize=(10, 6))
# 绘制背景区间(目标销售额作为基准)
for i in range(len(categories)):
ax.barh(y=y_pos[i], width=target_sales[i], height=0.6, color='lightgray', label='目标范围' if i == 0 else "", alpha=0.7)
# 绘制实际销售额(子弹图的“子弹”)
ax.barh(y=y_pos, width=actual_sales, height=0.3, color='skyblue', label='实际销售额', edgecolor='black', alpha=0.9)
# 绘制目标销售额(黑色竖线)
for i in range(len(categories)):
ax.axvline(x=target_sales[i], ymin=(i + 0.1) / len(categories), ymax=(i + 0.9) / len(categories), color='black', linestyle="--", linewidth=2, label='目标值' if i == 0 else "")
# 绘制预测销售额(红色短横线)
for i in range(len(categories)):
ax.plot(forecast_sales[i], y_pos[i], 'ro', markersize=6, label='预测值' if i == 0 else "")
# 设置 y 轴标签
ax.set_yticks(y_pos)
ax.set_yticklabels(categories)
# 设置 x 轴标题
ax.set_xlabel("销售额(万元)")
ax.set_title("各类产品销售目标与实际完成情况(子弹图)")
# 加数据标签
for i in range(len(categories)):
plt.text(actual_sales[i] + 2, y_pos[i], f'{actual_sales[i]}', va='center', fontsize=10, color='black')
plt.text(target_sales[i] + 2, y_pos[i], f'{target_sales[i]}', va='center', fontsize=10, color='gray')
# 添加图例
plt.legend(loc='lower right', fontsize=10)
# 优化布局
plt.grid(axis='x', linestyle='--', alpha=0.5)
plt.tight_layout()
# 显示图表
plt.show()
子弹图如图所示:
4. 哑铃图
哑铃图是一种通过线条连接两个数据点来展示数据变化范围或对比关系的可视化图形。它具有简洁、直观的特点,能够有效地呈现数据之间的差异和趋势,是数据分析和报告中的一种重要工具。
4.1 特点
(1)直观显示差距:通过两个点和连接线,展现两个数据值之间的差异,适用于对比分析。
(2)适合时间序列或组间比较:能够展示某个指标在两个不同时间点的变化趋势。
(3)增强可读性:哑铃图能减少视觉杂乱,使得数据趋势更加清晰。
4.2 应用场景
(1)时间序列分析(如 2010 年 vs 2020 年的人口变化)。
(2)性别对比(如男性与女性薪资水平差异)。
(3)地区对比(如不同城市的 GDP 变化)。
(4)政策或策略影响评估(如某政策实施前后的数据对比)。
4.3 使用python实现
定义哑铃图的类别和对应的起始值、结束值数据。这里以一个简单的销售数据为例,展示不同产品类别在两个时间段的销售额变化。实现代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 准备数据
categories = ['电子产品', '服装', '食品', '家居用品', '化妆品']
start_sales = [120, 80, 150, 70, 100] # 起始时间点的销售额
end_sales = [130, 90, 160, 80, 110] # 结束时间点的销售额
# 计算 y 轴的位置
y_pos = np.arange(len(categories))
# 创建图表
plt.figure(figsize=(10, 6))
# 绘制连接线,表示变化趋势
for i in range(len(categories)):
plt.plot([start_sales[i], end_sales[i]], [y_pos[i], y_pos[i]], color='gray', linestyle='-', linewidth=2)
# 绘制起始数据点(蓝色)
plt.scatter(start_sales, y_pos, color='blue', s=100, label='起始销售额')
# 绘制结束数据点(红色)
plt.scatter(end_sales, y_pos, color='red', s=100, label='结束销售额')
# 添加数据标签,确保标签不会重叠
for i in range(len(categories)):
plt.text(start_sales[i] - 3, y_pos[i], f'{start_sales[i]}', ha='right', va='center', fontsize=10, color='blue')
plt.text(end_sales[i] + 3, y_pos[i], f'{end_sales[i]}', ha='left', va='center', fontsize=10, color='red')
# 美化图表
plt.title("各类产品销售额变化哑铃图", fontsize=16)
plt.xlabel("销售额(万元)", fontsize=12)
plt.ylabel("产品类别", fontsize=12)
plt.xticks(fontsize=10)
plt.yticks(y_pos, categories, fontsize=10)
# 添加图例
plt.legend(loc='upper right', fontsize=10)
# 添加网格线
plt.grid(axis='x', linestyle='--', alpha=0.7)
# 显示图表
plt.tight_layout()
plt.show()
# 可选择保存图表
# plt.savefig('dumbbell_chart.png', dpi=300, bbox_inches='tight')
绘制的哑铃图如图所示:
5. 雷达图
雷达图又称蜘蛛网图(Spider Chart)或极坐标图(Polar Chart),是一种以多边形的形式展示多维数据的可视化工具,每个顶点代表一个维度,数据点连接成线形成封闭图形。它适合比较不同实体在多个指标上的表现,直观呈现强弱项。
5.1 特点
(1)多维展示:能够在同一图表中对比多个变量的数据分布情况。
(2)直观比较:适用于对比不同对象在多个属性上的优劣势,尤其适用于评分、性能评估等场景。
(3)中心扩散性:数据点越靠近中心,表示数值越小,反之越大。
(4)连接性强:各维度数据点通过线条连接形成一个封闭区域,便于观察整体趋势。
5.2 应用场景
(1)体育分析:例如比较不同球员在速度、力量、防守等方面的表现。
(2)市场分析:评估不同产品在价格、质量、口碑等维度上的表现。
(3)个人能力评估:可用于员工绩效考核,如沟通能力、领导力、创新力等。
(4)产品对比:展示同类产品在不同特性上的优劣对比,如不同手机型号的性能评分。
5.3 使用python实现
定义雷达图的维度标签和对应的数值数据。这里以一个简单的绩效评估为例,展示员工在不同能力维度上的得分。实现代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 准备数据
categories = ['沟通能力', '团队协作', '创新能力', '问题解决', '专业知识']
scores_A = [85, 90, 80, 75, 95] # 员工A的得分
scores_B = [70, 80, 90, 85, 75] # 员工B的得分
# 创建图表
plt.figure(figsize=(10, 8)) # 设置图表大小
# 创建雷达图的轴
num_vars = len(categories)
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
scores_A += scores_A[:1] # 闭合图形
scores_B += scores_B[:1]
angles += angles[:1]
ax = plt.subplot(111, polar=True) # 创建极坐标图
ax.set_theta_offset(np.pi / 2) # 调整起始角度
ax.set_theta_direction(-1) # 顺时针方向
# 设置维度标签
plt.xticks(angles[:-1], categories, fontsize=10)
# 绘制雷达图
# 绘制员工A的雷达图
ax.plot(angles, scores_A, color='skyblue', linewidth=2, label='员工A')
ax.fill(angles, scores_A, color='skyblue', alpha=0.2)
# 绘制员工B的雷达图
ax.plot(angles, scores_B, color='orange', linewidth=2, label='员工B')
ax.fill(angles, scores_B, color='orange', alpha=0.2)
# 添加标题并放在左侧
ax.set_title("员工绩效评估雷达图", fontsize=16, loc='left')
# 添加图例
plt.legend(loc='upper right', fontsize=10)
# 设置Y轴刻度
ax.set_rlabel_position(30) # 设置Y轴标签的位置
plt.yticks([20, 40, 60, 80, 100], ['20', '40', '60', '80', '100'], fontsize=10)
plt.ylim(0, 100)
# 添加网格线
ax.grid(True, linestyle='--', alpha=0.7)
# 显示图表
plt.tight_layout()
plt.show()
# 保存图表
# plt.savefig('radar_chart.png', dpi=300, bbox_inches='tight')
雷达图如图所示:
6. 平行坐标图
平行坐标图是一种用于展示多维数据的可视化工具,通过多条平行轴表示不同的维度,数据点以连线的形式在各轴间展示。它适合比较不同实体在多个维度上的表现,直观呈现数据之间的差异和趋势。
6.1 特点
(1)多维度展示
平行坐标图能够同时展示多个维度的数据,每个维度对应一条平行轴。数据点在各轴上以线条连接,可以全面了解数据在各个维度上的分布和关系。
(2)直观比较
通过平行坐标图,可以直观地比较不同实体在各个维度上的差异。不同实体的数据以不同颜色或样式的线条呈现,可以通过线条的交叉和位置迅速判断出各实体在不同维度上的强弱项。
(3)每条折线代表一个数据点,线段的走向和交叉情况揭示变量之间的相关性。
6.2 应用场景
(1)多变量比较:适用于展示多个特征之间的对比,比如不同产品、客户或实验样本的特征值。
(2)模式识别:可以帮助识别数据中的趋势、聚类关系或异常点。
(3)机器学习特征分析:用于探索高维数据的结构,如分类模型的特征分布。
6.3 使用python实现
下面是一个使用 matplotlib 和 pandas 进行平行坐标图可视化的示例,展示不同车型的性能比较。实现代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from pandas.plotting import parallel_coordinates
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据集
data = {
'车型': ['A', 'B', 'C', 'D', 'E'],
'加速度': [8.2, 7.8, 9.5, 6.5, 8.8], # 0-100km/h 加速时间
'油耗': [6.5, 7.2, 5.8, 8.0, 6.2], # L/100km
'最高时速': [210, 190, 230, 180, 200], # km/h
'舒适度': [80, 85, 75, 90, 82] # 评分 (0-100)
}
# 转换为 DataFrame
df = pd.DataFrame(data)
# 归一化数据(使数据在同一数值范围)
for col in df.columns[1:]:
df[col] = (df[col] - df[col].min()) / (df[col].max() - df[col].min())
# 画平行坐标图
plt.figure(figsize=(10, 6))
parallel_coordinates(df, class_column='车型', colormap=plt.get_cmap("Set1"))
# 添加标题和标签
plt.title("不同车型性能对比的平行坐标图", fontsize=14)
plt.xlabel("指标", fontsize=12)
plt.ylabel("归一化数值", fontsize=12)
# 旋转 X 轴刻度
plt.xticks(rotation=15)
# 显示图例
plt.legend(title="车型", bbox_to_anchor=(1.05, 1), loc='upper left')
# 显示图表
plt.tight_layout()
plt.show()
平行坐标图如图所示:
7. 词云图
平行词云图是一种结合了平行坐标图和词云图的可视化工具,用于展示多维数据中每个维度的文本信息分布。它通过多条平行轴表示不同的维度,数据点以词云的形式在各轴上展示,线条连接同一数据点在不同维度的词云。这种图表适合比较不同实体在多个文本维度上的特征和频率,直观呈现文本数据之间的差异和趋势。
7.1 特点
(1)多维度文本展示
平行词云图能够同时展示多个维度的文本数据,每个维度对应一条平行轴。数据点在各轴上以词云的形式展示,使得观众可以全面了解数据在各个文本维度上的分布和特征。
(2)直观比较
通过平行词云图,可以直观地比较不同实体在各个文本维度上的差异。不同实体的数据以不同颜色或样式的词云呈现,观众可以通过词云的大小和位置迅速判断出各实体在不同维度上的文本特征。
7.2 应用场景
(1)文本分析:可用于新闻热点、市场调查、客户反馈等文本数据分析。
(2)社交媒体挖掘:用于分析微博、推特、评论区的高频词,提取用户关注点。
(3)品牌研究:可视化品牌相关的关键词,分析公众对品牌的感知。
7.3 使用python实现
下面是使用 wordcloud 和 matplotlib 生成词云图的示例,展示一篇文章的关键词可视化。实现代码如图下:
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 示例文本数据
text = """
人工智能 机器学习 深度学习 数据挖掘 自然语言处理 计算机视觉 神经网络 强化学习 监督学习 无监督学习 半监督学习
卷积神经网络 递归神经网络 生成对抗网络 迁移学习 计算机科学 数据科学 大数据 分布式计算 图神经网络 预测模型
"""
# 生成词云
wordcloud = WordCloud(
font_path="C:/Windows/Fonts/simhei.ttf", # 需要提供支持中文的字体文件
width=800,
height=600,
background_color="white",
colormap="viridis", # 颜色风格
max_words=50
).generate(text)
# 显示词云
plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off") # 不显示坐标轴
plt.title("文本关键词词云图", fontsize=16)
plt.show()
词云图如图所示:
总结
柱状图、环形柱状图、子弹图、哑铃图、雷达图和平行坐标图是数据分析中常用的可视化工具,各自具有独特的特点和适用场景。
(1)柱状图通过柱子的高度直观地展示数据间的比较关系,适用于展示离散的分类数据,可定制性强且组合灵活。
(2)环形柱状图结合了环形图和柱状图的特点,能够展示数据的构成比例和数值大小,适用于展示具有层次结构的数据。
(3)子弹图将目标值、实际值和预测值集成在一起,直观地展示数据与目标之间的关系,适用于绩效评估和销售目标监控。
(4)哑铃图通过线条连接两个数据点,展示数据的变化范围或对比关系,适用于展示数据在两个时间点的变化或不同组别的对比。
(5)雷达图以多边形的形式展示多维数据,每个顶点代表一个维度,适合比较不同实体在多个指标上的表现,直观呈现强弱项。
(6)平行坐标图通过多条平行轴表示不同的维度,数据点以连线的形式在各轴间展示,适合比较不同实体在多个维度上的表现,直观呈现数据之间的差异和趋势。
(7)词云图则通过字体大小和颜色展示文本数据中词语的频率和重要性,适用于文本数据分析和市场调研,能够直观地呈现文本中的关键词和主题分布。