此部分是完成上节课留下的尾巴

上节课的基础

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

import pymysql
import seaborn as sns

def get_database_connection():
    connection = pymysql.connect(host='192.168.120.129',
                                 user='xd',
                                 password='123',
                                 db='scores',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    return connection, connection.cursor()

def get_student_scores():
    conn, cursor = get_database_connection()
    try:
        cursor.execute("select * from student_scores;")
        # 一次性获取所有结果
        data = cursor.fetchall()
        # 将数据转换为 DataFrame
        df = pd.DataFrame(data)
        # 将"-4"替换为NaN
        df.replace(-4, np.nan, inplace=True)
        df.dropna(inplace=True)
        return df
    finally:
        conn.close()  # 关闭连接

def draw_kde(nj,bj):
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.figure(figsize=(8, 6))

    plt.xlabel('期中语文成绩')
    plt.ylabel('密度')
    plt.title('期中语文成绩分布图')
    plt.xlim(0,100) 


    # 绘制核密度估计曲线
    sns.kdeplot(
        data=nj,
        x="mid_term_chinese",
        label="语文期中考试成绩" ,
        color="blue",
    )

    sns.kdeplot(
        data=bj,
        x="mid_term_chinese",
        label="23401班语文期中考试成绩" , # 设置图例标签
        color='red',
        linestyle="--",  # 虚线
        alpha=0.5, 
    )
    # 绘制实际数据分布
    sns.rugplot(
        data=nj,
        x="mid_term_chinese",
        height=0.05,  # 控制 rug plot 的高度
        color="blue",
    )

    sns.rugplot(
        data=bj,
        x="mid_term_chinese",
        height=0.08,  # 控制 rug plot 的高度
        color="red",
        alpha=0.5, 
    )

    nj_mean=nj['mid_term_chinese'].mean()
    bj_mean=bj['mid_term_chinese'].mean()

    plt.axvline(nj_mean, color="blue",linestyle=":")
    plt.text(nj_mean+2,0.022, '年级语文平均成绩:%.1f' %(nj_mean),color="blue",)

    plt.axvline(bj_mean, color="red",linestyle=":")
    plt.text(bj_mean+3,0.024, '23401语文平均成绩:%.1f' %(bj_mean),color="red",)
    plt.grid(True)
    plt.show()

df = get_student_scores()
mid_chinese=df[['class','name','mid_term_chinese']]
mid_chinese_23401=mid_chinese[mid_chinese['class']=='23401']
draw_kde(mid_chinese,mid_chinese_23401)

本次课程需要,使得代码能够灵活的选择绘制班级。并且能将图片进行存储。

本课需要实现的功能

通过用户输入决定程序响应

通过用户输入决定程序响应

使用python的questionary库

questionary库介绍

questionary 是一个用于创建命令行交互式提示的 Python 库。它提供了一种简单而强大的方式来与用户进行交互,并从用户那里获取输入。下面是一些 questionary 库的特点和功能:

  • 简单易用questionary 提供了一个直观的 API,使得创建各种类型的交互式提示变得非常简单。

  • 多种类型的问题:它支持多种类型的问题,包括选择题、多选题、文本输入、密码输入等。

  • 丰富的选项:对于每种类型的问题,您都可以指定许多选项,例如选项列表、默认值、验证器等。

  • 自定义外观:您可以自定义提示的外观,包括提示文字、选项的样式等,以便与您的应用程序风格相匹配。

步骤一:引入库

需要安装,下载库:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxxxxxx

from questionary import select

步骤二:创建选择

question = select("选择分析的班级:", choices=["23401", "23402", "23403"])

步骤四:获取用户选择

choice_class = question.ask()
print("您选择的班级是:", choice_class)

步骤五:根据选择,调整整个代码

draw_kde函数当前存在一定问题,其中的label显示的文本是固定死的,需要随着选项进行改变。

修改draw_kde函数,使其支持显示选项改变

主程序部分:

draw_kde(mid_chinese, mid_chinese_23401,choice_class)

函数修改:

def draw_kde(nj, bj,class_name):
    # ......
    sns.kdeplot(
        data=bj,
        x="mid_term_chinese",
        label=class_name+"班语文期中考试成绩",  # 设置图例标签
        color='red',
        linestyle="--",  # 虚线
        alpha=0.5,
    )
    # ......
    
    plt.text(bj_mean + 3, 0.024, class_name+'班语文平均成绩:%.1f' % (bj_mean), color="red", )
    # ......

步骤六:结果保存

当程序调试完成后,不再显示图片(显示图会影响程序执行效率)
改为将图片进行保存。
使用plt.savefig()实现,很简单括号里放路径和文件名

   # plt.show()
   plt.savefig(class_name+'.png')