【Python基础】手把手教你数据可视化!(附实例讲解)
机器学习初学者
共 7116字,需浏览 15分钟
· 2020-09-05
前言
本文对课程数据集及泰坦尼克号数据集进行了实例讲解,一步一步带你绘制数据可视化中常用的五种图形,并对数据间可能存在的相关性做出了阐述。
绘制常用图形
常用图形有:
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()
![](https://filescdn.proginn.com/90690e4aeb6b1d2f4507f7dc6a965c14/a3133907ef767e66a4b1e807ef271266.webp)
data = data.drop(columns = ["序号","品德","科学"],axis = 1) #由于品德和科学的总分与其他学科不一致,为了图片显示效果,删除这两个学科成绩
data.loc[:,"总分"] = data.loc[:,"语文"] + data.loc[:,"数学"] + data.loc[:,"英语"] #重新计算总分成绩
data.head()
![](https://filescdn.proginn.com/9badbea82050b717fae895b5d83741a6/c3e64e9f1e560f7ba707deee182f52f3.webp)
接着我们还可以查看其数据结构:
data.shape #查看数据结构
# 输出
(629, 6)
以及查看各学科的缺失值情况:
data.isnull().sum() #查看缺失值情况
'''
姓名 0
学校 0
语文 1
数学 0
英语 0
总分 1
dtype: int64
'''
对于这些缺失值,我们可以选择使用dropna()
函数删除:
data = data.dropna() #删除缺失值
data.shape # (628, 6)
再使用describe()
函数进行简单的统计描述:
data.describe() #简单统计描述
![](https://filescdn.proginn.com/3d41112c0046bfdacf7ce34f41d09b43/2b96f6193fb6a41a81d82f462a45c29d.webp)
散点图
gp = data.groupby(by = "学校",as_index=False) #以学校为分组依据进行分组
data1=gp.mean() #分组后的聚合运算为计算均值
data1.head()
得到结果:
![](https://filescdn.proginn.com/a4d7603b063ef9d890c01d8c161c16b3/10d5662dd60d284d5405a231073b71b3.webp)
# 绘制各学科成绩散点图
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(["语文","数学","英语"]);
![](https://filescdn.proginn.com/eb13422dc5179c01ae84343bc5997a38/db6c13c426cf259bdf57ab0fb61835cc.webp)
# 绘制各学科成绩散点图
plt.figure(figsize=(6,4))
plt.scatter(data1["总分"],data1["语文"],marker='v')
plt.title("各学校语文与总分成绩散点图",fontsize = 14)
plt.xlabel("总成绩")
plt.ylabel("各学科成绩")
plt.legend(["语文"])
#
![](https://filescdn.proginn.com/51a0c00ceff98b69393a74069202b6c7/750f3d3335e4cd57b867e57e895769ee.webp)
# 绘制各学科成绩散点图
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, '英语与总分成绩散点图')
,且散点图结果如下:
![](https://filescdn.proginn.com/efaadb28febb8e5e1a24a7c92c94c4ea/f0c5532611bdab06d46b03e277db335b.webp)
![](https://filescdn.proginn.com/3f4252467f0f184c4befe20c79ea809e/0f1fdab323742efb272d2f71d45bd303.webp)
![](https://filescdn.proginn.com/9991f33657954729a71d12c4e88d4dcc/dcd459cd58d62865f255d3dd1dd94fef.webp)
折线图
data1.head()
![](https://filescdn.proginn.com/6f9509689eb607067afb278a1e22d38a/0124f9bd75a85730606831ef3c8215f7.webp)
data1["序号"]=data1.学校.str.extract('(\d+)')
data1
![](https://filescdn.proginn.com/1ccdcf08f1e092639d57b1028ea4cffb/6999982c8df868996609937a882ca329.webp)
![](https://filescdn.proginn.com/a135fb3aab9b23ae6f9e4faa1fd3df78/58e13cc7cb7c85aba7243ff85129d560.webp)
ser1 = data1.序号
ser1
得到输出:
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 1
11 20
12 21
13 2
14 3
15 4
16 5
17 6
18 7
19 8
20 9
Name: 序号, dtype: object
接着:
ser1 = ser1.astype("int")
ser1
得到输出:
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
10 1
11 20
12 21
13 2
14 3
15 4
16 5
17 6
18 7
19 8
20 9
Name: 序号, dtype: int32
可以尝试删除序号列,并且重设索引列:
del data1["序号"]
data1.index = ser1
data1
![](https://filescdn.proginn.com/0399039c6705e55a40274280b0bdafcf/20ad9cc5108f0da0e45bfc4863033036.webp)
![](https://filescdn.proginn.com/dba6a0ff999f016716f9718d5ee7a6d5/0fc2ec8836f405c5f9cdf1749e2388eb.webp)
再按照索引排序,可得到相应结果:
data1=data1.sort_index()
data1
![](https://filescdn.proginn.com/4cd3aee76042aa8afd1996a07287792d/2f865a31516939bd98ace1bff9bcb3bf.webp)
![](https://filescdn.proginn.com/b49836b94132a656f2d47fc3f4381fcf/0f43efda01ee3647bdc27ee1923e4c45.webp)
接着查看一共有多少行数据作为x轴数据
len(data1) # 21
再将各科成绩数据进行绘图,得到折线图结果:
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(['语文','数学','英语']);
![](https://filescdn.proginn.com/61f84c95e2d4c9f318f3e158ed20558e/5090a0bdff23c7624070c8bfb5f00230.webp)
直方图
yw = data1.loc[:,"学校":"语文"] #提取数据绘制直方图,直方图原理,每个需要被画图的标签对应一个数值
yw = yw.T
yw
![](https://filescdn.proginn.com/b2e39c45c1d21ac75d9b91d5cd487f89/8b283f48f666bb1213bf84039cbb79e2.webp)
yw.columns = yw.iloc[0] #将学校字段转换成列索引
yw1 = yw.drop("学校",axis=0) #删多余的行信息
yw1
![](https://filescdn.proginn.com/1a5e0e5c3effaa466e3679e8f0479c80/54c6d662421afceabd8117f085d85f34.webp)
再将语文成绩数据进行绘图,得到直方图结果:
# 每个学校语文平均成绩的直方图
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轴刻度为各学校名称
![](https://filescdn.proginn.com/03faa64a222fc497d4ab899ee84d67d5/ab6478e5ba6e6fde0958ac7c76f8c78b.webp)
sx = data1.loc[:,["学校","数学"]]
sx = sx.T
sx
![](https://filescdn.proginn.com/78a587bdf6ce36ac6fa1124504e50422/bb90f2d315bcac7af30f85e0061ac373.webp)
sx.columns = sx.iloc[0]
sx = sx.drop("学校",axis=0)
sx
![](https://filescdn.proginn.com/e353d936c7ff443c25b98b4880117f8e/91b93249dfd6870c34b9fb5d7ce1b0f7.webp)
再将数学平均成绩数据进行绘图,得到直方图结果:
# 每个学校数学平均成绩的直方图
plt.figure(figsize=(12,4))
plt.bar(range(21),sx.loc["数学",:],width=0.5)
plt.title("数学成绩直方图",fontsize = 14)
plt.ylabel("数学成绩",fontsize = 14)
plt.xticks(range(21),yw.iloc[0],rotation=30,fontsize = 12); #x轴刻度为各学校名称
![](https://filescdn.proginn.com/73addcb836f573b82740054688835731/7b0a609ead3f0a314357d01cc34e2987.webp)
将多个学科成绩画到一副图中
data1
![](https://filescdn.proginn.com/4e61a56f2af0779cefcb0f7162ac9416/02cc7cee5f87b4bda8f16e87bbb74281.webp)
![](https://filescdn.proginn.com/6941c40c2fb8e2dc488e6e9290d8be2f/3ec989f6bdda11097376ac3c58391e39.webp)
data2 = data1.drop("总分",axis = 1) #新建一个dataframe,删掉总分列,因为总分和单科成绩相差太多,影响绘图效果
data2.head()
![](https://filescdn.proginn.com/5dad9f6b0556118ce4b9e97ca9463d40/27d8ee1a5183db981c3b67f244f6caf6.webp)
# 将多个学科成绩画到一张图中 #截取前十
data2.plot.bar(x = '学校',y = ['语文','数学','英语'],figsize=(16,6),width=0.7,rot = 30,title = "各学科成绩直方图"); #rot空值标签倾斜程度
![](https://filescdn.proginn.com/b9ea726174bfae7761e2248a93d54b0d/684990014fcb0ecef4d7e35b77f52561.webp)
饼图
data2.head()
![](https://filescdn.proginn.com/c6ddf45613e2100e2d98b9054529a8fc/34b14f11e49e0226e1e8b975b40556f5.webp)
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里面都可以设定
![](https://filescdn.proginn.com/c6c33193f78848782eb3cfd592ec1ed2/36d9d7287919b48541212c162b6bccac.webp)
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);
![](https://filescdn.proginn.com/d7b52d7c4f90529a3cb0c960a83b8407/a1d2d324b7eb1869c5efddf8035b458a.webp)
箱型图
data.head()
![](https://filescdn.proginn.com/9ee324b531da815c65f259f7cf2e08d0/be202baf652ece13b09bead4bb841808.webp)
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
![](https://filescdn.proginn.com/c98e3d681a101827913d1966231bee93/3e1b4f15650ab6b1c9c4d509c682efdd.webp)
泰坦尼克号数据
text = pd.read_csv(r'result.csv')
text.head()
![](https://filescdn.proginn.com/34bad88364b0f0a85b52d132cd13675c/4631fa44f644b19c39dbf220aa6e364c.webp)
男女中生存人数分布情况
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar(color='chocolate')
plt.title('survived_count')
plt.show()
![](https://filescdn.proginn.com/4c555fac70bb6baa92043c49a2c7f584/e72d45f358612229af35ad659be38893.webp)
女性比男性生存人数多。
男女中生存人与死亡人数的比例
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')
# Text(0, 0.5, 'count')
![](https://filescdn.proginn.com/fcd7951a515c5cf8b37b12c5965d0bcb/1bf7f1cc41fb7a4396ea5330e2ed4430.webp)
男女性生存与死亡人数的占比偏差比较大。
不同票价的人生存和死亡人数分布情况
# 排序后绘折线图
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()
![](https://filescdn.proginn.com/5d2effda6b395c3823441a87af43df6c/28373045e64919aa6ea4b0655e399377.webp)
不同的票价所反映出来的生存人数是非常明显的,票价低的人死亡数量高是因为离甲板远,且逃生机会大大降低。
# 排序前绘折线图
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fig = plt.figure(figsize=(20, 18))
fare_sur1.plot(grid=True)
plt.legend()
plt.show()
![](https://filescdn.proginn.com/96b8997f25be8bed8e85b91164852173/62b41142512caa672c225de928613f8f.webp)
不同仓位等级的人生存和死亡人员的分布情况
# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=text)
#
![](https://filescdn.proginn.com/4580ae5a06881f64f4804583b7714087/a9b83154fda0a221da5b74c35956aa7e.webp)
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()
#
![](https://filescdn.proginn.com/4f61470cda966c0a501b88c2ed163ff8/e45aa44f53a1341812ca91982cb83021.webp)
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")
#
![](https://filescdn.proginn.com/cc855d9be8a08a5b7023f77380eca752/efd612f01f83a7bf1b3df71a96cc8822.webp)
往期精彩回顾
获取一折本站知识星球优惠券,复制链接直接打开:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群请扫码进群(如果是博士或者准备读博士请说明):
评论