【数据可视化】大作业(意向考研高校的数据可视化)

news2024/9/21 0:44:16

文章目录

  • 前言
  • 一、数据介绍
    • 1.1 基本信息
    • 1.2 考研信息
    • 1.3 导师信息
  • 二、预处理及分析
    • 2.1 数据预处理
      • 2.1.1 考研信息预处理
      • 2.1.2 导师信息预处理
    • 2.2 数据分析
  • 三、可视化方法及结果
    • 3.1 可视化方法
    • 3.2 可视化结果展示
      • 3.2.1 基本信息
      • 3.2.2 考研信息
      • 3.2.3 导师信息
  • 四、总结
  • 五、附录


前言

  • 将该高校的地理位置以地图的形式展示。
  • 将该高校近几年计算机相关专业的考研(或高考)录取成绩、人数信息,专业师资队伍,考试科目及内容等等以合适的柱状图、折线图、饼图等方式表示出来,图表能够清晰得呈现不同数据的变化,使得观察图表的人能够迅速得获取信息。
    • 录取成绩、录取人数信息、专业师资队伍
    • 柱状图、折线图、饼图
  • 对个人感兴趣的导师、研究方向等多属性、多维度、多关系数据选用关系、词云等可视化方法,使数据清晰有效地表达。
    • 研究方向(关系+词云)
  • 其它自由发挥部分

一、数据介绍

1.1 基本信息

  • 学校名称:山东理工大学
  • 地理位置:山东省淄博市,北纬36.810315,东经117.999601
  • 院校:计算机科学与技术学院

1.2 考研信息

  • 下载相关信息:2020考研拟录取名单:山东理工大学2020年硕士研究生拟录取名单
  • PDF识别为Excel:PDF在线转换工具、WPS会员(钞能力)、python

通过网络搜集2020-2022年,山东理工大学计算机科学与技术专业(学硕+专硕)第一志愿录取情况信息,具体信息包括:复试学院代码,复试学院,姓名,初试考试编号,复试专业代码,复试专业名称,研究方向代码,学习形式,一志愿/调剂,初试成绩,综合面试成绩",总成绩,排名,录取结果,备注。需要注意的是该数据并非来自官网(学校官网信息已关闭),在数据结果上存在误差。

import PyPDF2
import pytesseract
import pandas as pd
import os

# 设置OCR引擎(如果需要)
# pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'  # 指定Tesseract OCR引擎的路径

