柱状图、直方图、饼图

时间:2024-04-12 09:09:43

柱状图

学习目标

  • 目标
    • 应用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个分类)

例如:班级男女分布占比,公司销售额占比