python import matplotlib.pyplot as plt import numpy as np import pandas as pd import matplotlib.dates as mdates # 解决Matplotlib中文显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 1. 生成模拟时序数据 np.random.seed(42) dates = pd.date_range('2024-01-01', periods=30, freq='D') sales = np.random.normal(100, 15, 30).cumsum()# 累计销售额 users = np.random.randint(50, 200, 30).cumsum()# 累计用户 conversion = np.random.uniform(0.2, 0.4, 30)# 转化率 satisfaction = np.random.uniform(3.5, 4.8, 30)# 客户满意度 # 2. 创建2×2多子图画布 fig, axes = plt.subplots(2, 2, figsize=(14, 8), constrained_layout=True) ax = axes.flatten() # 3. 子图1:累计销售额(带峰值标注) ax[0].plot(dates, sales, 'o-', color='#2E86AB', linewidth=2, markersize=4) ax[0].set_title('📈 累计销售额', fontsize=12, fontweight='bold') ax[0].set_ylabel('万元') ax[0].grid(True, linestyle=':', alpha=0.5) # 标注销售峰值 max_sales = sales.max() max_idx = sales.idxmax() ax[0].annotate(f'Max: {max_sales:.0f}', xy=(dates[max_idx], max_sales), xytext=(5, 15), textcoords='offset points', arrowprops=dict(arrowstyle='->', color='darkred')) # 4. 子图2:累计用户数(双Y轴:累计用户+日新增用户) ax[1].plot(dates, users, 's-', color='#A23B72', linewidth=2) ax[1].set_title('👥 累计用户数', fontsize=12) ax[1].set_ylabel('累计用户') ax[1].grid(True, linestyle=':', alpha=0.5) # 新增右侧Y轴展示日新增数据 daily_new = np.random.randint(5, 30, 30) ax1_2 = ax[1].twinx() ax1_2.bar(dates, daily_new, alpha=0.3, color='gray', width=0.8, label='日新增') ax1_2.set_ylabel('日新增用户', color='gray') ax1_2.tick_params(axis='y', labelcolor='gray') # 5. 子图3:转化率(面积填充+均值参考线) ax[2].fill_between(dates, conversion, 0, color='#F18F01', alpha=0.3) ax[2].plot(dates, conversion, '-', color='#F18F01', linewidth=2) ax[2].set_title('🎯 转化率', fontsize=12) ax[2].set_ylabel('转化率') ax[2].set_ylim(0.15, 0.45) avg_conv = conversion.mean() ax[2].axhline(y=avg_conv, color='red', linestyle='--', label=f'均值={avg_conv:.2f}') ax[2].legend(loc='lower right') ax[2].grid(True, axis='y', linestyle=':') # 6. 子图4:客户满意度(基准参考线) ax[3].plot(dates, satisfaction, 'd-', color='#06A77D', linewidth=2) ax[3].set_title('⭐ 客户满意度', fontsize=12) ax[3].set_ylabel('分数 (1-5)') ax[3].set_ylim(3, 5) ax[3].axhline(y=4.0, color='gray', linestyle='--', linewidth=1, label='基准线4.0') ax[3].legend() ax[3].grid(True, linestyle=':', alpha=0.5) # 7. 全局统一格式化时间轴 for a in ax: a.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d')) a.xaxis.set_major_locator(mdates.DayLocator(interval=5)) a.tick_params(axis='x', rotation=45) # 8. 全局标题与保存 fig.suptitle('📊 2024年1月核心运营KPI趋势看板', fontsize=18, fontweight='bold', y=1.02) plt.savefig('kpi_dashboard_advanced.png', dpi=200, bbox_inches='tight') plt.show() |