# 将PDF文件转换为文本
def pdf_to_text(pdf_path):
    text = ""
    with open(pdf_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        num_pages = len(reader.pages)
        for page in range(num_pages):
            pdf_page = reader.pages[page]
            text += pdf_page.extract_text()
    return text

# 使用OCR识别文本
def ocr_text(image_path):
    text = pytesseract.image_to_string(image_path)
    return text

# 将文本保存为Excel文件
def save_text_as_excel(text, output_path):
    lines = text.split('\n')
    data = [line.split() for line in lines if line.strip()]
    df = pd.DataFrame(data)
    df.to_excel(output_path, index=False)

# 主函数
def pdf_to_excel(pdf_folder, output_folder):
    pdf_files = [f for f in os.listdir(pdf_folder) if f.endswith('.pdf')]

    for pdf_file in pdf_files:
        pdf_path = os.path.join(pdf_folder, pdf_file)
        text = pdf_to_text(pdf_path)

        # 使用OCR识别文本(如果需要)
        # image_path = 'image.png'  # 将PDF转换为图像文件(可选)
        # text = ocr_text(image_path)

        excel_file = pdf_file.replace('.pdf', '.xlsx')
        output_path = os.path.join(output_folder, excel_file)
        save_text_as_excel(text, output_path)

    print("转换完成!")

# 调用函数进行转换
pdf_folder = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/'
output_folder = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Output/'
pdf_to_excel(pdf_folder, output_folder)

在这里插入图片描述

  • 其他相关信息:
  • (104)山东理工大学2020计算机考研数据速览
  • (189)山东理工大学2021计算机考研数据速览,专硕复试线299分,学硕接收调剂
  • (112)山东理工大学22计算机考研数据速览,学硕接收调剂

1.3 导师信息

通过山东理工大学计算机科学与技术学院官网,搜集获取研究生导师信息。

  • 获取信息:姓名、职位、主要学习工作简历、主要研究方向、社会兼职及荣誉称号、主讲课程及主要教学奖励、主要科研成果及奖励
  • 爬取代码:导师队伍
import time
import requests
from lxml import etree
import pandas as pd

def scrape_website(url, dataframe):
    # 发起HTTP请求获取网页内容
    response = requests.get(url)

    # 检查请求是否成功
    if response.status_code == 200:
        # 使用lxml库解析网页内容
        html = response.text
        tree = etree.HTML(html)

        # 创建字典来存储爬取的数据
        data = {}

        # 基本信息
        item1 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[1]/div[2]/h2//text()')
        item2 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[1]/div[2]/h3//text()')
        data['Item 1'] = item1
        data['Item 2'] = item2

        # 主要学习工作简历
        data1 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[2]/div/p//text()')
        data['Main Education and Work Experience'] = data1

        # 主要研究方向
        data2 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[3]/div/p//text()')
        data['Main Research Areas'] = data2

        # 社会兼职及荣誉称号
        data3 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[4]/div/p//text()')
        data['Social Positions and Honors'] = data3

        # 主讲课程及主要教学奖励
        data4 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[5]/div/p//text()')
        data['Main Courses and Teaching Awards'] = data4

        # 主要科研成果及奖励
        data5 = tree.xpath('/html/body/div[4]/div/div[2]/div/div[6]/div/p//text()')
        data['Main Research Achievements and Awards'] = data5

        # 将数据转换为DataFrame并添加到现有DataFrame中
        new_dataframe = pd.DataFrame([data])
        dataframe = pd.concat([dataframe, new_dataframe], ignore_index=True)

        return dataframe

    else:
        print("请求失败")

def scrape_url(url):
    # 发起HTTP请求获取网页内容
    response = requests.get(url)

    # 检查请求是否成功
    if response.status_code == 200:
        # 使用lxml库解析网页内容
        html = response.text
        tree = etree.HTML(html)
        # 提取所有链接
        links = tree.xpath('//*[@id="wp_content_w3_0"]//@href')
        for link in links:
            print("链接:", link)
        return links
    else:
        print("请求失败")

# 创建空的DataFrame来存储导师信息
df = pd.DataFrame()

# 调用爬虫函数
links = scrape_url("https://jsjxy.sdut.edu.cn/7534/list.htm")
for link in links:
    print(link)
    df = scrape_website(link, df)
    time.sleep(1)

# 删除JSON格式的数据
df = df.applymap(lambda x: ', '.join(x) if isinstance(x, list) else x)

# 将整理好的数据保存到Excel文件
df.to_excel("导师信息.xlsx", index=False)

print('########################### Over  ###########################')
  • 数据展示:
    在这里插入图片描述

二、预处理及分析

2.1 数据预处理

2.1.1 考研信息预处理

  • 删除标题
  • 删除空数据
  • 处理重复数据
  • 筛选复试学院为"计算机科学与技术数据" | “计算机学院” 的数据
  • 数据分别保存到三个Excel文件中,分别命名为“2020jsj”、“2021jsj”、“2022jsj”
import pandas as pd

# 读取数据文件
data_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020year.xlsx", "2021year.xlsx", "2022year.xlsx"]
save_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

for i in range(len(file_names)):
    file_path = data_path + file_names[i]
    save_path = data_path + save_names[i]

    # 读取Excel文件
    df = pd.read_excel(file_path)

    # 筛选条件
    condition = ((df["复试学院"] == "计算机学院") | (df["复试学院"] == "计算机科学与技术学院"))

    # 根据条件筛选数据
    filtered_data = df[condition]

    # 保存筛选后的数据到新的Excel文件
    filtered_data.to_excel(save_path, index=False)

在这里插入图片描述

针对部分PDF转Excel识别不规范处理:

  • 根据“序号”一列将所有数据添加到新的excel表格中,如果“序号”对应的数据为非数字或空则跳过
import pandas as pd

# 读取原始Excel文件
file_path = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2020year.xlsx'
df = pd.read_excel(file_path)

# 新建Excel文件
new_file_path = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/new_data.xlsx'
new_df = pd.DataFrame(columns=df.columns)  # 使用原始Excel文件的表头创建新的DataFrame

# 根据"序号"一列添加数据
for index, row in df.iterrows():
    value = row['序号']
    if pd.notnull(value) and str(value).isdigit():
        new_df = new_df._append(row)

# 将数据保存到新的Excel文件
new_df.to_excel(new_file_path, index=False)

2.1.2 导师信息预处理

  • 删除空数据
  • 处理重复数据
  • 切分数据
import pandas as pd
import re

# 读取Excel文件
file_path = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/导师信息.xlsx'
df = pd.read_excel(file_path)

# 删除空数据
df = df.dropna(how='all')

# 处理重复数据
df = df.drop_duplicates()

# 创建新的Excel文件
output_file = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/导师信息处理后.xlsx'
writer = pd.ExcelWriter(output_file, engine='xlsxwriter')

# 处理每个导师的信息
for index, row in df.iterrows():
    # 获取导师名称
    teacher_name = row['Item 1']

    # 创建以导师名称命名的工作表
    teacher_sheet = writer.book.add_worksheet(teacher_name)

    # 添加表头信息
    headers = ['姓名', '职位', '主要学习工作简历', '主要研究方向', '社会兼职及荣誉称号', '主讲课程及主要教学奖励',
               '主要科研成果及奖励']
    for col_index, header in enumerate(headers):
        teacher_sheet.write(0, col_index, header)

    # 将每一列的数据按照“,”“、”“;”进行切分,并保存到新的工作表中
    for col_index, value in enumerate(row):
        if pd.notnull(value):
            data_list = [x.strip() for x in re.split('[,、;]', str(value))]
            for i, data in enumerate(data_list):
                teacher_sheet.write(i + 1, col_index, data)

# 保存并关闭Excel文件
writer._save()

  • 处理结果:
    在这里插入图片描述

预处理后的数据仍有部分存在,手工处理后获得数据plus
数据内容:姓名、职位、主要学习工作简历、主要研究方向、社会兼职及荣誉称号、主讲课程

2.2 数据分析


三、可视化方法及结果

3.1 可视化方法

  • 地理位置展示:pyecharts地图展示工具
  • 2020-2022年一志愿录取成绩
    • 2020-2022年分数分布图:初试成绩、综合面试成绩、总成绩(柱形图)
    • 2020-2022年分数分分布饼图:初试成绩、综合面试成绩、总成绩(饼图-轮播图)
    • 2020-2022年最低分、最高分对比:初试成绩、综合面试成绩、总成绩(箱线图)
  • 2020-2022年一志愿人数信息:参与一志愿人数、录取人数变化图(折线图)
  • 考试科目及内容:Excel表格截图
  • 专业师资队伍:研究方向(关系图+词云图)

3.2 可视化结果展示

3.2.1 基本信息

  • 地理位置
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType


def test_geo():
    g = Geo()
    # 选择要显示的地图
    g.add_schema(maptype="山东")
    # 使用add_coordinate(name, lng, lat)添加坐标点和坐标名称
    g.add_coordinate('山东理工大学', 117.999601, 36.810315)
    # 给上面的坐标点添加数据,
    data_pair = [('山东理工大学', 10)]
    # 将数据添加到定义的地图上
    g.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=5)
    # 设置样式
    g.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
    return g


