文章目录
- 前言
- 一、数据介绍
- 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 PyPDF2import pytesseractimport pandas as pdimport 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 timeimport requestsfrom lxml import etreeimport pandas as pddef scrape_website(url, dataframe):# 发起HTTP请求获取网页内容response = requests.get(url)# 检查请求是否成功if response.status_code == 200:# 使用lxml库解析网页内容html = response.texttree = 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'] = item1data['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 dataframeelse:print("请求失败")def scrape_url(url):# 发起HTTP请求获取网页内容response = requests.get(url)# 检查请求是否成功if response.status_code == 200:# 使用lxml库解析网页内容html = response.texttree = etree.HTML(html)# 提取所有链接links = tree.xpath('//*[@id="wp_content_w3_0"]//@href')for link in links:print("链接:", link)return linkselse: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 pdimport 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 Geofrom pyecharts import options as optsfrom pyecharts.globals import GeoTypedef 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 gg = test_geo()# 渲染成html,保存在代码文件的相同目录下g.render('坐标标注.html')
3.2.2 考研信息
2020-2022年分数分布图:初试成绩、综合面试成绩、总成绩(柱形图)
- 初试成绩分布
import pandas as pdfrom pyecharts.charts import Barfrom 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_namedf = 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] += 1break# 绘制柱状图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 pdfrom pyecharts.charts import Barfrom 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_namedf = 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] += 1break# 绘制柱状图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 pdfrom pyecharts.charts import Barfrom 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_namedf = 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] += 1break# 绘制柱状图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 pdfrom pyecharts.charts import Pie, Timelinefrom 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_namedf = 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] += 1break# 创建时间轴图表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 pdfrom pyecharts.charts import Pie, Timelinefrom 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_namedf = 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] += 1break# 创建时间轴图表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 pdfrom pyecharts.charts import Pie, Timelinefrom 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_namedf = 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] += 1break# 创建时间轴图表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 pdfrom pyecharts import options as optsfrom 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 pdimport 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 pdimport networkx as nximport 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_nameresearch_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 pdfrom collections import Counterfrom pyecharts import options as optsfrom 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等数据可视化工具,通过使用柱状图、折线图、饼图、箱线图、关系图、词云图等展示形式,对数据进行可视化展示。