Python 数据可视化:柱状图/热力图绘制实例解析

发布于:2025-08-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

Python 数据可视化:柱状图绘制实例解析

一、引言

数据可视化是数据分析中至关重要的环节,它能将复杂的数据以直观的图形方式呈现,帮助我们更好地理解数据特征和规律。Python 拥有丰富的可视化库,其中 Matplotlib 是最常用的基础库之一,能够绘制多种类型的图表。

本文将以双平台优化算法代码中的可视化部分为例,详细解读柱状图的绘制方法及相关函数的使用。

二、Matplotlib 基础

Matplotlib 是 Python 中最流行的绘图库,提供了类似 MATLAB 的绘图接口,支持多种图表类型。在代码中,主要通过 matplotlib.pyplot 模块(通常简写为 plt)进行绘图操作。

核心概念:

  • Figure:画布,是所有图表的容器
  • Axes:子图,一个画布可以包含多个子图
  • 面向对象编程:通过子图对象(ax)调用绘图方法

三、代码中的可视化实现解析

在提供的代码中,DualPlatformOptimization 类包含两个主要的可视化方法:create_visualizations()create_candidate_comparison_chart(),主要用于展示双平台优化的结果。

3.1 多子图布局创建

# 创建主要可视化图
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(16, 12))
fig.suptitle('大型分组双平台优化分析', fontsize=16, fontweight='bold')

函数解析:

  • plt.subplots(2, 2, figsize=(16, 12)):创建一个 2x2 的子图布局(共4个子图)
    • 参数 2, 2:表示 2 行 2 列的子图布局
    • 参数 figsize=(16, 12):设置整个画布的尺寸(宽16,高12)
  • fig.suptitle():设置整个画布的总标题
    • fontsize:设置字体大小
    • fontweight='bold':设置字体为粗体

3.2 候选平台响应时间对比柱状图

# 图3: 候选平台评估对比
ax3.set_title('候选平台响应时间对比', fontweight='bold')

if self.analysis_results and 'all_evaluations' in self.analysis_results:
    candidates = list(self.analysis_results['all_evaluations'].keys())
    response_times = [self.analysis_results['all_evaluations'][c]['total_response_time'] 
                    for c in candidates]
    
    # 只显示前10个候选平台以避免图表过于拥挤
    if len(candidates) > 10:
        # 按响应时间排序,显示最好的10个
        sorted_pairs = sorted(zip(candidates, response_times), key=lambda x: x[1])
        candidates = [p[0] for p in sorted_pairs[:10]]
        response_times = [p[1] for p in sorted_pairs[:10]]
    
    colors = ['gold' if c == self.optimal_second_platform else 'lightblue' for c in candidates]
    bars = ax3.bar(range(len(candidates)), response_times, color=colors, 
                  edgecolor='black', alpha=0.7)
    
    ax3.set_xticks(range(len(candidates)))
    ax3.set_xticklabels([f'路口{c}' for c in candidates], rotation=45)
    ax3.set_ylabel('总响应时间')
    
    # 添加数值标签
    for bar, time in zip(bars, response_times):
        height = bar.get_height()
        ax3.text(bar.get_x() + bar.get_width()/2., height + height*0.01,
                f'{time:.1f}', ha='center', va='bottom', fontsize=8)

ax3.grid(True, alpha=0.3)

函数解析:

  1. ax3.set_title():设置当前子图的标题

  2. ax3.bar():绘制柱状图

    • 参数1:x轴坐标(这里使用 range(len(candidates)) 生成连续整数)
    • 参数2:柱状图高度(响应时间数据)
    • color=colors:设置柱子颜色(最优平台用金色突出显示)
    • edgecolor='black':设置柱子边框颜色
    • alpha=0.7:设置透明度(0-1之间)
  3. 坐标轴设置:

    • ax3.set_xticks():设置x轴刻度位置
    • ax3.set_xticklabels():设置x轴刻度标签
      • rotation=45:标签旋转45度,避免重叠
    • ax3.set_ylabel():设置y轴标签
  4. 添加数据标签:

    • ax3.text():在指定位置添加文本
      • 参数1,2:文本位置坐标
      • 参数3:要显示的文本内容(格式化的响应时间)
      • ha='center':水平居中对齐
      • va='bottom':垂直底部对齐
  5. ax3.grid(True, alpha=0.3):显示网格线,alpha 设置网格线透明度

