动手学数据分析-数据可视化

数据可视化

绘制常用图形

常用图形有:

  • plt.scatter() 散点图
  • plt.plot() 折线图
  • plt.bar() 直方图
  • plt.pie() 饼图
  • plt.boxplot() 箱型图
#导入相应的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline  

#图可以显示中文和负号
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
data = pd.read_excel("D:\data\student-score\student-score.xlsx")
data.head()
序号姓名学校语文数学英语品德科学总分
01张三湖第1小学95.099.080.010.010.0294.0
12李小红第1小学98.097.079.010.09.5293.5
23张南名第1小学94.097.080.010.010.0291.0
34梁南名第1小学94.599.077.010.010.0290.5
45常右河第1小学93.097.080.010.010.0290.0
data = data.drop(columns = ["序号","品德","科学"],axis = 1) #由于品德和科学的总分与其他学科不一致,为了图片显示效果,删除这两个学科成绩
data.loc[:,"总分"] = data.loc[:,"语文"] + data.loc[:,"数学"] + data.loc[:,"英语"]  #重新计算总分成绩

散点图

gp = data.groupby(by = "学校",as_index=False)  #以学校为分组依据进行分组
data1=gp.mean() #分组后的聚合运算为计算均值
data1.head()
学校语文数学英语总分
0第10小学67.82786967.90163942.975410178.704918
1第11小学71.33333365.41666752.125000188.875000
2第12小学57.92857152.42857149.952381160.309524
3第13小学65.10714368.28571450.071429183.464286
4第14小学58.89473765.52631651.184211175.605263
# 绘制各学科成绩散点图
plt.figure(figsize=(6,4))
plt.scatter(data1["总分"],data1["语文"],marker='v')
plt.scatter(data1["总分"],data1["数学"],marker='o')
plt.scatter(data1["总分"],data1["英语"],marker='*')
plt.title("各学校成绩散点图",fontsize = 14)
plt.xlabel("总成绩")
plt.ylabel("各学科成绩")
plt.legend(["语文","数学","英语"]);

在这里插入图片描述

# 绘制各学科成绩散点图
plt.figure(figsize=(6,4))
plt.scatter(data1["总分"],data1["语文"],marker='v')
plt.title("各学校语文与总分成绩散点图",fontsize = 14)
plt.xlabel("总成绩")
plt.ylabel("各学科成绩")
plt.legend(["语文"])
<matplotlib.legend.Legend at 0x207b5bd2f60>

在这里插入图片描述

# 绘制各学科成绩散点图
data1.plot.scatter(x = "总分", y = "语文")
plt.title("语文与总分成绩散点图")
data1.plot.scatter(x = "总分", y = "数学")
plt.title("数学与总分成绩散点图")
data1.plot.scatter(x = "总分", y = "英语")
plt.title("英语与总分成绩散点图")
# plt.show()
Text(0.5, 1.0, '英语与总分成绩散点图')

在这里插入图片描述

折线图

plt.figure(figsize=(10,4))
plt.plot(range(21),data1.iloc[:,1],'-*') #选取语文成绩数据
plt.plot(range(21),data1.iloc[:,2],'-o') #选取数学成绩数据
plt.plot(range(21),data1.iloc[:,3],'-v') #选取英语成绩数据
plt.title('各学科成绩变化走势图')
plt.xlabel('各学校')
plt.ylabel('学科成绩')
plt.xticks(range(21),data1["学校"],rotation=30)  #rotation=30控制文字倾斜角度
plt.legend(['语文','数学','英语']);

在这里插入图片描述

直方图

yw = data1.loc[:,"学校":"语文"]  #提取数据绘制直方图,直方图原理,每个需要被画图的标签对应一个数值
yw = yw.T
yw
序号12345678910...12131415161718192021
学校第1小学第2小学第3小学第4小学第5小学第6小学第7小学第8小学第9小学第10小学...第12小学第13小学第14小学第15小学第16小学第17小学第18小学第19小学第20小学第21小学
语文90.585.214358.702460.636469.077664.166762.045576.669565.88167.8279...57.928665.107158.894759.892963.2568.564.681866.277854.342151.38

2 rows × 21 columns

yw.columns = yw.iloc[0]  #将学校字段转换成列索引
yw1 = yw.drop("学校",axis=0)  #删多余的行信息
yw1
学校第1小学第2小学第3小学第4小学第5小学第6小学第7小学第8小学第9小学第10小学...第12小学第13小学第14小学第15小学第16小学第17小学第18小学第19小学第20小学第21小学
语文90.585.214358.702460.636469.077664.166762.045576.669565.88167.8279...57.928665.107158.894759.892963.2568.564.681866.277854.342151.38

1 rows × 21 columns

# 每个学校语文平均成绩的直方图
plt.figure(figsize=(12,4))
plt.bar(range(21),yw.loc["语文",:],width=0.5)
plt.title("语文成绩直方图",fontsize = 14)
plt.ylabel("语文成绩",fontsize = 14)
plt.xticks(range(21),yw.iloc[0],rotation=30,fontsize = 12); #x轴刻度为各学校名称

在这里插入图片描述