g = test_geo()
# 渲染成html,保存在代码文件的相同目录下
g.render('坐标标注.html')

在这里插入图片描述

3.2.2 考研信息

2020-2022年分数分布图:初试成绩、综合面试成绩、总成绩(柱形图)

  • 初试成绩分布
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts

# 文件路径和文件名
file_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

# 分数段
score_ranges = [225, 250, 275, 300, 325, 350, 375, 400, 425]

# 存储每个分数段的人数
score_counts = [[0] * (len(score_ranges) - 1) for _ in range(len(file_names))]

# 遍历文件进行统计
for idx, file_name in enumerate(file_names):
    file = file_path + file_name
    df = pd.read_excel(file)

    # 获取初试成绩列数据
    scores = df["初试成绩"]

    # 统计每个分数段的人数
    for score in scores:
        for i in range(len(score_ranges) - 1):
            if score_ranges[i] <= score < score_ranges[i + 1]:
                score_counts[idx][i] += 1
                break

# 绘制柱状图
bar = (
    Bar()
    .add_xaxis([str(range_start) + '-' + str(range_end) for range_start, range_end in zip(score_ranges[:-1], score_ranges[1:])])
)

# 添加不同年份的数据系列
for idx, file_name in enumerate(file_names):
    bar.add_yaxis(file_name[:-5], score_counts[idx], stack="stack{}".format(idx))

