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}")