Python 图表

Python 图表 #

主要用: matplotlib import matplotlib.pyplot as plt

堆叠图 #

    summery_one_offer_dict_by_install_date, install_datas_by_install_date_dict = await rc.calculate_offer_do_status(offer_id=offer_id)
    # 计算需要的行数和列数(每行4个图表)
    num_offers = len(summery_one_offer_dict_by_install_date.keys())
    num_cols = 3
    num_rows = math.ceil(num_offers / num_cols)
    # 创建一个图形和子图数组
    fig, axs = plt.subplots(num_rows, num_cols, figsize=(45, num_rows * 3))
    if num_offers == 1:
        axs = [axs]
    # Flatten the axs array for easy iteration
    else:
        axs = axs.flatten()
    for ax, (install_date, data) in zip(axs, summery_one_offer_dict_by_install_date.items()):
        # 排序和处理数据
        data = data.list_reten_info
        data.sort(key=lambda x: x.doreten_day)
        dates = [f"{entry.reten_day}/{entry.expect_rate}" for entry in data]
        reten_counts = [entry.count for entry in data]
        wait_counts = [entry.waitcount for entry in data]

        # 绘制堆叠条形图
        ax.bar(dates, reten_counts, label='Done&Run')
        ax.bar(dates, wait_counts, bottom=reten_counts, label='Wait')
        
        # 设置标题和标签
        ax.set_title(f'Reten for {install_date.strftime("%Y-%m-%d")}')
        ax.set_xlabel('Need Count')
        ax.set_ylabel('Plan Count')
        ax.legend()
        # 调整x轴标签间距
        ticks = range(len(dates))  # 根据实际的刻度位置生成刻度列表
        ax.set_xticks(ticks)
        ax.set_xticklabels(dates, rotation=60, ha='right')  # 设置x轴标签并旋转
    # # 自动格式化x轴日期标签
    # fig.autofmt_xdate()
    # 隐藏多余的子图(如果有)
    for i in range(num_offers, len(axs)):
        axs[i].axis('off')
    # 调整布局
    plt.tight_layout()
    img_path = f"reten_status_{offer_id}_plot.png"
    plt.savefig(img_path, dpi=300)
    plt.close()
    logger.info(f"img save to {img_path}")