# 设置全局选项
bar.set_global_opts(
    title_opts=opts.TitleOpts(title="初试成绩分布"),
    xaxis_opts=opts.AxisOpts(name="分数段"),
    yaxis_opts=opts.AxisOpts(name="人数"),
)

# 渲染图表
bar.render("score_distribution.html")

在这里插入图片描述

  • 综合面试成绩分布
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts

# 文件路径和文件名
file_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

# 分数段
score_ranges = list(range(70, 91, 2))

# 存储每个分数段的人数
score_counts = [[0] * (len(score_ranges) - 1) for _ in range(len(file_names))]

# 遍历文件进行统计
for idx, file_name in enumerate(file_names):
    file = file_path + file_name
    df = pd.read_excel(file)

    # 获取综合面试成绩列数据
    scores = df["综合面试成绩"]

    # 统计每个分数段的人数
    for score in scores:
        for i in range(len(score_ranges) - 1):
            if score_ranges[i] <= score < score_ranges[i + 1]:
                score_counts[idx][i] += 1
                break

# 绘制柱状图
bar = (
    Bar()
    .add_xaxis([str(range_start) + '-' + str(range_end) for range_start, range_end in zip(score_ranges[:-1], score_ranges[1:])])
)

# 添加不同年份的数据系列
for idx, file_name in enumerate(file_names):
    bar.add_yaxis(file_name[:-5], score_counts[idx], stack="stack{}".format(idx))

# 设置全局选项
bar.set_global_opts(
    title_opts=opts.TitleOpts(title="综合面试成绩分布"),
    xaxis_opts=opts.AxisOpts(name="分数段"),
    yaxis_opts=opts.AxisOpts(name="人数"),
)

# 渲染图表
bar.render("综合面试成绩分布.html")

在这里插入图片描述

  • 总成绩分布
import pandas as pd
from pyecharts.charts import Bar
from pyecharts import options as opts

# 文件路径和文件名
file_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

# 分数段
score_ranges = list(range(60, 82, 2))

# 存储每个分数段的人数
score_counts = [[0] * (len(score_ranges) - 1) for _ in range(len(file_names))]

# 遍历文件进行统计
for idx, file_name in enumerate(file_names):
    file = file_path + file_name
    df = pd.read_excel(file)

    # 获取总成绩列数据
    total_scores = df["总成绩"]

    # 统计每个分数段的人数
    for score in total_scores:
        for i in range(len(score_ranges) - 1):
            if score_ranges[i] <= score < score_ranges[i + 1]:
                score_counts[idx][i] += 1
                break

# 绘制柱状图
bar = (
    Bar()
    .add_xaxis([str(range_start) + '-' + str(range_end) for range_start, range_end in zip(score_ranges[:-1], score_ranges[1:])])
)

# 添加不同年份的数据系列
for idx, file_name in enumerate(file_names):
    bar.add_yaxis(file_name[:-5], score_counts[idx], stack="stack{}".format(idx))

# 设置全局选项
bar.set_global_opts(
    title_opts=opts.TitleOpts(title="总成绩分布"),
    xaxis_opts=opts.AxisOpts(name="分数段"),
    yaxis_opts=opts.AxisOpts(name="人数"),
)

# 渲染图表
bar.render("总成绩分布.html")

在这里插入图片描述

2020-2022年分数分分布饼图:初试成绩、综合面试成绩、总成绩(饼图)

  • 初试成绩
import pandas as pd
from pyecharts.charts import Pie, Timeline
from pyecharts import options as opts

