鱼旧704 2025-11-24 14:39 采纳率: 0%
浏览 56

奥林匹克运动会数据第1关:使用饼图绘制获得金牌运动员年龄占比可视化——金牌年龄分布

奥林匹克运动会数据可视化——金牌年龄分布

第1关:使用饼图绘制获得金牌运动员年龄占比情况
任务描述
本关任务:使用饼图展示所有金牌运动员年龄占比情况。
最终结果图如下(此图为样图,仅供参考):

编程要求
项目框架已经搭建完成,现需要补充内容使得项目能够成功展示可视化图像。
在右侧编辑器切换不同文件,补充每个文件 Begin-End 区间的代码,使用饼图展示所有金牌运动员年龄占比情况,具体要求如下:

在 models.py 在编写代码,根据表 tb_gold_medal_age 创建数据模型。

在 views.py 中编写代码,当用户访问 http://localhost:8080/gold_medal_age 时,将数据传送到 gold_medal_age.html 页面的功能。

gold_medal_age.html 文件主要负责前端图表的渲染,文件中已经有一个 Echarts 模板,现在需要将后台传入的数据处理后放入模板中,可视化显示需要将人数转换为比例(可在后端或者前端处理),排序为年龄 id 依次显示,如模板中的顺序:

考核点说明
成功启动 Flask 程序;

模拟 HTTP 请求,访问 localhost:8080/gold_medal_age,将结果保存为图片进行对比,如果图片对比一致,则通关;反之,则未通关。

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-11-24 14:42
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    为了完成本关任务——使用饼图展示所有金牌运动员年龄占比情况,我们需要依次在以下三个文件中进行代码补充:

    • models.py:定义数据库模型;
    • views.py:处理请求并传递数据;
    • gold_medal_age.html:渲染 ECharts 饼图。

    ✅ 一、在 models.py 中创建数据模型

    📌 要求:

    根据表 tb_gold_medal_age 创建一个对应的 ORM 模型。

    ✅ 解决方案:

    # models.py
    
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    class GoldMedalAge(db.Model):
        __tablename__ = 'tb_gold_medal_age'
        
        id = db.Column(db.Integer, primary_key=True)
        age = db.Column(db.Integer, nullable=False)
        count = db.Column(db.Integer, nullable=False)
    

    说明:此模型对应数据库中的 tb_gold_medal_age 表,包含 agecount 字段,分别表示年龄和该年龄段获得金牌的人数。


    ✅ 二、在 views.py 中编写视图函数

    📌 要求:

    当用户访问 http://localhost:8080/gold_medal_age 时,将从数据库中获取金牌运动员的年龄分布数据,并将其传送到前端模板中。

    ✅ 解决方案:

    # views.py
    
    from flask import Flask, render_template
    from models import db, GoldMedalAge
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///olympic.db'  # 示例数据库
    db.init_app(app)
    
    @app.route('/gold_medal_age')
    def gold_medal_age():
        # 查询所有金牌运动员的年龄和人数
        data = GoldMedalAge.query.order_by(GoldMedalAge.id).all()
        
        # 将数据转换为列表格式(用于 ECharts)
        ages = [item.age for item in data]
        counts = [item.count for item in data]
        
        # 计算比例(可选:前端计算)
        total = sum(counts)
        percentages = [round((count / total) * 100, 2) for count in counts]
        
        return render_template('gold_medal_age.html', ages=ages, counts=counts, percentages=percentages)
    

    说明

    • 使用 order_by(GoldMedalAge.id) 确保按年龄 ID 排序;
    • 可以在后端或前端计算比例,此处我们选择在后端计算并传入模板;
    • render_template 将数据传递给前端页面。

    ✅ 三、在 gold_medal_age.html 中渲染 ECharts 饼图

    📌 要求:

    使用 ECharts 渲染饼图,显示金牌运动员的年龄占比。要求:

    • 年龄顺序与模板一致;
    • 数据格式正确;
    • 比例可以是百分比或数值。

    ✅ 解决方案:

    <!-- gold_medal_age.html -->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>金牌年龄分布</title>
        <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script>
    </head>
    <body>
        <div id="main" style="width: 600px; height: 400px;"></div>
        <script type="text/javascript">
            var chart = echarts.init(document.getElementById('main'));
    
            var option = {
                title: {
                    text: '金牌运动员年龄分布',
                    left: 'center'
                },
                tooltip: {
                    trigger: 'item'
                },
                legend: {
                    orient: 'vertical',
                    left: 'left'
                },
                series: [
                    {
                        name: '年龄',
                        type: 'pie',
                        radius: '50%',
                        data: [
                            {% for i in range(ages|length) %}
                                { value: {{ percentages[i] }}, name: '{{ ages[i] }}岁' },
                            {% endfor %}
                        ],
                        emphasis: {
                            itemStyle: {
                                shadowBlur: 10,
                                shadowOffsetX: 0,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                            }
                        }
                    }
                ]
            };
    
            chart.setOption(option);
        </script>
    </body>
    </html>
    

    说明

    • 使用 ECharts 的 pie 类型绘制饼图;
    • 使用 Jinja2 模板引擎动态插入数据;
    • percentages[i] 是计算后的百分比值,确保图表显示比例;
    • ages[i] 是年龄标签,如“20岁”、“25岁”等。

    ✅ 四、启动 Flask 应用并验证

    📌 步骤如下:

    1. 在终端运行以下命令初始化数据库(如果尚未创建):
    flask shell
    >>> from models import db
    >>> db.create_all()
    
    1. 启动 Flask 应用:
    python app.py
    
    1. 打开浏览器访问:
    http://localhost:8080/gold_medal_age
    
    1. 查看饼图是否正确显示金牌运动员的年龄占比。

    ✅ 五、测试与对比

    • 模拟 HTTP 请求:使用工具(如 Postman 或 curl)访问 http://localhost:8080/gold_medal_age
    • 保存图片:将页面截图保存为图片;
    • 对比图片:与标准答案图片进行对比,若一致则通关。

    ✅ 六、总结

    | 文件 | 功能描述 | |--------------|------------------------------------| | models.py | 定义数据库模型,映射 tb_gold_medal_age 表 | | views.py | 处理请求,查询数据并传送到前端 | | gold_medal_age.html | 使用 ECharts 渲染饼图,显示金牌年龄占比 |


    ✅ 七、完整项目结构建议

    project/
    │
    ├── app.py
    ├── models.py
    ├── views.py
    └── templates/
        └── gold_medal_age.html
    

    如有需要,我可以提供完整的 Flask 项目示例代码包,方便你快速搭建环境。是否需要?

    评论

报告相同问题?

问题事件

  • 创建了问题 11月24日