3.3 候选平台详细对比柱状图

# 总响应时间对比
colors1 = ['gold' if c == self.optimal_second_platform else 'lightcoral' 
          for c in candidates_sorted]
bars1 = ax1.bar(range(len(candidates_sorted)), total_times_sorted, 
               color=colors1, alpha=0.7, edgecolor='black')
ax1.set_title('候选平台总响应时间对比', fontweight='bold')
ax1.set_xlabel('候选平台')
ax1.set_ylabel('总响应时间')
ax1.set_xticks(range(len(candidates_sorted)))
ax1.set_xticklabels([f'路口{c}' for c in candidates_sorted], rotation=45)

# 添加数值标签
for bar, time in zip(bars1, total_times_sorted):
    height = bar.get_height()
    ax1.text(bar.get_x() + bar.get_width()/2., height + height*0.01,
            f'{time:.1f}', ha='center', va='bottom', fontsize=8)

这段代码与前面的柱状图绘制逻辑相似,但有几个值得注意的点:

  1. 数据排序:先对候选平台按响应时间排序,使图表更具可读性
  2. 颜色方案:使用不同的颜色方案区分不同类型的柱状图
  3. 同时展示了总响应时间和平均响应时间两组数据,便于对比分析

3.4 图表保存与显示

plt.tight_layout()
plt.savefig('大型分组双平台优化分析.png', dpi=300, bbox_inches='tight')
print("可视化图表已保存: 大型分组双平台优化分析.png")
plt.show()

函数解析:

  • plt.tight_layout():自动调整子图参数,使子图之间的布局更合理
  • plt.savefig():保存图表到文件
    • 参数1:文件名
    • dpi=300:设置图像分辨率(300dpi适合印刷)
    • bbox_inches='tight':去除图像周围的空白区域
  • plt.show():显示图表

四、热力图绘制简介

虽然提供的代码中没有热力图的实现,但热力图是另一种常用的可视化方式,通常用于展示数据的矩阵分布。以下是使用 Matplotlib 绘制热力图的基本示例:

import numpy as np
import matplotlib.pyplot as plt

# 生成示例数据
data = np.random.rand(10, 10)  # 10x10的随机数据矩阵

# 创建画布和子图
fig, ax = plt.subplots(figsize=(8, 6))

# 绘制热力图
heatmap = ax.imshow(data, cmap='viridis')

# 添加颜色条
cbar = plt.colorbar(heatmap)
cbar.set_label('数值强度')

# 设置标题和坐标轴标签
ax.set_title('热力图示例')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')

plt.tight_layout()
plt.show()

主要函数解析:

  • ax.imshow():绘制热力图,cmap 参数指定颜色映射方案
  • plt.colorbar():添加颜色条,用于解释颜色对应的数值

五、总结

本文以双平台优化算法代码为例,详细解析了使用 Matplotlib 绘制柱状图的方法和相关函数。主要知识点包括:

  1. 多子图布局的创建与管理
  2. 柱状图的绘制与样式设置
  3. 坐标轴标签和标题的设置
  4. 数据标签的添加方法
  5. 图表的保存与显示

通过灵活运用这些函数和技巧,可以创建出清晰、美观且信息丰富的数据可视化图表,为数据分析和决策提供有力支持。在实际应用中,还可以根据需求调整图表样式、颜色方案和布局,以达到最佳的可视化效果。


网站公告

今日签到

点亮在社区的每一天
去签到