柱状图
学习目标
- 目标
- 应用bar实现柱状图的绘制
- 知道柱状图的应用场景
- 应用
- 电影票房收入绘制
matplotlib能够绘制**折线图、柱状图、饼图、直方图、**散点图、热力图、K线图等,但是,我们需要知道不同的统计图到底能够表示出什么,以此来决定选择哪种统计图来更直观的呈现我们的数据
一、常见图形种类及意义
-
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
-
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制,连续性的数据展示一组或者多组数据的分布状况(统计)
-
柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
-
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
折线图:plot
- figure, plot,show
- xticks,yticks:设置刻度,中文
- xlabel,ylabel:设置坐标轴标题
- lengend:添加图例
- plt.subplots实现多个坐标系的图绘制
柱状图:bar
- 画出条形图:pyplot.bar(x, width, align=‘center’, **kwargs)
- 直方图:hist
- 组数:数据按照不同的范围分成几个组
- 组距:每一组两个端点的差
- pyplot.hist(x, bins=None, normed=None, kwargs)
- plt.grid(True, linestyle=’–’, alpha=0.5)
饼图:pie
- 应用场景:表示不同分类的占比情况
- API:plt.pie
- 绘制:注意显示正 圆形 plt.axis(“equal”)
- “%1.1f%%”:后一个位置的数字表示显示小数的位数
二、柱状图图绘制
需求:每部电影的票房收入对比?
1、画出每部电影的票房收入对比,效果如下:
电影数据如下图所示:
['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
[73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
2、绘制
- matplotlib.pyplot.bar(x, width, align=‘center’, **kwargs)
绘制柱状图
Parameters:
x : sequence of scalars.
width : scalar or array-like, optional
柱状图的宽度
align : {‘center’, ‘edge’}, optional, default: ‘center’
Alignment of the bars to the x coordinates:
‘center’: Center the base on the x positions.
‘edge’: Align the left edges of the bars with the x positions.
每个柱状图的位置对齐方式
**kwargs :
color:选择柱状图的颜色
Returns:
`.BarContainer`
Container with all the bars and optionally errorbars.
代码:
import matplotlib.pyplot as plt
# 设置条形图的大小、清晰度
plt.figure(figsize=(12, 6), dpi=80)
# 电影名称
movies_name = ['雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案', '寻梦环游记', '全球风暴', '降魔传', '追捕', '七十七天', '密战', '狂兽', '其它']
# 电影票房数
y = [73853, 57767, 22354, 15969, 14839, 8725, 8716, 8318, 7916, 6764, 52222]
# 放进横坐标的数字列表
x = range(len(movies_name))
y_ticks = range(80000)
# 画出条形图 !!!!!!注意:plot和bar的x参数必须是数字!!!!!
# width是柱状图的宽度, color表示每部电影对应的颜色
plt.bar(x, y, width=0.5, color=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g', 'y'])
# 修改刻度名称
plt.xticks(x, movies_name)
plt.yticks(y_ticks[::10000])
# 增加标题、x轴、y轴描述信息
plt.title("11月份电影票房对比")
plt.xlabel("电影名称")
plt.ylabel("票房数")
# 保存图像
plt.savefig("./movies.png")
# 显示图像
plt.show()
如何对比电影票房收入才更能加有说服力?
3、比较相同天数的票房
有时候为了公平起见,我们需要对比不同电影首日和首周的票房
3.1数据如下
movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']
first_day = [10587.6,10062.5,1275.7]
first_weekend=[36224.9,34479.6,11830]
数据来源: https://piaofang.maoyan.com/?ver=normal
效果如下:
3.2 分析
- 添加首日首周两部分的柱状图
- x轴中文坐标位置调整
代码:
import matplotlib.pyplot as plt
# 设置条形图的大小、清晰度
plt.figure(figsize=(12, 6), dpi=80)
# 电影名称
movies_name = ['雷神3:诸神黄昏', '正义联盟', '寻梦环游记']
# 首日首周票房数
first_day = [10587.6, 10062.5, 1275.7]
first_weekend = [36224.9, 34479.6, 11830]
# 放进横坐标的数字列表
x = range(len(movies_name))
y_ticks = range(40000)
# 画出条形图
# plt.bar(x, y, width=0.5, color=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'g', 'y'])
plt.bar(x, first_day, width=0.2, label="首日票房")
# 首周柱状图显示的位置在首日的位置右边
plt.bar([i + 0.2 for i in x], first_weekend, width=0.2, label="首周票房")
# 显示X轴中文,固定在首日和首周的中间位置
plt.xticks([i + 0.1 for i in x], movies_name)
plt.yticks(y_ticks[::5000])
# 增加标题、x轴、y轴描述信息
plt.title("11月份电影票房对比")
plt.xlabel("电影名称")
plt.ylabel("票房数")
# 显示图例
plt.legend(loc=0)
# 保存图像
plt.savefig("./movies.png")
# 显示图像
plt.show()
三、柱状图应用场景
适合用在分类数据对比场景上
- 数量统计
- 用户数量对比分析
直方图
学习目标
-
目标
- 应用hist实现直方图的绘制
- 知道直方图图的应用场景
-
应用
电影时长分布
一、直方图(Histogram)介绍
直方图,形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。 在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。
相关概念:
- 组数:在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数称为组数
- 组距:每一组两个端点的差
二、电影时长分布绘制
现有250部电影的时长,希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?
数据:
time =[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
效果:
1、matplotlib.pyplot.hist(x, bins=None, normed=None, **kwargs)
直方图绘制
Parameters:
x : (n,) array or sequence of (n,) arrays ,x参数就是数据
bins : integer or sequence or ‘auto’, optional
组距,bins参数表示组数
normed : bool, optional
纵坐标的频率显示或者以頻数显示,默认頻数,值1为频率 , =1时纵坐标总频率为1
2、分析
- 设置组距
- 设置组数(通常对于数据较少的情况,分为5~12组,数据较多,更换图形显示方式)
- 通常设置组数会有相应公式:组数 = 极差/组距= (max-min)/bins
代码:
import matplotlib.pyplot as plt
# 展现不同电影的时长分布状态
plt.figure(figsize=(10, 6), dpi=100)
# 准备时长数据
time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130,
124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111, 78, 132, 124, 113, 150, 110,
117, 86, 95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119,
105, 137, 123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120,
114, 105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119,
140, 83, 110, 102, 123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109,
106, 123, 116, 131, 127, 115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,
136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141, 120, 117, 106, 149, 122, 122, 110, 118, 127,
121, 114, 125, 126, 114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92, 121, 112, 146, 97, 137, 105,
98, 117, 112, 81, 97, 139, 113, 134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137,
112, 120, 113, 133, 112, 83, 94, 146, 133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,
111, 133, 150]
# 定义一个间隔大小
a = 2
# 得出组数,必须是整数 极差除以间隔
bins = int((max(time) - min(time)) / a)
# 画出直方图
plt.hist(time, bins, normed=1)
# 指定刻度的范围,以及步长
plt.xticks(list(range(min(time), max(time)))[::2])
# 增加标题、x轴、y轴描述信息
plt.title("不同电影的时长分布状态")
plt.xlabel("电影时长大小")
plt.ylabel("电影的数据量")
# 增加网格显示
plt.grid(True, linestyle='--', alpha=0.5)
# 保存图像
plt.savefig("./movies.png")
# 显示图像
plt.show()
3、增加网格显示
为了更好将图形对应到
# 添加位置也是在show之前
plt.grid(True, linestyle='--', alpha=0.5)
三、直方图的场景
- 用于表示分布情况
- 通过直方图还可以观察和估计哪些数据比较集中,异常或者孤立的数据分布在何处
例如:用户年龄分布,商品价格分布
四、直方图与其他图表的对比
- 柱状图是以矩形的长度表示每一组的频数或数量,其宽度(表示类别)则是固定的,利于较小的数据集分析。
- 直方图是以矩形的长度表示每一组的频数或数量,宽度则表示各组的组距,因此其高度与宽度均有意义,利于展示大量数据集的统计结果。
- 由于分组数据具有连续性,直方图的各矩形通常是连续排列,而柱状图则是分开排列。
饼图
学习目标
- 目标
- 应用hist实现直方图的绘制
- 知道直方图图的应用场景
- 应用
- 电影时长分布
一、饼图(Pie)介绍
饼图广泛得应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。
二、饼图绘制
1、如果需要显示不同的电影的排片占比
1.1电影排片:
1.2数据:
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]
1.3效果
3、分析
- 注意显示的百分比的位数
- plt.pie(x, labels=,autopct=,colors)
- x:数量,自动算百分比
- labels:每部分名称
- autopct:占比显示指定%1.2f%%
- colors:每部分颜色
代码
# 展现每部电影的排片的占比
plt.figure(figsize=(20, 8), dpi=100)
# 准备每部电影的名字,电影的排片场次
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]
# 通过pie
plt.pie(place_count, labels=movie_name, autopct='%1.2f%%', colors=['b','r','g','y','c','m','y','k','c','g','g'])
# 指定显示的pie是正圆
plt.axis('equal')
plt.legend(loc='best')
plt.title("排片占比示意图")
plt.show()
4、添加axis
为了让显示的饼图保持圆形,需要添加axis保证长宽一样,就可以显示正圆了
plt.axis('equal')
三、饼图应用场景
- 分类的占比情况(不超过9个分类)
例如:班级男女分布占比,公司销售额占比