matplotlib练习:散点图、折线图、直方图、饼图、箱线图

matplotlib练习:散点图、折线图、直方图、饼图、箱线图

声明

本人小白,在学习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数据分析与应用》

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用matplotlib绘制上海市2016年全年用电量的散点图折线图、柱状图、饼图箱线图的代码示例: 散点图: ```python import matplotlib.pyplot as plt import pandas as pd # 读取数据 df = pd.read_csv("electricity.csv") # 绘制散点图 plt.scatter(df["month"], df["electricity"], marker="o") # 设置标题和坐标轴标签 plt.title("Shanghai Electricity Consumption in 2016") plt.xlabel("Month") plt.ylabel("Electricity Consumption (10^8 kWh)") # 显示图形 plt.show() ``` 折线图: ```python import matplotlib.pyplot as plt import pandas as pd # 读取数据 df = pd.read_csv("electricity.csv") # 绘制折线图 plt.plot(df["month"], df["electricity"]) # 设置标题和坐标轴标签 plt.title("Shanghai Electricity Consumption in 2016") plt.xlabel("Month") plt.ylabel("Electricity Consumption (10^8 kWh)") # 显示图形 plt.show() ``` 柱状图: ```python import matplotlib.pyplot as plt import pandas as pd # 读取数据 df = pd.read_csv("electricity.csv") # 绘制柱状图 plt.bar(df["month"], df["electricity"]) # 设置标题和坐标轴标签 plt.title("Shanghai Electricity Consumption in 2016") plt.xlabel("Month") plt.ylabel("Electricity Consumption (10^8 kWh)") # 显示图形 plt.show() ``` 饼图: ```python import matplotlib.pyplot as plt import pandas as pd # 读取数据 df = pd.read_csv("electricity.csv") # 绘制饼图 plt.pie(df["electricity"], labels=df["month"]) # 设置标题 plt.title("Shanghai Electricity Consumption in 2016") # 显示图形 plt.show() ``` 箱线图: ```python import matplotlib.pyplot as plt import pandas as pd # 读取数据 df = pd.read_csv("electricity.csv") # 绘制箱线图 plt.boxplot(df["electricity"]) # 设置标题和坐标轴标签 plt.title("Shanghai Electricity Consumption in 2016") plt.ylabel("Electricity Consumption (10^8 kWh)") # 显示图形 plt.show() ``` 需要注意的是,代码中的数据文件名为“electricity.csv”,您需要替换成您自己的数据文件名,并且确保数据文件的格式与代码中的格式一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值