Python数据可视化实战:从Excel读取数据并生成图表

🎯 适合人群:Python初学者 / 有Java基础的开发者 ⏱️ 预计耗时:30分钟完成学习 + 实践


📚 学习目标

通过这个实战项目,你将掌握:

  1. Python读取Excel文件的方法
  2. Pandas数据处理基础
  3. Matplotlib图表绘制
  4. 与Java IO操作的对比理解

1️⃣ 环境准备

安装依赖库

# 创建虚拟环境(推荐)
python -m venv venv
source venv/bin/activate  # macOS/Linux
# venv\\Scripts\\activate   # Windows

# 安装必要的库
pip install pandas openpyxl matplotlib

依赖说明

| 库 | 作用 | Java类比 | |---|------|----------| | pandas | 数据处理 | 类似 Apache POI + Stream API | | openpyxl | 读写xlsx文件 | 类似 Apache POI | | matplotlib | 图表绘制 | 类似 JFreeChart |


2️⃣ 完整代码示例

📄 excel_to_chart.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Python Excel数据可视化实战
"""

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path

# ============================================================
# 第一部分:创建示例Excel文件
# ============================================================

def create_sample_excel(file_path: str) -> None:
    """
    创建示例Excel文件,包含销售数据
    """
    # 模拟月度销售数据
    data = {
        '月份': ['1月', '2月', '3月', '4月', '5月', '6月',
                 '7月', '8月', '9月', '10月', '11月', '12月'],
        '销售额': [12000, 15000, 18000, 16000, 22000, 25000,
                  28000, 26000, 24000, 30000, 32000, 35000],
        '成本': [8000, 10000, 12000, 11000, 15000, 17000,
                19000, 18000, 16000, 20000, 22000, 24000],
        '利润': [4000, 5000, 6000, 5000, 7000, 8000,
                9000, 8000, 8000, 10000, 10000, 11000],
        '部门': ['华东', '华东', '华南', '华南', '华北', '华北',
                '华东', '华东', '华南', '华南', '华北', '华北']
    }
    
    # 创建DataFrame
    df = pd.DataFrame(data)
    
    # 写入Excel
    df.to_excel(file_path, index=False, sheet_name='销售数据')
    print(f"✅ 示例Excel文件已创建:{file_path}")


# ============================================================
# 第二部分:读取Excel数据
# ============================================================

def read_excel_data(file_path: str) -> pd.DataFrame:
    """
    读取Excel文件数据
    """
    try:
        df = pd.read_excel(file_path, sheet_name='销售数据')
        
        print(f"📊 成功读取数据,共 {len(df)} 行,{len(df.columns)} 列")
        print(f"📋 列名:{list(df.columns)}")
        print(f"\\n📈 数据预览(前5行):")
        print(df.head())
        
        return df
        
    except FileNotFoundError:
        print(f"❌ 文件不存在:{file_path}")
        raise


# ============================================================
# 第三部分:数据处理
# ============================================================

def process_data(df: pd.DataFrame) -> dict:
    """
    数据处理和分析
    """
    processed = {}
    
    # 基础统计
    processed['total_sales'] = df['销售额'].sum()
    processed['total_profit'] = df['利润'].sum()
    processed['avg_sales'] = df['销售额'].mean()
    processed['profit_margin'] = (processed['total_profit'] / processed['total_sales']) * 100
    
    # 按部门分组统计
    processed['sales_by_dept'] = df.groupby('部门')['销售额'].sum()
    processed['profit_by_dept'] = df.groupby('部门')['利润'].sum()
    
    return processed


# ============================================================
# 第四部分:生成图表
# ============================================================

def create_charts(df: pd.DataFrame, processed: dict, output_dir: str) -> None:
    """
    生成多种图表
    """
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 图表1:月度销售额柱状图
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.bar(df['月份'], df['销售额'], color='#2E86AB', alpha=0.8)
    ax.set_title('月度销售额', fontsize=14, fontweight='bold')
    plt.tight_layout()
    plt.savefig(f'{output_dir}/01_月度销售额.png', dpi=150)
    plt.close()
    
    # 图表2:趋势折线图
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.plot(df['月份'], df['销售额'], 'o-', linewidth=2, markersize=8)
    ax.fill_between(df['月份'], df['销售额'], alpha=0.1)
    ax.set_title('销售额趋势', fontsize=14, fontweight='bold')
    plt.tight_layout()
    plt.savefig(f'{output_dir}/02_销售额趋势.png', dpi=150)
    plt.close()
    
    # 图表3:部门饼图
    fig, ax = plt.subplots(figsize=(8, 8))
    colors = ['#2E86AB', '#A23B72', '#F18F01']
    ax.pie(processed['sales_by_dept'], labels=processed['sales_by_dept'].index,
           autopct='%1.1f%%', colors=colors, shadow=True, startangle=90)
    ax.set_title('部门销售占比', fontsize=14, fontweight='bold')
    plt.tight_layout()
    plt.savefig(f'{output_dir}/03_部门占比.png', dpi=150)
    plt.close()
    
    print(f"📊 图表已保存到 {output_dir}/")


# ============================================================
# 主函数
# ============================================================

def main():
    print("=" * 50)
    print("🚀 Python Excel数据可视化实战")
    print("=" * 50)
    
    excel_input = 'data/sales_data.xlsx'
    chart_output = 'output/charts'
    
    Path('data').mkdir(exist_ok=True)
    
    # 创建示例数据
    if not Path(excel_input).exists():
        create_sample_excel(excel_input)
    
    # 读取数据
    df = read_excel_data(excel_input)
    
    # 数据处理
    processed = process_data(df)
    
    # 生成图表
    create_charts(df, processed, chart_output)
    
    print("\n✅ 完成!")


if __name__ == '__main__':
    main()

3️⃣ 运行方式

python excel_to_chart.py

4️⃣ Java vs Python 对比

| 操作 | Java (POI) | Python (pandas) | |------|-----------|------------------| | 读取Excel | 30+ 行代码 | 1行代码 | | 分组统计 | Stream + Collectors | df.groupby() | | 保存文件 | Workbook + 循环写入 | df.to_excel() |

Python的优势:代码量少、语法简洁、数据分析生态丰富


5️⃣ 总结

本文介绍了Python处理Excel数据并生成图表的完整流程:

  • 使用pandas读取和处理Excel数据
  • 使用matplotlib绘制多种图表
  • 代码简洁易懂,适合有Java基础的开发者学习

完整代码已提供,可直接运行!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