首页 > 其他分享 >大数据分析与可视化 之 实验11 Matplotlib绘制图表(一)

大数据分析与可视化 之 实验11 Matplotlib绘制图表(一)

时间:2023-12-30 20:24:08浏览次数:44  
标签:11 plot plt color Matplotlib grade values 可视化 绘制

实验11 Matplotlib绘制图表(一)

实验学时:2学时
实验类型:验证
实验要求:必修

一、实验目的

  1. 掌握Matplotlib的框架及图形属性。
  2. 掌握Matplotlib绘制图形的步骤。
  3. 掌握Matplotlib绘制直线、曲线图、折线图。
  4. 掌握Matplotlib绘制柱形图、条形图、饼图。

二、实验要求

通过编程实现使用Matplotlib绘制直线、曲线图、折线图、柱形图、条形图并显示输出。

三、实验内容

任务1. 根据函数 ,绘制如下图所示图形。用Python编写程序实现。

任务2. 在任务1的基础上对图形进行美化,绘制如下图所示图形。用Python编写程序实现。

任务20. 在任务2的基础上,实现交互功能。参考代码如下:

任务3. 在实验9的任务2(如图)中结果数据绘制如下图形:
(1)根据每门课程的总分设计一个柱形图
(2)根据每门课程的平均分设计一个条形图
(3)根据每门课程的及格率和不及格率设计一个折线图。
用Python编写程序实现。

任务4. 编写一个程序,使用Matploglib分析学生考试成绩特征的分布与分散情况。
1.使用pandas库读取学生考试成绩数据
2.将学生考试总成绩分为4个区间,计算各区间下的学生人数,绘制学生考试总成绩分布饼图。
3.提取学生3项单科成绩的数据,绘制学生各项考试成绩分散情况箱线图。
分析学生考试总成绩的分布情况和3项单科成绩的分散情况。
参考代码:

test11.py

import numpy as np
import matplotlib.pyplot as plt
import os
import matplotlib as mpl
import pandas as pd
from matplotlib.font_manager import FontProperties
import matplotlib.animation as animation

import chapter09.test9

os.environ['MPL_SUPPRESS_MATLAB_ENGINE_WARNING'] = '1'
os.environ['MPLBACKEND'] = 'module://ipykernel.pylab.backend_inline'


# 定义函数
def Y1(x):
    return 2 * x + 1


def Y2(x):
    return -x ** 2 + 1


def task1():
    # 生成x值的范围
    x_values = np.linspace(-1, 1, 100)

    # 计算对应的y值
    y1_values = Y1(x_values)
    y2_values = Y2(x_values)

    font = FontProperties(fname=r'C:\Windows\Fonts\STSONG.TTF', size=12)
    # 绘制图形
    plt.plot(x_values, y2_values, label='曲线', color='blue', linestyle='-')
    plt.plot(x_values, y1_values, label='直线', color='red', linestyle='--')

    # 添加标签和标题
    plt.title('绘制直线和曲线', fontproperties=font)

    # 添加图例
    plt.legend(prop=font)

    # 显示图形
    plt.grid(True)
    plt.show()


def task2():
    # 生成x值的范围
    x_values = np.linspace(-1, 1, 100)

    # 计算对应的y值
    y1_values = Y1(x_values)
    y2_values = Y2(x_values)

    # 创建一个图形对象
    fig = plt.figure()

    # 设置整个图形的背景色为红色
    fig.set_facecolor('pink')

    font = FontProperties(fname=r'C:\Windows\Fonts\STSONG.TTF', size=12)
    # 绘制图形
    plt.plot(x_values, y2_values, label='曲线', color='blue', linestyle='-')
    plt.plot(x_values, y1_values, label='直线', color='red', linestyle='--')

    # 在线条上标出公式
    plt.text(0.5, 1.5, r'$Y1=2x+1$', fontsize=12, color='red')
    plt.text(-0.5, 1.2, r'$Y2=-x^2+1$', fontsize=12, color='blue')

    font2 = FontProperties(fname=r'C:\Windows\Fonts\STXINGKA.TTF', size=20)
    # 添加标签和标题
    plt.xlabel('x-变量', fontproperties=font, color='blue')
    plt.ylabel('y-函数的值', fontproperties=font, color='blue')
    plt.title('绘制直线和曲线', fontproperties=font2, color='red')

    # 添加图例
    legend = plt.legend(prop=font, loc='lower right', frameon=True, edgecolor='red')
    legend.get_frame().set_facecolor('gray')

    # 显示图形
    plt.grid(False)

    plt.show()


