• Pandas数据处理可视化


    Hallo,各位小伙伴大家好啊!这个专栏是用来分享数据处理以及数据可视化的一些常见操作,以及自己的一些学习笔记,希望能给大家带来帮助呀!感兴趣的小伙伴也欢迎私信或者评论区交流呀!

     以下可视化的数据来源为“transcript.xlsx”成绩单文件,他有六列,分别是学生姓名班级数学科目得分体育科目得分python语言得分美学科目得分。基于这个数据表,进行数据处理和可视化操作。

    一、垂直柱形图

    柱形图,又称长条图、柱状统计图亦称条图条状图棒形图,是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。

     代码如下:

    1. import pandas as pd #导入pandas库
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. plt.rcParams['font.sans-serif']=['SimHei']
    5. plt.rcParams['axes.unicode_minus']=False
    6. excel_file = 'transcript.xlsx' #导入文件
    7. data = pd.read_excel(excel_file) #读入数据
    8. def func(type):
    9. type_class = data.loc[data['class'] == type]
    10. class_math = type_class["math"]
    11. class_physics = type_class["physics"]
    12. class_python = type_class["python"]
    13. class_aesthetics = type_class["aesthetics"]
    14. type_dic = {}
    15. type_dic["math"] = sum(class_math)/len(class_math)
    16. type_dic["physics"] = sum(class_physics)/len(class_physics)
    17. type_dic["python"] = sum(class_python)/len(class_python)
    18. type_dic["aesthetics"] = sum(class_aesthetics)/len(class_aesthetics)
    19. return type_dic
    20. dic_A = func("A")
    21. dic_B = func("B")
    22. dic_C = func("C")
    23. dic_D = func("D")
    24. y1 = list(dic_A.values())
    25. y2 = list(dic_B.values())
    26. y3 = list(dic_C.values())
    27. y4 = list(dic_D.values())
    28. x = np.arange(len(y1))
    29. #设置柱状图的宽度
    30. width = 0.1
    31. #绘图
    32. plt.figure(figsize=(8,4))
    33. plt.bar(x=x,height=y1,width=width,label='math')
    34. plt.bar(x=x+width,height=y2,width=width,label='physics')
    35. plt.bar(x=x+2*width,height=y3,width=width,label='python')
    36. plt.bar(x=x+3*width,height=y4,width=width,label='aesthetics')
    37. plt.xlabel('平均成绩')
    38. plt.ylabel('班级')
    39. #添加图标题和图例
    40. a = [0,1,2,3]
    41. labels = ['A', 'B', 'C', 'D']
    42. plt.xticks(a,labels,rotation = 30)
    43. plt.title('各个班级四个科目平均成绩垂直柱形图')
    44. plt.legend(bbox_to_anchor=(0.1, 1))
    45. plt.show()

    效果如下:

     二、垂直堆叠柱形图

    垂直堆叠柱状图是柱状图的一种,可以在较小的可视化应用空间内,智能地展示多维的数据差异。支持自定义y轴区间、多系列数据配置以及堆叠式的数据展示

    代码如下: 

    1. import pandas as pd #导入pandas库
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. plt.rcParams['font.sans-serif']=['SimHei']
    5. plt.rcParams['axes.unicode_minus']=False
    6. excel_file = 'transcript.xlsx' #导入文件
    7. data = pd.read_excel(excel_file) #读入数据
    8. def func(type):
    9. type_class = data.loc[data['class'] == type]
    10. class_math = type_class["math"]
    11. class_physics = type_class["physics"]
    12. class_python = type_class["python"]
    13. class_aesthetics = type_class["aesthetics"]
    14. type_dic = {}
    15. type_dic["math"] = sum(class_math)/len(class_math)
    16. type_dic["physics"] = sum(class_physics)/len(class_physics)
    17. type_dic["python"] = sum(class_python)/len(class_python)
    18. type_dic["aesthetics"] = sum(class_aesthetics)/len(class_aesthetics)
    19. return type_dic
    20. dic_A = func("A")
    21. dic_B = func("B")
    22. dic_C = func("C")
    23. dic_D = func("D")
    24. y1 = list(dic_A.values())
    25. y2 = list(dic_B.values())
    26. y3 = list(dic_C.values())
    27. y4 = list(dic_D.values())
    28. y_list = [y1,y2,y3,y4]
    29. x = np.arange(len(y1))
    30. width = 0.1
    31. plt.xlabel('班级')
    32. plt.ylabel('分数')
    33. def push(i):
    34. #设置柱状图的宽度
    35. if i == 0:
    36. plt.bar(x[i], y_list[i][0], alpha=0.7, width=0.3, color='green',label = "math")
    37. plt.bar(x[i], y_list[i][1], alpha=0.7, width=0.3, color='red',bottom=y_list[i][0],label = "physics")
    38. plt.bar(x[i], y_list[i][2], alpha=0.7, width=0.3, color='black',bottom=y_list[i][1],label = "python")
    39. plt.bar(x[i], y_list[i][3], alpha=0.7, width=0.3, color='yellow',bottom=y_list[i][2],label = "aesthetics")
    40. else:
    41. plt.bar(x[i], y_list[i][0], alpha=0.7, width=0.3, color='green')
    42. plt.bar(x[i], y_list[i][1], alpha=0.7, width=0.3, color='red', bottom=y_list[i][0])
    43. plt.bar(x[i], y_list[i][2], alpha=0.7, width=0.3, color='black', bottom=y_list[i][1])
    44. plt.bar(x[i], y_list[i][3], alpha=0.7, width=0.3, color='yellow', bottom=y_list[i][2])
    45. push(0)
    46. push(1)
    47. push(2)
    48. push(3)
    49. a = [0,1,2,3]
    50. labels = ['A', 'B', 'C', 'D']
    51. plt.xticks(a,labels,rotation = 30)
    52. plt.legend(bbox_to_anchor=(0.30, 0.75))
    53. plt.title('垂直堆叠柱形图')
    54. plt.show()

    效果如下:

     三、直方图

    直方图又称质量分布图,是一种统计报告图,它是根据具体数据的分布情况,画成以组距为底边、以频数为高度的一系列连接起来的直方型矩形图

    代码如下: 

    1. import pandas as pd #导入pandas库
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. plt.rcParams['font.sans-serif']=['SimHei']
    5. plt.rcParams['axes.unicode_minus']=False
    6. excel_file = 'transcript.xlsx' #导入文件
    7. data = pd.read_excel(excel_file) #读入数据
    8. math = data["math"]
    9. physics = data["physics"]
    10. python = data["python"]
    11. aesthetics = data["aesthetics"]
    12. # 计算组数
    13. def histo(a,subject):
    14. d = 3 # 组距
    15. num_bins = (max(a) - min(a)) // d
    16. # 设置图形大小
    17. plt.figure(figsize=(20, 8), dpi=80)
    18. plt.hist(a, num_bins)
    19. # 设置x轴刻度
    20. plt.xticks(range(min(a), max(a) + d, d))
    21. # 设置网格
    22. plt.grid(alpha=0.4)
    23. plt.ylabel(subject+"分数",fontsize=60)
    24. plt.title(subject+"科目直方图",fontsize=60)
    25. # print(math)
    26. histo(math,"math")
    27. histo(physics,"physics")
    28. histo(python,"python")
    29. histo(aesthetics,"aesthetics")
    30. plt.show()

    效果如下:

     

     四、分布箱线图

    线是用来表示一组或多组连续型数据分布的中心位置和散布范围的形,因形似箱子故取名为线

    代码如下: 

    按各个科目的分数分布箱线图:

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. # 读取excel文件
    4. file_01 = pd.read_excel("transcript.xlsx")
    5. fig = plt.figure(figsize=(16, 8))
    6. d1 = file_01['math']
    7. d2 = file_01['physics']
    8. d3 = file_01['python']
    9. d4 = file_01['aesthetics']
    10. label = 'math', 'physics', 'python', 'aesthetics'
    11. plt.boxplot([d1, d2, d3, d4], labels=label) # label设置横轴每个箱图对应的横坐标
    12. plt.xticks(fontproperties='KaiTi')
    13. plt.xlabel('变量', fontproperties='KaiTi',fontsize=40)
    14. plt.ylabel('变量值', fontproperties='KaiTi',fontsize=40)
    15. plt.show()

    按班级的科目分数分布箱线图:

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. # 读取excel文件
    4. data = pd.read_excel("transcript.xlsx")
    5. def func(type):
    6. type_class = data.loc[data['class'] == type]
    7. d1 = type_class["math"]
    8. d2 = type_class["physics"]
    9. d3 = type_class["python"]
    10. d4 = type_class["aesthetics"]
    11. label = 'math', 'physics', 'python', 'aesthetics'
    12. plt.boxplot([d1, d2, d3, d4], labels=label) # label设置横轴每个箱图对应的横坐标
    13. plt.xticks(fontproperties='KaiTi')
    14. plt.xlabel('变量', fontproperties='KaiTi', fontsize=20)
    15. plt.ylabel('变量值', fontproperties='KaiTi', fontsize=20)
    16. plt.show()
    17. func("A")
    18. func("B")
    19. func("C")
    20. func("D")

    效果如下:

     

     

     五、总结

    1. Pandas对数据进行筛选,比如说绘制各个班级四个科目平均成绩的垂直柱形图时,需要对不同班级进行筛选,则利用pandas中的type_class = data.loc[data['class'] == type],进行筛选,这里的type即是班级种类ABCD。
    2. 函数封装思想,在整个编程中,运用了蕴含了大量自己封装的函数,因为在画图中有很多重复的操作,比如说画不同科目的直方图时,仅是科目类别对应的数据不一样,代码逻辑和框架是一样的。运用函数封装使得代码更加啊清晰,高效,也能够减少代码量。
    3. 用字典存储对应数据。type_dic = {}键是不同的科目名,键是平均成绩。这样在画图时,键可以作为图列,y1 = list(dic_A.values()),取得y值绘图。
    4. plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False 防止中文标签标题等不能正常显示。
    5. 导入文件,读取数据的相关操作:excel_file = 'transcript.xlsx'#导入文件data = pd.read_excel(excel_file)      #读入数据
    6. 绘制垂直堆叠柱形图时,plt.bar()中注意设置bottom参数是从上一个科目上开始的,这样才能够达到堆叠的效果。
    7. 绘制各个科目的直方图时,设置了一个d组距,将最大值减去最小值除以组距作为num_bins,用plt进行画图,设置网格使效果更加直观。绘制各个科目的分数分布箱线图,label = 'math', 'physics', 'python', 'aesthetics'设置横轴每个箱图对应的横坐标
  • 相关阅读:
    2022年下半年信息系统项目管理师下午真题及答案解析
    2-反对称矩阵及其指数函数
    (十二)数据结构-树、森林
    LeetCode 98. 验证二叉搜索树
    bugku ctf(web篇2)
    论文超详细精读|五千字:STGR
    关于一个数组的小细节
    HTML学生作业网页 传统端午节节日 学生节日网页设计作业源码(HTML+CSS+JS)
    网络安全基础入门-概念名词
    Numpy学习记录
  • 原文地址:https://blog.csdn.net/weixin_63866037/article/details/127702314