# 文件路径和文件名
file_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

# 分数段
score_ranges = list(range(225, 425, 25))  # Updated score ranges

# 存储每个分数段的人数
score_counts = [[0] * (len(score_ranges) - 1) for _ in range(len(file_names))]

# 遍历文件进行统计
for idx, file_name in enumerate(file_names):
    file = file_path + file_name
    df = pd.read_excel(file)

    # 获取初试成绩列数据
    initial_scores = df["初试成绩"]

    # 统计每个分数段的人数
    for score in initial_scores:
        for i in range(len(score_ranges) - 1):
            if score_ranges[i] <= score < score_ranges[i + 1]:
                score_counts[idx][i] += 1
                break

# 创建时间轴图表
timeline = Timeline()

# 遍历不同时间的数据
for idx, file_name in enumerate(file_names):
    # 创建饼图
    pie = (
        Pie()
        .add(
            series_name="分数段",
            data_pair=[(str(range_start) + '-' + str(range_end), count) for range_start, range_end, count in zip(score_ranges[:-1], score_ranges[1:], score_counts[idx])],
            radius="50%"
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .set_global_opts(title_opts=opts.TitleOpts(title="初试成绩分布"), legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_right="2%"))
    )

    # 添加当前时间的图表到时间轴
    timeline.add(pie, file_name[:-5])

# 渲染图表
timeline.render("初试成绩分布Pie.html")

在这里插入图片描述

  • 综合面试成绩
import pandas as pd
from pyecharts.charts import Pie, Timeline
from pyecharts import options as opts

# 文件路径和文件名
file_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

# 分数段
score_ranges = list(range(60, 91, 5))  # Updated score ranges

# 存储每个分数段的人数
score_counts = [[0] * (len(score_ranges) - 1) for _ in range(len(file_names))]

# 遍历文件进行统计
for idx, file_name in enumerate(file_names):
    file = file_path + file_name
    df = pd.read_excel(file)

    # 获取综合面试成绩列数据
    interview_scores = df["综合面试成绩"]

    # 统计每个分数段的人数
    for score in interview_scores:
        for i in range(len(score_ranges) - 1):
            if score_ranges[i] <= score < score_ranges[i + 1]:
                score_counts[idx][i] += 1
                break

# 创建时间轴图表
timeline = Timeline()

# 遍历不同时间的数据
for idx, file_name in enumerate(file_names):
    # 创建饼图
    pie = (
        Pie()
        .add(
            series_name="分数段",
            data_pair=[(str(range_start) + '-' + str(range_end), count) for range_start, range_end, count in zip(score_ranges[:-1], score_ranges[1:], score_counts[idx])],
            radius="50%"
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .set_global_opts(title_opts=opts.TitleOpts(title="综合面试成绩分布"), legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_right="2%"))
    )

    # 添加当前时间的图表到时间轴
    timeline.add(pie, file_name[:-5])

# 渲染图表
timeline.render("综合面试成绩分布Pie.html")

在这里插入图片描述

  • 总成绩
import pandas as pd
from pyecharts.charts import Pie, Timeline
from pyecharts import options as opts

# 文件路径和文件名
file_path = "/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/"
file_names = ["2020jsj.xlsx", "2021jsj.xlsx", "2022jsj.xlsx"]

# 分数段
score_ranges = list(range(60, 80, 5))  # Updated score ranges

# 存储每个分数段的人数
score_counts = [[0] * (len(score_ranges) - 1) for _ in range(len(file_names))]

# 遍历文件进行统计
for idx, file_name in enumerate(file_names):
    file = file_path + file_name
    df = pd.read_excel(file)

    # 获取总成绩列数据
    total_scores = df["总成绩"]

    # 统计每个分数段的人数
    for score in total_scores:
        for i in range(len(score_ranges) - 1):
            if score_ranges[i] <= score < score_ranges[i + 1]:
                score_counts[idx][i] += 1
                break

# 创建时间轴图表
timeline = Timeline()