def draw_pic():
    x = np.linspace(-1, 1, 50)  # 从[-1,1]中等距取50个数作为x的取值
    y1 = 2 * x + 1
    plt.plot(x, y1, label='直线', color='red', linewidth=1.0, linestyle='--')  # 设置线条的样式
    y = -x ** 2 + 3
    plt.plot(x, y, label='曲线')  # lable表示图例标签

    plt.xlim((-1, 2))  # x参数范围,即x轴的取值范围
    plt.ylim((1, 3))  # y参数范围
    plt.xticks(np.linspace(-1, 2, 5))
    # 为点的位置设置对应文字,第一个参数是点的位置,第二个参数时点的文字提示
    plt.yticks([-2, -1.8, -1, 1.22, 3], [r'较差', r'差', r'一般', r'好', r'较好'])
    my_gca = plt.gca()  # 获取图形的axis轴
    # 将右边和上边的边框颜色去掉
    my_gca.spines['right'].set_color('none')
    my_gca.spines['top'].set_color('none')
    # 绑定x、y轴
    my_gca.xaxis.set_ticks_position('bottom')
    my_gca.yaxis.set_ticks_position('left')
    # 定义x、y轴位置
    my_gca.spines['bottom'].set_position(('data', 0))
    my_gca.spines['left'].set_position(('data', 0))
    plt.text(0.85, 2.6, r'状态曲线理想值', fontdict={'size': 16, 'color': 'g'})
    plt.legend(loc='lower right')


