知识学习
iloc[]函数
作用
iloc函数是对数据进行位置索引,从而在数据表中提取出对应的数据。
使用
- df.iloc[a, b],其中a是行索引,b是列索引。
- df.iloc[a:b, c],取行索引a->b-1,列索引为c的所有数据,注意:这里的a:b是左闭右开。
- df.iloc[a],取行索引为a,所有列索引的数据。
- iloc[].values,用values属性取值,返回ndarray,但是单个数值无法用values函数读取。
flatten参数
- 对多维数据的降维函数。
- 默认缺省参数是0。
- python里的flatten(dim)表示,从第dim个维度开始展开,将后面的维度转化为一维.也就是说,只保留dim之前的维度,其他维度的数据全都挤在dim这一维。
- 比如一个数据的维度是( S 0 , S 1 , S 2… , S n ) (S0,S1,S2…,Sn)(S0,S1,S2…,Sn), flatten(m)后的数据为( S 0 , S 1 , S 2 , . . . , S m − 2 , S m − 1 , S m ∗ S m + 1 ∗ S m + 2 ∗ . . . ∗ S n ) (S0,S1,S2,…,Sm-2,Sm-1,SmSm+1Sm+2*…*Sn)(S0,S1,S2,…,Sm−2,Sm−1,Sm∗Sm+1∗Sm+2∗…∗Sn)
linspace
通过定义均匀间隔创建数值序列。
np.linspace(start = , stop = , num = ,endpoint = )
需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);最终函数返回间隔类均匀分布的数值序列。
其中endpoint表示是否包含结尾值,缺省时为true,表示包含。
plt.figure()
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
- num:图像编号或名称,数字为编号 ,字符串为名称
- figsize:指定figure的宽和高,单位为英寸;
- dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
- facecolor:背景颜色
- edgecolor:边框颜色
- frameon:是否显示边框
polar
polar(theta, r, **kwargs)
参数 | 含义 |
---|---|
theta | 每个标记所在射线与极径的夹角 |
r | 每个标记到原点的距离 |
marker | 标记点样式 |
markersize(ms) | 标记点的大小 |
markerfacecolor(mfc) | 标记点的填充颜色 |
markeredgecolor(mec) | 标记点的边界颜色 |
color | 线条颜色 |
linestyle(ls) | ls=‘None’: 线条不显示 |
ls=‘None’: 线条不显示 | 线条粗细 |
plt.thetagrids()
获取当前极坐标图上的theta网格线
plt.thetagrids(angles, labels=None,fmt=None, **kwargs)
-
Angles:
将角度设置为theta网格的位置(这些网格线沿theta尺寸相等) -
abels:如果不是None,则为len(angles)或在每个角度使用的标签字符串列表。如果标签为None,则标签为fmt%angle。
-
frac:它是极坐标半径在标签位置的分数(1是边)。例如1.25在轴外,而0.75在轴内。
返回类型:返回值是元组列表(行,标签)
fill
fill函数的功能是根据结点之间连线的封闭区域绘制多边形。
matplotlib.pyplot.fill(*args, data=None, **kwargs)
- *args:根据x,y位置确定结点绘制多边形,可添加一个可选的颜色标记。数据结构为x, y, [color]序列,支持多组x, y, [color]序列。必备参数。
plt.fill(x, y)
plt.fill(x, y, "b")
plt.fill(x, y, x2, y2)
plt.fill(x, y, "b", x2, y2, "r")
- data:带标签的数据对象。可索引对象。可选参数。
例如:plt.fill(“time”, “signal”, data={“time”: [0, 1, 2], “signal”: [0, 1, 0]}) - kwargs:matplotlib.patches.Polygon对象的相关属性。
nlargest()
df.nlargest()是一个DataFrame的方法,用于返回DataFrame中最大的n个值所在的行。
df.nlargest(n, columns, keep='first')
参数说明:
- n:要返回的最大值的数量。
- columns:用于排序的列名或列名列表
- keep:指定如何处理具有相同值的行,默认值为’first’,表示保留第一个出现的行,如果这是为‘last’,则保留最后一个出现的行。
import pandas as pd
data = {'Name': ['Tom', 'Nick', 'John', 'Tom', 'Nick', 'John'],
'Age': [20, 25, 30, 35, 40, 45],
'Score': [90, 85, 80, 95, 90, 85]}
df = pd.DataFrame(data)
top_3_scores = df.nlarge(3, 'Score')
'''
输出结果
Name Age Score
3 Tom 35 95
0 Tom 20 90
4 Nick 40 90
这里输出了前三个同学的分数,这里是按照score来进行排序的。keep是默认值,会保留第一个出现的行。
'''
柱状图 - plt.bar
柱状图实际上是用来表示分组(或离散)变量的可视化。
plt.bar(x, y, width, color, edgecolor, bottom, linewidth, align, tick_label, align)
参数说明:
- x:指定x轴上的数值
- y:指定y轴上的数值
- width:表示柱状图的宽度,取之在0~1之间,默认值为0.8
- color:柱状图的填充色
- edgecolor:柱状图的边框颜色
- bottom:柱状图底部离横轴的距离
- linewidth:柱状图边框宽度
- tick_label:柱状图的刻度标签,也可直接将标签赋值给x
- align:指定x轴上对齐方式,‘center’'elge’边缘
plt.text
plt.text()函数允许我们在图表的指定位置添加文本标签。无论是标注数据点、添加图例说明还是进行图表的详细解释。
plt.text(x, y, string, fontsize=None, verticalalignment=None, horizontalalignment=None, **kwargs)
参数说明:
- x,y:文本标签的坐标位置。
- string:要显示的文本内容
- fontsize:字体大小
- verticalalignment 或 va: 垂直对齐方式(‘top’, ‘center’, ‘bottom’, ‘baseline’ 等)。
- horizontalalignment 或 ha: 水平对齐方式(‘left’, ‘center’, ‘right’ 等)。
sorte()函数
sorted(iterable, key=None, reverse=False)
参数说明:
- iterable:表示需要排序的可迭代对象,例如列表、元组、集合等。
- key:指定一个函数,用于生成排序的比较键。默认为None,表示直接比较元素本身。
- reverse:一个布尔值,用于指定排序顺序。默认为False,表示升序排序;设置为True,则表示降序排序。
饼图- plt.pie()
plt.pie(sizes, labels, autopct, startangle)
参数说明:
- sizes:一个包含各个部分大小的列表
- labels:一个包含各个部分标签的列表
- autopct:用于在饼图中显示每个部分的百分比标签,'%1.1f%%'表示以浮点数格式显示,保留以为小数,并添加百分号。
- startangle:指定其实角度,通常使用 90 度仪确保饼图从上方开始。
其他参数:
colors: 用于指定各部分的颜色。可以传入一个颜色列表。
explode: 用于指定是否将某一部分突出显示,以强调它。可以传入一个列表,其中值为0表示不突出,大于0表示突出。 - shadow: 布尔值,表示是否添加阴影效果。
- startangle: 起始角度,以度为单位,默认为0度,即从正上方开始。
- pctdistance: 百分比标签与圆心的距离,默认为0.6,可以调整位置。
- labeldistance: 标签与圆心的距离,默认为1.1,可以调整位置。
- autopct: 控制百分比标签的格式。可以使用字符串格式化来自定义显示方式。
- wedgeprops: 用于指定扇形部分的属性,如边框颜色、边框宽度等。
- textprops: 用于指定标签文本的属性,如字体大小、字体颜色等。
1.输入任意一个学号,将该学号对应的成绩,通过雷达图显示。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('score.csv')
# print(df.head(5))
student_id = input('请输入学号:')
# 获取指定学号的成绩数据
scores = df[df['学号'] == int(student_id)].iloc[:, 1:].values.flatten().tolist()
# print(scores)
# 科目名称
courses = df.columns[1:]
# 绘制雷达图
data_length = len(courses)
angles = np.linspace(0, 2 * np.pi, data_length, endpoint = False)
scores.append(scores[0])
# print(scores)
angles = np.append(angles, angles[0])
plt.figure(figsize = (6, 6))
plt.polar(angles, scores, 'rD-', linewidth = 2) # 绘制雷达图
plt.thetagrids(angles[:-1] * 180 / np.pi, courses, fontproperties = 'SimHei', fontsize = 10)
plt.fill(angles, scores, facecolor = 'b', alpha = 0.6)
plt.title(f"学号为{student_id}的成绩雷达图", fontproperties = 'SimHei', fontsize = 14)
plt.show()
2. 统计所有同学的成绩总分,将总分在前6名的同学总分用柱形图显示出来。(纵坐标标签是“总分”,横坐标标签是“学号”,每个柱形上方显示具体的成绩总分)
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('score.csv')
# print(df.head(5))
df['总分'] = df.iloc[:, 1 : 7].sum(axis = 1) # 每一行求和
# print(df['总分'])
top_6 = df.nlargest(6, '总分')
plt.figure(figsize = (10, 4))
plt.bar(top_6['学号'].astype(str), top_6['总分'], color = 'pink')
# 在每个柱形上方显示具体的成绩总分
for i in range(len(top_6['总分'])):
plt.text(i, top_6['总分'].iloc[i], str(top_6['总分'].iloc[i]), ha = 'center', va = 'bottom')
plt.xlabel('学号')
plt.ylabel('总分')
plt.show()
3.编写程序,输入任意课程名称,统计该课程的各个成绩等级的比例,用饼状图显示。(优秀:90100;良好:8089;中等:7079;及格:6069;不及格:0~59)
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('score.csv')
course_name = input('请输入课程名称:')
# 根据输入的课程名称获取对应的成绩列表
if course_name in df.columns:
scores = df[course_name]
else:
print(f'未找到课程{course_name}')
exit()
grades = {90 : '优秀', 89 : '良好', 79 : '中等', 69 : '及格', 59 : '不及格'}
# 统计各个成绩等级的数量
labels = []
sizes = []
for grade in sorted(grades, reverse = True):#
# 因为成绩不可能低于0,所以不及格的下限是0
if grade == 59:
labels.append(grades[grade])
sizes.append(scores[scores <= grade].count())
else:
labels.append(grades[grade])
sizes.append(scores[(scores >= grade) & (scores < (grade + 10))].count())
plt.pie(sizes, labels = labels, autopct = '%1.1f%%', startangle = 140, colors = plt.cm.tab20.colors)
plt.show()