from flask import Flask, render_template
from pyecharts import options as opts
from pyecharts.charts import Bar, Pie, Rose, Scatter
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
app = Flask(__name__)
# 任务一:条形图呈现"Top10城市商家数量"
@app.route("/task1")
def task1():
# 模拟数据
cities = ["北京", "上海", "广州", "深圳", "成都", "杭州", "重庆", "武汉", "西安", "苏州"]
counts = [12500, 11800, 9800, 9500, 8700, 8500, 8200, 8000, 7800, 7500]
# 打印控制台输出
print("==任务一:Top10城市商家数量==")
for i, (city, count) in enumerate(zip(cities, counts), 1):
print(f"=={i}.城市:{city},商家{count}个==")
# 创建条形图
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(cities)
.add_yaxis("商家数量", counts)
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(title="城市商家数量 Top10"),
xaxis_opts=opts.AxisOpts(name="商家数量"),
yaxis_opts=opts.AxisOpts(name="城市名称"),
)
)
return render_template("pyecharts.html", chart=bar.dump_options())
# 任务二:柱状图呈现审核效率
@app.route("/task2")
def task2():
# 模拟数据
auditors = ["A1001", "A1002", "A1003", "A1004", "A1005", "A1006", "A1007", "A1008", "A1009", "A1010"]
names = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"]
counts = [1250, 1180, 980, 950, 870, 850, 820, 800, 780, 750]
# 打印控制台输出
print("\n==任务二:Top10明星审核员==")
for i, (auditor, count) in enumerate(zip(auditors, counts), 1):
print(f"=={i}.二级审核人id:{auditor},审批数量:{count}条==")
# 创建柱状图
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(names)
.add_yaxis("审核记录数", counts)
.set_global_opts(
title_opts=opts.TitleOpts(title="Top10明星审核员"),
xaxis_opts=opts.AxisOpts(name="审核人姓名"),
yaxis_opts=opts.AxisOpts(name="审核记录数"),
)
)
return render_template("pyecharts.html", chart=bar.dump_options())
# 任务三:双饼图呈现业务包属性占比
@app.route("/task3")
def task3():
# 模拟数据
categories = ["大客户", "白领", "小客户", "高校", "家庭", "其他"]
beijing_data = [3200, 2800, 2500, 1800, 1500, 700]
shenzhen_data = [2800, 3100, 2200, 1600, 1200, 600]
# 打印控制台输出
print("\n==任务三:北京与深圳商户业务包属性占比==")
print("==北京:")
for i, (category, count) in enumerate(zip(categories, beijing_data), 1):
print(f"=={i}.商户业务包:{category},商家数量:{count}家==")
print("==深圳:")
for i, (category, count) in enumerate(zip(categories, shenzhen_data), 1):
print(f"=={i}.商户业务包:{category},商家数量:{count}家==")
# 创建双饼图
pie1 = (
Pie()
.add(
"北京",
[list(z) for z in zip(categories, beijing_data)],
center=["25%", "50%"],
radius=[30, 70],
)
.set_global_opts(title_opts=opts.TitleOpts(title="北京商户业务包属性占比"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)
pie2 = (
Pie()
.add(
"深圳",
[list(z) for z in zip(categories, shenzhen_data)],
center=["75%", "50%"],
radius=[30, 70],
)
.set_global_opts(title_opts=opts.TitleOpts(title="深圳商户业务包属性占比"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)
return render_template("pyecharts_dual.html", chart1=pie1.dump_options(), chart2=pie2.dump_options())
# 任务四:玫瑰图呈现投诉占比
@app.route("/task4")
def task4():
# 模拟数据
categories = ["大客户", "白领", "小客户", "高校", "家庭", "其他"]
complaints = [320, 280, 250, 180, 150, 70]
# 打印控制台输出
print("\n==任务四:北京商户业务包投诉占比==")
for i, (category, count) in enumerate(zip(categories, complaints), 1):
print(f"=={i}.商户业务包:{category},投诉数量:{count}家==")
# 创建玫瑰图
rose = (
Rose(init_opts=opts.InitOpts(width="800px", height="600px"))
.add(
"投诉数量",
[list(z) for z in zip(categories, complaints)],
radius=["30%", "75%"],
center=["50%", "50%"],
rosetype="radius",
)
.set_global_opts(title_opts=opts.TitleOpts(title="北京商户业务包投诉占比"))
)
return render_template("pyecharts.html", chart=rose.dump_options())
# 任务五:柱状堆叠图呈现审核结果比例
@app.route("/task5")
def task5():
# 模拟数据
auditors = ["A1001", "A1002", "A1003", "A1004", "A1005", "A1006", "A1007", "A1008", "A1009", "A1010"]
approved = [850, 780, 650, 620, 580, 550, 520, 500, 480, 450]
rejected = [400, 400, 330, 330, 290, 300, 300, 300, 300, 300]
# 打印控制台输出
print("\n==任务五:审核通过与拒绝对比==")
for i, (auditor, app, rej) in enumerate(zip(auditors, approved, rejected), 1):
total = app + rej
print(f"=={i}.二级审核人id:{auditor},审批数量:{total}条,其中通过{app}条,拒绝{rej}条==")
# 创建柱状堆叠图
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(auditors)
.add_yaxis("通过", approved, stack="stack1", itemstyle_opts=opts.ItemStyleOpts(color="#1E90FF"))
.add_yaxis("拒绝", rejected, stack="stack1", itemstyle_opts=opts.ItemStyleOpts(color="#FF4500"))
.set_global_opts(
title_opts=opts.TitleOpts(title="审核通过与拒绝对比"),
xaxis_opts=opts.AxisOpts(name="审核人id"),
yaxis_opts=opts.AxisOpts(name="审核记录数"),
)
)
return render_template("pyecharts.html", chart=bar.dump_options())
# 任务六:散点地图呈现各城市商家数量分布
@app.route("/task6")
def task6():
# 模拟数据
cities = ["北京", "上海", "广州", "深圳", "成都", "杭州", "重庆", "武汉", "西安", "苏州"]
counts = [12500, 11800, 9800, 9500, 8700, 8500, 8200, 8000, 7800, 7500]
geo_coords = {
"北京": [116.46, 39.92],
"上海": [121.48, 31.22],
"广州": [113.23, 23.16],
"深圳": [114.07, 22.62],
"成都": [104.06, 30.67],
"杭州": [120.19, 30.26],
"重庆": [106.54, 29.59],
"武汉": [114.31, 30.52],
"西安": [108.95, 34.27],
"苏州": [120.62, 31.32]
}
# 打印控制台输出
print("\n==任务六:各城市商家数量==")
for i, (city, count) in enumerate(zip(cities, counts), 1):
print(f"=={i}.城市:{city},商家{count}个==")
# 创建散点地图
scatter = (
Scatter(init_opts=opts.InitOpts(width="1000px", height="600px"))
.add_dataset(
source=[
{"name": city, "value": geo_coords[city] + [count]}
for city, count in zip(cities, counts)
]
)
.add(
series_name="商家数量",
symbol_size=JsCode(
"function(data) {return Math.sqrt(data[2]) / 5;}"
),
encode={"lng": 0, "lat": 1, "value": 2},
label_opts=opts.LabelOpts(
formatter=JsCode(
"function(data) {return data.name + ': ' + data.value[2];}"
)
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="各城市商家数量散点地图"),
visualmap_opts=opts.VisualMapOpts(
dimension=2,
min=min(counts),
max=max(counts),
range_text=["高", "低"],
is_piecewise=True,
pos_top="50",
pos_left="30",
),
)
)
return render_template("pyecharts.html", chart=scatter.dump_options())
@app.route("/")
def index():
return """
<h1>外卖平台数据分析可视化</h1>
<ul>
<li><a href="/task1">任务一: Top10城市商家数量(条形图)</a></li>
<li><a href="/task2">任务二: Top10明星审核员(柱状图)</a></li>
<li><a href="/task3">任务三: 北京与深圳商户业务包属性占比(双饼图)</a></li>
<li><a href="/task4">任务四: 北京商户业务包投诉占比(玫瑰图)</a></li>
<li><a href="/task5">任务五: 审核通过与拒绝对比(柱状堆叠图)</a></li>
<li><a href="/task6">任务六: 各城市商家数量散点地图</a></li>
</ul>
"""
if __name__ == "__main__":
app.run(debug=True)。显示这段代码的运行图片