# 遍历不同时间的数据
for idx, file_name in enumerate(file_names):
    # 创建饼图
    pie = (
        Pie()
        .add(
            series_name="分数段",
            data_pair=[(str(range_start) + '-' + str(range_end), count) for range_start, range_end, count in zip(score_ranges[:-1], score_ranges[1:], score_counts[idx])],
            radius="50%"
        )
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .set_global_opts(title_opts=opts.TitleOpts(title="总成绩分布"), legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_right="2%"))
    )

    # 添加当前时间的图表到时间轴
    timeline.add(pie, file_name[:-5])

# 渲染图表
timeline.render("总成绩分布Pie.html")

在这里插入图片描述

2020-2022年一志愿人数信息:参与一志愿人数、录取人数变化图(折线图)

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line

# 读取Excel文件
df_2020 = pd.read_excel('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2020jsj.xlsx')
df_2021 = pd.read_excel('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2021jsj.xlsx')
df_2022 = pd.read_excel('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2022jsj.xlsx')

# 计算总人数和录取人数
total_counts = [len(df_2020), len(df_2021), len(df_2022)]
admitted_counts = [
    len(df_2020[df_2020['录取结果'] == '拟录取']),
    len(df_2021[df_2021['录取结果'] == '拟录取']),
    len(df_2022[df_2022['录取结果'] == '拟录取'])
]

# 创建折线图
line = (
    Line()
    .add_xaxis(['2020', '2021', '2022'])
    .add_yaxis('总人数', total_counts, markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]))
    .add_yaxis('录取人数', admitted_counts, markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]))
    .set_global_opts(title_opts=opts.TitleOpts(title='总人数和录取人数变化折线图'),
                     yaxis_opts=opts.AxisOpts(name='人数'),
                     xaxis_opts=opts.AxisOpts(name='年份'))
)

# 保存为HTML文件并在浏览器中打开
line.render('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/录取人数变化.html')

在这里插入图片描述

2020-2022年最低分、最高分对比:初试成绩、综合面试成绩、总成绩(箱线图)

import pandas as pd
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'

# 读取数据
data_2020 = pd.read_excel('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2020jsj.xlsx').dropna()
data_2021 = pd.read_excel('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2021jsj.xlsx').dropna()
data_2022 = pd.read_excel('/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/2022jsj.xlsx').dropna()

# 提取所需的列数据
score_2020 = data_2020['初试成绩']
score_2021 = data_2021['初试成绩']
score_2022 = data_2022['初试成绩']

interview_2020 = data_2020['综合面试成绩']
interview_2021 = data_2021['综合面试成绩']
interview_2022 = data_2022['综合面试成绩']

total_2020 = data_2020['总成绩']
total_2021 = data_2021['总成绩']
total_2022 = data_2022['总成绩']

# 绘制箱线图
plt.figure(figsize=(10, 6))

# 初试成绩对比图
plt.subplot(1, 3, 1)
plt.boxplot([score_2020, score_2021, score_2022])
plt.xticks([1, 2, 3], ['2020', '2021', '2022'])
plt.title('初试成绩')

# 综合面试成绩对比图
plt.subplot(1, 3, 2)
plt.boxplot([interview_2020, interview_2021, interview_2022])
plt.xticks([1, 2, 3], ['2020', '2021', '2022'])
plt.title('综合面试成绩')

# 总成绩对比图
plt.subplot(1, 3, 3)
plt.boxplot([total_2020, total_2021, total_2022])
plt.xticks([1, 2, 3], ['2020', '2021', '2022'])
plt.title('总成绩')

plt.tight_layout()
plt.show()


在这里插入图片描述

3.2.3 导师信息

  • 导师对应研究方向
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'

# 读取Excel文件
file_path = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/导师信息处理plus.xlsx'
df = pd.read_excel(file_path, sheet_name=None)

# 创建空的有向图
graph = nx.DiGraph()

# 添加导师和研究方向节点
for sheet_name, sheet_data in df.items():
    tutor_name = sheet_name
    research_directions = sheet_data['主要研究方向'].dropna().tolist()

    # 添加导师节点
    graph.add_node(tutor_name, node_type='tutor')

    # 添加研究方向节点
    for direction in research_directions:
        graph.add_node(direction, node_type='research_direction')

        # 添加导师与研究方向之间的边
        graph.add_edge(tutor_name, direction)

