数据分析——matplotlib(4)绘制常用统计图

上一节:数据分析——matplotlib(3)图片的基本操作

matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等。之前我们使用matplotlib绘制了折线图,这一次我们试着绘制其它几种常用统计图。

先简单对比一下常用的统计图

  1. 折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
    特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

  2. 散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
    之间是否存在某种关联或总结坐标点的分布模式。
    特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

  3. 条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
    特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)

  4. 直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。
    一般用横轴表示数据范围,纵轴表示分布情况。
    特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)

散点图

方法:scatter(x,y)

例:
假如有某地三月、四月两组气温数据:
[11,17,15,11,12,10,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,14,15,15,19,21,23,22,22,23] ,
[25,26,28,19,21,17,16,20,18,20,20,19,22,23,17,20,21,20,22,16,11,15,5,13,17,10,11,14,12,13],
请使用散点图进行展示。

#绘制图形
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

#设置图片
plt.figure(figsize=(12,8),dpi=80)
#绘制散点图

#y轴
march_y = [11,17,15,11,12,10,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,14,15,15,19,21,23,22,22,23] #三月气温
april_y = [25,26,28,19,21,17,16,20,18,20,20,19,22,23,17,20,21,20,22,16,11,15,5,13,17,10,11,14,12,13] #四月气温

#设置x轴
march_x = range(1,32)
april_x = range(41,71)

#绘制散点图
plt.scatter(march_x,march_y)
plt.scatter(april_x,april_y)

#展示
plt.show()

效果
在这里插入图片描述
完善

#绘制散点图

#y轴
march_y = [11,17,15,11,12,10,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,14,15,15,19,21,23,22,22,23] #三月气温
april_y = [25,26,28,19,21,17,16,20,18,20,20,19,22,23,17,20,21,20,22,16,11,15,5,13,17,10,11,14,12,13] #四月气温

#设置x轴
march_x = range(1,32)
april_x = range(41,71)

#绘制散点图
plt.scatter(march_x,march_y,label='三月气温')
plt.scatter(april_x,april_y,label='四月气温')

#设置坐标刻度单位
_x = list(march_x) + list(april_x)
_xticks = ['三月{}日'.format(i) for i in march_x]
_xticks += ['四月{}日'.format(i-40) for i in april_x]
plt.xticks(_x[::3],_xticks[::3],rotation=45)

#标题
plt.title('某地区三、四月份气温变化图',fontsize=20)
plt.xlabel('月份',fontsize=15)
plt.ylabel('气温',fontsize=15)

#图例
plt.legend(loc='upper left')

#展示
plt.show()

效果
在这里插入图片描述

条形图

方法:竖条形图——bar(x,y)、横条形图——barh(x,y)

例:
假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?

a = [“战狼2”,“速度与激情8”,“功夫瑜伽”,“西游伏妖篇”,“变形金刚5:最后的骑士”,“摔跤吧!爸爸”,“加勒比海盗5:死无对证”,“金刚:骷髅岛”,“极限特工:终极回归”,“生化危机6:终章”,“乘风破浪”,“神偷奶爸3”,“智取威虎山”,“大闹天竺”,“金刚狼3:殊死一战”,“蜘蛛侠:英雄归来”,“悟空传”,“银河护卫队2”,“情圣”,“新木乃伊”,]

b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 单位:亿

#绘制条形图

movie_name = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]

box_office=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#标题
plt.title('2017年电影票房统计')
plt.xlabel('电影名称')
plt.ylabel('票房')

#绘制条形图
#竖条形图,width:每一条宽度
plt.bar(range(len(movie_name)),box_office,width=0.3)

plt.xticks(range(len(movie_name)),movie_name,rotation=45)

#展示
plt.show()

效果
在这里插入图片描述
这里可以看到,电影名因名称长度发生了错位,为了更加清晰准确的展示电影名,我们可以采用横条形图进行展示。

#绘制条形图

movie_name = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]

box_office=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#标题
plt.title('2017年电影票房统计')
plt.xlabel('电影名称')
plt.ylabel('票房')

#绘制条形图
#竖条形图,width:每一条宽度
# plt.bar(range(len(movie_name)),box_office,width=0.3)
#横条形图,height:每一条高度
plt.barh(range(len(movie_name)),box_office,height=0.5)

# plt.xticks(range(len(movie_name)),movie_name,rotation=45)
plt.yticks(range(len(movie_name)),movie_name)

#展示
plt.show()

效果
在这里插入图片描述

直方图

方法:hist(原始数据,组数)
那么,把原始数据分为多少组进行统计呢?(见下图)
在这里插入图片描述
例:

#绘制直方图

import random

a = []
for i in range(100):
    a.append(random.randint(0,99))

#组距
bin_width = 3

#组数
num_bins = (max(a) - min(a))//bin_width

#绘制直方图
plt.hist(a,num_bins)

plt.xticks(range(min(a),max(a)+1)[::bin_width])

plt.grid()
plt.show()

效果
在这里插入图片描述
上图可以看到,网格并没有对齐,这时候我们可以传入一个列表作为组数。

#绘制直方图
plt.hist(a,[min(a) + i*bin_width for i in range(num_bins+1)])

效果
在这里插入图片描述
频率分布直方图

#绘制直方图
plt.hist(a,[min(a) + i*bin_width for i in range(num_bins)],normed=True) #normed/density:True时展示频率分布直方图

效果
在这里插入图片描述

注意: 直方图只能展示未处理的原始数据,比如:5-12岁:100人,13-18岁:120人 这类处理好的数据是不能直接使用直方图的,但可以使用条形图。

猜你喜欢

转载自blog.csdn.net/qq_35526165/article/details/102221156
今日推荐