声明
本人小白,在学习python数据分析与应用,这个是课后作业,为了方便以后应用时查看,特此记录。仅供参考,互相学习。
数据集
链接:https://pan.baidu.com/s/1KKpqtBTBz_81dZanemKWzQ
提取码:y6h5
1996-2015年人口数量数据集:population.npz
鸢尾花数据集:iris.npz
共150行数据,仅展现部分
实训1
人口数据总共拥有6个特征,分别为年末总人口、男性人口、女性人口、城镇人口、乡村人口和年份。查看各个特征随着时间推移发生的变化情况。
散点图+折线图
import numpy as np
import matplotlib.pyplot as plt
#画图识别中文
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#(1)读取并处理数据
data = np.load("populations.npz",allow_pickle=True)
values = data["data"]
name = data["feature_names"]
#删除日期里的汉字
for temp in range(19,-1,-1):
values[temp][0] = values[temp][0][:-1]
#删除后两行的nan
values=np.delete(values,-1,0)
values=np.delete(values,-1,0)
values=np.flipud(values)#翻转操作
print(values)
print(name)
# (2)建立画布并添加子图
p1=plt.figure(figsize=(12,15))
ax1 = p1.add_subplot(2,1,1)
plt.ylim(0,250000)
#(3)绘制散点图
plt.title('1996-2015年人口数据变化图')
plt.xlabel('年份')
plt.ylabel('人口数据')
x = values[:,0]
col = ['r','b','g','y','black']
label_list = name[1:]
for i in range(1,6,1):
plt.scatter(x,values[:,i],c=col[i-1],label=label_list[i-1])
plt.legend()
#(4)绘制折线图
ax2 = p1.add_subplot(2,1,2)
plt.ylim(0,250000)
plt.title('1996-2015年人口数据变化图')
plt.xlabel('年份')
plt.ylabel('人口数据')
for i in range(1,6,1):
plt.plot(x,values[:,i],marker = '*',c=col[i-1],label=label_list[i-1])
plt.legend()
plt.savefig('./savefig/1996-2015年人口数据变化图.png')
plt.show()
结果
实训二
通过绘制各年份男女人口数目及城乡人口数目的直方图,男女人口比例及城乡人口比例的饼图可以发现人口结构的变化。而绘制每个特征的箱线图则可以发现不同特征的增长或减少的速率是否变得缓慢。
直方图
import numpy as np
import matplotlib.pyplot as plt
#画图识别中文
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#(1)读取并处理数据
data = np.load("populations.npz",allow_pickle=True)
values = data["data"]
name = data["feature_names"]
#删除日期里的汉字
for temp in range(19,-1,-1):
values[temp][0] = values[temp][0][:-1]
#删除后两行的nan
values=np.delete(values,-1,0)
values=np.delete(values,-1,0)
values=np.flipud(values)#翻转操作
print(values)
print(name)
#(2)男女人口数目直方图
p1 = plt.figure(figsize=(18,20))
ax1 = p1.add_subplot(2,1,1)
plt.ylim(0,80000)
plt.title('1996-2015年男女人口数目对比直方图')
plt.xlabel('年份')
plt.ylabel('人口数据')
#(2.1)数据二次处理
sex = ('男','女')
year = []
for i in values:
year.append(i[0])
population = [[],[]]
for i in values:
population[0].append(i[2])
population[1].append(i[3])
bar_width = 0.4
x = np.arange(len(year))
#(2.2)画两种柱状图,编程思维:只要第二个柱状图的横坐标+第一个柱状图的宽度,他们就会贴在一起
rects1 = plt.bar(x,population[0],bar_width,color='r',label = sex[0])
rects2 = plt.bar(x+bar_width,population[1],bar_width,color='y',label = sex[1])
plt.xticks(x+0.2,year)#横坐标刻度
#添加数据标签
def add_labels(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2,height+500,height,ha='center',va='bottom',fontsize=9)#第一个height为标签纵坐标,第二个为数值
add_labels(rects1)
add_labels(rects2)
plt.legend()#添加图例
#(3)城乡人口数目直方图
ax2 = p1.add_subplot(2,1,2)#添加子图
plt.ylim(0,90000)
plt.title('1996-2015年城镇人口数目对比直方图')
plt.xlabel('年份')
plt.ylabel('人口数据')
place = ('城镇','乡村')
population_place = [[],[]]
for i in values:
population_place[0].append(i[4])
population_place[1].append(i[5])
#画两种柱状图,编程思维:只要第二个柱状图的横坐标+第一个柱状图的宽度,他们就会贴在一起
rects3 = plt.bar(x,population_place[0],bar_width,color='c',label = place[0])
rects4 = plt.bar(x+bar_width,population_place[1],bar_width,color='b',label = place[1])
plt.xticks(x+0.2,year)#横坐标刻度
add_labels(rects3)
add_labels(rects4)
plt.legend()#添加图例
plt.savefig('./savefig/1996-2015年男女人口数目及城乡人口数目直方图.png')#保存图片
plt.show()
结果
饼图
import numpy as np
import matplotlib.pyplot as plt
#画图识别中文
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#(1)读取并处理数据
data = np.load("populations.npz",allow_pickle=True)
values = data["data"]
name = data["feature_names"]
#删除日期里的汉字
for temp in range(19,-1,-1):
values[temp][0] = values[temp][0][:-1]
#删除后两行的nan
values=np.delete(values,-1,0)
values=np.delete(values,-1,0)
values=np.flipud(values)#翻转操作
print(values)
print(name)
p1 = plt.figure(figsize=(30,24))#建立画布4:5(总共20个子图,5行4列)
label = ['男','女']
explode = [0.01,0.01]
year = 1996
for i in range(20):
ax = p1.add_subplot(5,4,i+1)
plt.title('{}年男女人口比例饼状图'.format(year))
year+=1
plt.pie(values[i,2:4],explode=explode,labels=label,autopct='%1.1f%%')
plt.legend()
plt.show()
p2 = plt.figure(figsize=(30,24))#建立画布4:5(总共20个子图,5行4列)
label = ['城镇','乡村']
explode = [0.01,0.01]
year = 1996
for i in range(20):
ax = p2.add_subplot(5,4,i+1)
plt.title('{}年城乡人口比例饼状图'.format(year))
year+=1
plt.pie(values[i,4:6],explode=explode,labels=label,autopct='%1.1f%%')
plt.legend()
plt.savefig('./savefig/1996-2015年城乡人口比例变化饼状图.png')
plt.show()
结果
男女人口变化:
城镇人口变化:
箱线图
import numpy as np
import matplotlib.pyplot as plt
#画图识别中文
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#(1)读取并处理数据
data = np.load("populations.npz",allow_pickle=True)
values = data["data"]
name = data["feature_names"]
#删除日期里的汉字
for temp in range(19,-1,-1):
values[temp][0] = values[temp][0][:-1]
#删除后两行的nan
values=np.delete(values,-1,0)
values=np.delete(values,-1,0)
values=np.flipud(values)#翻转操作
print(values)
print(name)
pop = (list(values[:,1]),list(values[:,2]),list(values[:,3]),list(values[:,4]),list(values[:,5]))
label = name[1:]
print(pop)
print(label)
p = plt.figure(figsize=(15,12))
plt.title('1996-2015年人口变化箱线图')
plt.ylabel('人口数量')
plt.boxplot(pop,notch=True,labels=label,meanline=True)
plt.savefig('./savefig/1996-2015年人口变化箱线图')
plt.show()
结果
操作题
散点图
(1)读取鸢尾花数据集,使用循环和子图绘制各个特征之间的散点图
import numpy as np
import matplotlib.pyplot as plt
#画图识别中文
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#(1)读取并处理数据
data = np.load("iris.npz",allow_pickle=True)
values = data['data']
features = data['features_name']
# x = np.arange(len(values))
#筛选鸢尾花种类
label_list = values[:,-1]
label_list = list(set(label_list))
p1 = plt.figure(figsize=(15,15))#建立画布
col = ['r','b','g']
name = ['sepal','petal']
for i in range(2):#2副子图
ax = p1.add_subplot(2,1,i+1)
plt.title('鸢尾花{}特征的散点图'.format(name[i]))
plt.xlabel('{}'.format(features[i*2]))
plt.ylabel('{}'.format(features[i*2+1]))
for j in range(3):#3种花,每副子图画3次scatter
#根据花的类别,将特征筛选出来
values_temp = []
for k in values:
if k[4] == label_list[j]:
values_temp.append(list(k))
values_temp = np.delete(values_temp, -1, axis=1)
values_temp = np.array(values_temp,float)#变成标准矩阵
#统计重复覆盖的点的个数
# count = 0
# for p in range(50):
# for q in range(p+1,50):
# if values_temp[p][i*2] == values_temp[q][i*2] and values_temp[p][i*2+1]==values_temp[q][i*2+1]:
# count+=1
# print(count)
plt.scatter(values_temp[:,i*2],values_temp[:,i*2+1],label = label_list[j],c=col[j])
plt.legend()
plt.savefig('./savefig/鸢尾花特征散点图')
plt.show()
结果
备注:画出来的点数量与数据数量不符,我统计过有不少点是相同的,我认为是点覆盖所导致的
箱线图
(2)绘制各个特征的箱线图,查看是否存在异常值
import numpy as np
import matplotlib.pyplot as plt
#画图识别中文
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#(1)读取并处理数据
data = np.load("iris.npz",allow_pickle=True)
values = data['data']
features = data['features_name']
print(features)
# x = np.arange(len(values))
#筛选鸢尾花种类
label_list = values[:,-1]
label_list = list(set(label_list))
iris = (list(values[:,0]),list(values[:,1]),list(values[:,2]),list(values[:,3]))
# iris = np.array(iris,float)
label = features[:-1]
print(iris)
print(label)
p = plt.figure(figsize=(15,12))
plt.title('鸢尾花各个特征箱线图')
plt.ylabel('length_or_width')
plt.boxplot(iris,notch=True,labels=label,meanline=True)
plt.savefig('./savefig/鸢尾花各个特征箱线图')
plt.show()
结果
参考资料
Python绘制精美图表之双柱形图:https://segmentfault.com/a/1190000004103325
书:《python数据分析与应用》