# 绘制关系图
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(graph, seed=42)
node_colors = {'tutor': 'lightblue', 'research_direction': 'lightgreen'}

nx.draw_networkx_nodes(graph, pos, node_color=[node_colors[graph.nodes[node]['node_type']] for node in graph.nodes()])
nx.draw_networkx_labels(graph, pos, font_size=10, font_color='black')
nx.draw_networkx_edges(graph, pos, arrowstyle='->', arrowsize=10)

plt.axis('off')
plt.show()

在这里插入图片描述

  • 研究方向词云图
import pandas as pd
from collections import Counter
from pyecharts import options as opts
from pyecharts.charts import WordCloud

# 读取Excel文件
file_path = '/Users/liuhao/MyProject/PycharmProject/DataVisualization/Project1/Data/导师信息处理plus.xlsx'
df = pd.read_excel(file_path, sheet_name=None)

# 统计研究方向出现的次数
research_directions = []
for sheet_name, sheet_data in df.items():
    research_directions.extend(sheet_data['主要研究方向'].dropna().tolist())

research_direction_counts = Counter(research_directions)

# 生成词云图数据
wordcloud_data = [(key, value) for key, value in research_direction_counts.items()]

# 创建词云图
wordcloud = (
    WordCloud()
    .add(series_name="研究方向", data_pair=wordcloud_data, word_size_range=[20, 100])
    .set_global_opts(title_opts=opts.TitleOpts(title="研究方向词云图"))
)

# 渲染词云图到HTML文件中
wordcloud.render("wordcloud.html")

在这里插入图片描述


四、总结

本项目使用Python网络爬虫、Pandas、Pyecharts、matplotlib等工具完成对山东理工大学计算机科学与技术专业考研信息及导师信息的手机与展示。展现了2020-2022年共三年该专业的考研录取信息并进行分析,
通过本项目,熟练掌握了对网络数据的爬取,数据的可视化展示,能够熟练运用Pandas等数据处理工具对数据进行简单预处理,能够熟练使用pyecharts、matplotlib等数据可视化工具,通过使用柱状图、折线图、饼图、箱线图、关系图、词云图等展示形式,对数据进行可视化展示。


五、附录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pip install安装CPM-Bee出现ModuleNotFoundError: No module named ‘torch‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

WPF开发txt阅读器18:用json格式存储配置文件

文章目录 json参数保存 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录&#x1f48e;快捷键翻页字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进…

网工大题题型总结(2)---设备类型及设备故障问题

&#xff08;一&#xff09;设备选择 2018年上半年 试题一 根据表 1-1 及图 1-1 可知&#xff0c;在图 1-1 中为了保护内部网络&#xff0c;实现包过滤功能&#xff0c;位置A 应部署(6)设备&#xff0c;其工作在(7)模式. &#xff08;6&#xff09;防火墙 &#xff08;7&a…

AIGC教育(续篇):探索掌握AIGC,引领未来的人才之路

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 1 未来人才的核心竞争力&#xff1a; 蓬勃绽放的潜力 展望未来&#xff0c;我们不禁思考&#xff1a;当自动化工具日益普及&#xff0c;且代替人力的成本并不高昂时&#xff0c;每个人的工具属性在未来工作中所占比重必…

Git提交规范

目录 1、commit message format消息格式 2、还原 3、提交类型 4、Subject 5、Body 6、Footer 7、git-commit-plugin 插件 以下规范参考Angular提交的规范。 对于如何格式化git commit消息&#xff0c;我们有非常精确的规则。 这导致更多 在浏览项目历史时&#xff0c;易…

【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 这个 Bug 是我做这个工程时遇到的&#xff1a;【Visual Studio】Qt 的实时绘图曲线功能&#xff0c;使用 C 语言&#xff0c;配合 Qt 开发串口通信界面。 文…

【面试】标准库相关题型(一)

文章目录 1. vector底层实现原理1.1 类构成1.2 构造函数1.3 插入元素1.4 删除元素1.5 读取元素1.6 修改元素1.7 释放空间 2. vector内存增长机制2.1 特点2.2 内存增长特性2.3 内存增长过程2.4 内存清理2.5 注意事项 3. vector中reserve和resize的区别3.1 共同点3.2 区别3.3 应用…