def dynamic_draw(fig, ax):
    x = 0.73
    y = 2 * x + 1
    global small_plot  # 声明小点为全局变量
    small_plot = ax.scatter(x, y, s=66, color='b')
    # 定义线的范围,x的范围是定值,y的范围是从y到0的位置,lw是linewidth,线宽
    line, = plt.plot([x, x], [y, 0], 'k-.', lw=2.5, color='red')  # 会返回两个参数 只取第一个
    # 设置关键位置的提示信息
    text = plt.annotate(r'$2x+1=%s$' % y, xy=(x, y), xycoords='data', xytext=(+30, -30), textcoords='offset points',
                        fontsize=16, arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=.2'))

    def get_move(event):
        # 事先声明小点为全局变量 否则会被认为是局部变量报UnboundLocalErrol
        global small_plot
        # 打开交互模式面板
        plt.ion()
        try:
            if 1 > event.xdata > -1 and 3 > event.ydata > 0:
                x = event.xdata
                V = -x ** 2 + 3
                line.set_xdata([x, x])
                line.set_ydata([y, 0])
                small_plot.remove()  # 每次移动把原来的小点删了
                small_plot = ax.scatter(x, y, s=66, color='red')
                text.set_text(r'$2x+1=%s$' % y)
                text.xy = (x, y)
        except TypeError:
            pass

    # 绑定鼠标移动事件
    fig.canvas.mpl_connect('motion_notify_event', get_move)


def task2_2():
    # 解决中文乱码问题
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    fig = plt.figure(facecolor='pink', edgecolor='green')
    ax = fig.add_subplot(1, 1, 1)

    draw_pic()
    dynamic_draw(fig, ax)
    plt.show()


def task3():
    # 解决中文乱码问题
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    # 读取 Excel 文件
    df = pd.read_excel('mydata.xlsx', skiprows=3, skipfooter=2)
    # 为了方便演示,我仅选择部分列进行示例
    selected_columns = ['姓名', '性别', '高等数学', '大学英语', '操作系统', 'Python语言', '计算机组成原理']
    # 确保数据包含所需的列
    if set(selected_columns).issubset(df.columns):
        # (1) 根据每门课程的总分设计柱形图
        course_totals = df[selected_columns[2:]].sum()
        plt.figure(figsize=(10, 6))
        plt.bar(course_totals.index, course_totals.values, color='skyblue')
        plt.xlabel('课程')
        plt.ylabel('总分')
        plt.title('每门课程的总分柱形图')
        plt.show()
        # (2) 根据每门课程的平均分设计条形图
        course_means = df[selected_columns[2:]].mean()
        plt.figure(figsize=(10, 6))
        plt.barh(course_means.index, course_means.values, color='lightcoral')
        plt.xlabel('平均分')
        plt.ylabel('课程')
        plt.title('每门课程的平均分条形图')
        plt.show()
        # (3) 根据每门课程的及格率和不及格率设计折线图
        pass_rates = df[selected_columns[2:]].apply(lambda x: sum(x >= 60) / len(x))
        fail_rates = df[selected_columns[2:]].apply(lambda x: sum(x < 60) / len(x))
        plt.figure(figsize=(10, 6))
        plt.plot(pass_rates.index, pass_rates.values, label='及格率', marker='o', linestyle='-', color='green')
        plt.plot(fail_rates.index, fail_rates.values, label='不及格率', marker='o', linestyle='-', color='red')
        plt.xlabel('课程')
        plt.ylabel('比率')
        plt.title('每门课程的及格率和不及格率折线图')
        plt.legend()
        plt.show()
    else:
        print("数据缺少所需的列。请检查列名是否正确。")


def task4():
    student_grade = pd.read_excel('student_grade.xlsx')
    w = [0, 150, 200, 250, 300]
    grade_interval = pd.cut(student_grade.iloc[:, -1], w).value_counts()

    plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
    plt.rcParams['axes.unicode_minus'] = False
    # 绘制学生考试总成绩的总体分布情况饼图
    p = plt.figure(figsize=(12, 12))
    # 设置画布
    label = ["良好", "及格", "优秀", "不及格"]
    explode = [0.01, 0.01, 0.01, 0.01]  # 设定各项离心n个半径
    plt.pie(grade_interval, explode=explode, labels=label, autopct='%1.1f%%', textprops={"fontsize": 15})  # 绘制饼图
    plt.title('学生考试总成绩的总体分布情况饼图', fontsize=20)
    plt.savefig('学生考试总成绩的总体分布情况饼图.png')
    plt.show()

    # 绘制学生考试总成绩的总体分散情况箱线图
    math_grade = student_grade.iloc[:, -4]
    reading_grade = student_grade.iloc[:, -3]
    writing_grade = student_grade.iloc[:, -2]
    p = plt.figure(figsize=(16, 8))
    label = ['数学成绩', '阅读成绩', '写作成绩']
    gdp = (list(math_grade), list(reading_grade), list(writing_grade))
    plt.boxplot(gdp, notch=True, labels=label, meanline=True)  # 绘制箱线图
    plt.xlabel('学生考试科目')
    plt.ylabel('学生考试分数')
    plt.title('学生各项考试成绩的总体分散情况箱线图', fontsize=20)
    plt.savefig('学生各项考试成绩的总体分散情况箱线图.png')
    plt.show()


if __name__ == '__main__':
    task1()
    task2()
    task2_2()
    task3()
    task4()

标签:11,plot,plt,color,Matplotlib,grade,values,可视化,绘制
From: https://www.cnblogs.com/IvanKK/p/17936749

相关文章

  • 大数据分析与可视化 之 实验12 Matplotlib绘制图表(二)
    实验12Matplotlib绘制图表(二)实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Matplotlib的框架及图形属性。掌握Matplotlib绘制图形的步骤。掌握Matplotlib绘制柱形图、条形图、饼图、折线图。掌握Matplotlib绘制散点图、等高线图、极坐标图、3D图。二、实验......
  • 大数据分析与可视化 之 实验06 Pandas缺失值处理
    实验06Pandas缺失值处理实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握判断缺失值、过滤缺失值、填充缺失缺失值等缺失值处理解决实际数据中的缺失值问题二、实验要求使用常见的缺失值处理函数(如:isnull()、notnull()、fillna()、dropna()函数)等知识在PyCharm......
  • 大数据分析与可视化 之 实验07 Pandas合并与级联
    实验07Pandas合并与级联实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握pandas合并/拼接掌握pandas级联二、实验要求利用pandas合并、拼接和级联等知识在PyCharm中编写程序,实现Python数据处理的相关操作。三、实验内容任务1.现有如下图的两个DataFrame数据......
  • 大数据分析与可视化 之 实验08 Pandas字符串和文本处理
    实验08Pandas字符串和文本处理实验学时:2学时实验类型:验证实验要求:必修一、实验目的学会正确使用常见的字符串函数如:len()、find()、strip()、replace()、contains()函数。解决实际数据中的字符串和文本处理问题。二、实验要求使用常见的字符串函数(如:len()、find()、s......
  • 大数据分析与可视化 之 实验09 Pandas函数应用
    实验09Pandas函数应用实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握pandas函数应用的方法:pipe()、apply()和applymap()。能编写自定义函数。能使用pandas函数应用调用自定义函数解决数据分析实际问题。二、实验要求利用pandas函数应用的方法解决数据分析实......
  • codeforces刷题(1100):1862C_div3
    C、FlowerCityFence跳转原题点击此:该题地址1、题目大意  给你n块长度依次不递增的紧密连接在一起的垂直木板,将它们水平横过来,问其组成的全新n块木板的长度是否与原来的木板长度一致。  注意:这里的长度是指:木板的高度。水平摆放后的木板是左对齐,所以其长度就是各个木板水......
  • 大数据分析与可视化 之 实验02 Numpy创建数组
    实验02Numpy创建数组实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Numpy创建数组的方法掌握Numpyndarray的属性、运算掌握Numpy迭代数值,修改数组中元素的值掌握Numpy常用函数的使用方法二、实验要求使用Numpy.array的构造函数创建数组,学会使用Numpyndar......
  • 大数据分析与可视化 之 实验03 Numpy实现数据分析
    实验03Numpy实现数据分析实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Numpy的字符串函数掌握Numpy统计函数掌握Numpy排序、分组、线性代数函数二、实验要求通过编程实现使用Numpy字符串函数进行文本处理,使用统计函数进行数据分析等常用操作。三、实验内......
  • 大数据分析与可视化 之 实验04 Pandas基础
    实验04Pandas基础实验学时:2学时实验类型:验证实验要求:必修一、实验目的1.掌握pandas系列、数据帧和面板的使用2.掌握pandas基本功能和操作二、实验要求Pandas程序的运行步骤。2.pandas的数据结构3.pandas系列、数据帧和面板pandas基本功能和操作三、实验内容任务1.......
  • 大数据分析与可视化 之 实验01 Python爬虫
    实验01Python爬虫实验学时:2学时实验类型:验证实验要求:必修一、实验目的理解爬虫技术掌握正则表达式、网络编程掌握re、socket、urllib、requests、lxml模块及其函数的使用二、实验要求 分析所需爬取信息网页的源代码,使用re、socket、urllib、requests、lxml模块及其函......