data2 = data1.drop("总分",axis = 1)  #新建一个dataframe,删掉总分列,因为总分和单科成绩相差太多,影响绘图效果
data2.head()
学校语文数学英语
序号
1第1小学90.50000090.91071474.366071
2第2小学85.21428687.30357173.946429
3第3小学58.70238159.30952452.976190
4第4小学60.63636458.00000041.568182
5第5小学69.07758672.34482843.353448
# 将多个学科成绩画到一张图中  #截取前十
data2.plot.bar(x = '学校',y = ['语文','数学','英语'],figsize=(16,6),width=0.7,rot = 30,title = "各学科成绩直方图"); #rot空值标签倾斜程度

在这里插入图片描述

饼图

data2.head()
学校语文数学英语
序号
1第1小学90.50000090.91071474.366071
2第2小学85.21428687.30357173.946429
3第3小学58.70238159.30952452.976190
4第4小学60.63636458.00000041.568182
5第5小学69.07758672.34482843.353448
plt.figure(figsize=(4,4),dpi=80)
plt.pie(data2.iloc[0,1:] #选取数据源
        ,labels=['语文','数学','英语']
        ,autopct='%1.2f') #设置百分比经度
#         ,explode=[0.1,0.02,0.02]  #设置饼图各个扇区之间的间隙
#         ,colors=['r','g','b']) #设置饼图各个扇区的颜色
plt.title('第1小学各学科成绩占比',fontsize=12);
#fontsize设定字体的大小,xlabel,ylabel,title里面都可以设定

在这里插入图片描述

pic2 = plt.figure(figsize=(8,8),dpi=80)

fig1 = pic2.add_subplot(2,2,1) #第一个子图
plt.pie(data2.iloc[0,1:] #选取数据源 第10小学各学科成绩
        ,labels=['语文','数学','英语']
        ,autopct='%1.2f') #设置百分比经度
#         ,explode=[0.1,0.02,0.02]  #设置饼图各个扇区之间的间隙
#         ,colors=['r','g','b']) #设置饼图各个扇区的颜色
plt.title('第1小学各学科成绩占比',fontsize=12)

fig2 = pic2.add_subplot(2,2,2) #第二个字图
plt.pie(data2.iloc[1,1:] #选取数据源,第11小学各学科成绩
        ,labels=['语文','数学','英语']
        ,autopct='%1.2f') #设置百分比经度
#         ,explode=[0.1,0.02,0.02]  #设置饼图各个扇区之间的间隙
#         ,colors=['r','g','b']) #设置饼图各个扇区的颜色
plt.title('第2小学各学科成绩占比',fontsize=12)

fig3 = pic2.add_subplot(2,2,3) #第二个字图
plt.pie(data2.iloc[2,1:] #选取数据源,第12小学各学科成绩
        ,labels=['语文','数学','英语']
        ,autopct='%1.2f') #设置百分比经度
#         ,explode=[0.1,0.02,0.02]  #设置饼图各个扇区之间的间隙
#         ,colors=['r','g','b']) #设置饼图各个扇区的颜色
plt.title('第3小学各学科成绩占比',fontsize=12)

fig4 = pic2.add_subplot(2,2,4) #第二个字图
plt.pie(data2.iloc[3,1:] #选取数据源,第13小学各学科成绩
        ,labels=['语文','数学','英语']
        ,autopct='%1.2f') #设置百分比经度
#         ,explode=[0.1,0.02,0.02]  #设置饼图各个扇区之间的间隙
#         ,colors=['r','g','b']) #设置饼图各个扇区的颜色
plt.title('第4小学各学科成绩占比',fontsize=12);

在这里插入图片描述

箱型图

data.head()
姓名学校语文数学英语总分
0张三湖第1小学95.099.080.0274.0
1李小红第1小学98.097.079.0274.0
2张南名第1小学94.097.080.0271.0
3梁南名第1小学94.599.077.0270.5
4常右河第1小学93.097.080.0270.0
data_1 = data.loc[data['学校'] =="第1小学"]  #提取第一小学的所有信息
score = (list(data_1.iloc[:,2]),list(data_1.iloc[:,3]),list(data_1.iloc[:,4]))
plt.figure(figsize=(8,6))
plt.boxplot(score
            ,labels=['语文','数学','英语']
            ,notch=True #缺口中位数位置
            ,sym='*'#设定异常值的形状
            ,whis=1.5); #设定几倍标准差之外的数据算是异常值,默认是1.5

泰坦尼克号数据集

text = pd.read_csv(r'result.csv')
text.head()

在这里插入图片描述

男女中生存人数分布情况

sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar(color='chocolate')
plt.title('survived_count')
plt.show()

在这里插入图片描述

男女中生存人与死亡人数的比例

text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')

在这里插入图片描述

不同票价的人生存和死亡人数分布情况

# 排序后绘折线图
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()

在这里插入图片描述

# 排序前绘折线图
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fig = plt.figure(figsize=(20, 18))
fare_sur1.plot(grid=True)
plt.legend()
plt.show()

在这里插入图片描述

不同仓位等级的人生存和死亡人员的分布情况

# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()

import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=text)

在这里插入图片描述

不同年龄的人生存与死亡人数分布情况

facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()

在这里插入图片描述

不同仓位等级的人年龄分布情况

text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值