LangChain入门介绍

原文首发于博客文章LangChain介绍 我们先看看官方的定义 LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序&#xff1a; 数据感知&#xff1a;将语言模型连接到其他数据源自主性&#xff1a;允许语言模型与其环境进行交互 LangChain的主要价值在于&…

现在可以使用开发者工具为苹果Vision Pro创建空间体验

库比蒂诺&#xff0c;加利福尼亚—苹果公司今天宣布&#xff0c;全新的软件工具及技术现已可供开发者使用&#xff0c;它们能够用于为苹果首款空间计算机—Apple Vision Pro&#xff0c;创造出独特且前所未有的应用体验。Vision Pro具备visionOS&#xff0c;这是全球首款空间操…

【ABAP】数据类型(三)「数据字典数据类型」

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

Unity简单的移动相机

Unity3D制作一个会移动的方块&#xff08;还不会移动照相机&#xff09;_SMG_DSG的博客-CSDN博客 接着上一次的文章代码&#xff0c;我们继续写&#xff0c;其实简单的移动也是非常简单&#xff0c;我们只需要使用一个相机一直面对着方块的函数就行了 好了&#xff0c;废话不…

Tkinter之窗口布局介绍

Tkinter之窗口布局介绍 关于Python 的Tkinter窗口基础可参见https://blog.csdn.net/cnds123/article/details/127227651 Tkinter 之几何管理器&#xff08;geometry manager&#xff09;&#xff0c;也叫布局&#xff08;layout&#xff09;&#xff0c;是用来控制窗体中小部…

STM32单片机(八)DMA直接存储器存取----第二节:DMA直接存储器存取练习(DMA数据转运和DMA+AD多通道)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

PyTorch深度学习实战(4)——常用激活函数和损失函数详解

PyTorch深度学习实战&#xff08;4&#xff09;——常用激活函数和损失函数详解 0. 前言1. 常用激活函数1.1 Sigmoid 激活函数1.2 Tanh 激活函数1.3 ReLU 激活函数1.4 线性激活函数1.5 Softmax 激活函数 2. 常用损失函数2.1 均方误差2.2 平均绝对误差2.3 分类交叉熵 2.4 实现自…

分享一组开关按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>豆子开关</title><style>* {margin: 0;padding: 0;box-sizing: border-box;-webkit-tap-hi…

STM32单片机(八)DMA直接存储器存取----第一节:DMA直接存储器存取

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

使用Python制作简单的图表并设置图表元素

案例01 在python中制作简单的图表 import matplotlib.pyplot as plt # 导入matplotlib模块 x [1, 2, 3, 4, 5, 6] # 给出x坐标的数据 y [2, 4, 6, 8, 10, 12] # 给出y坐标的数据 plt.plot(x, y, color red, linewidth 3, linestyle solid) # 绘制折线图 plt.show() # …

动态库的入口——VCRT(DLL)和CRT(SO)

摘要&#xff1a;为了更加深入的理解动态库的加载初始化过程&#xff0c;本文根据VCRT和Linux-CRT的代码实现详细描述了windows和linux平台下对应动态库加载时会进行哪些工作。本文重点关注全局变量的初始化时机&#xff0c;以及是否有其他额外的操作。   关键字&#xff1a;…

被微服务循环依赖调用坑了 !

最近的迭代转测后&#xff0c;遇到了一个比较有意思的问题。系统在测试环境整体运行还算平稳&#xff0c;但是过一段时间之后&#xff0c;就开始有接口超时了&#xff0c;日志中出现非常多的 “java.net.SocketTimeoutException: Read timed out”。 试了几次重启大法&#xf…

用魔法打败魔法!用AI制作AI分割数据集!

本节内容我们使用SAM将边界框转换为分割数据集&#xff0c;这对于实例分割数据集的制作非常有用&#xff0c;下面我会一步步给出我的代码&#xff0c;希望对你有用。 有兴趣的朋友可以研究一下这本书&#xff0c;详细的介绍了数据集制作到分割的实际项目应用&#xff01; 步骤 …