在众多的剖析图表中,柱状图直方图算是特别容易被混淆的两种图,因为它们在外形上十分相似。
比方:

明晰柱状图和直方图的区别

而实际上,它们所表达的含义和使用的场景却彻底不同。

1. 概念

柱状图,是一种运用矩形条,对不同类别进行数值比较的计算图表。
在柱状图上,分类变量的每个实体都被表明为一个矩形(通俗讲即为“柱子”),而数值则决定了柱子的高度。

直方图,又称质量散布图,用于表明数据的散布状况。
一般用横轴表明数据区间,纵轴表明散布状况,柱子越高,则落在该区间的数量越大。

从概念上看,相同是柱子,含义不同就很大,一个表明的是每种分类的数值,一个表明的则是某个区间内数据的数量
一个是,一个是;一个是比较大小状况,一个是看散布状况;一个是离散的,一个是连续的。

从它们的概念上就能看出会用在彻底不一样的剖析场景中。

2. 使用场景

从使用场景上更容易区别两种图形的不同点。

2.1. 适用柱状图而不适用直方图

以下适用柱状图的剖析场景,用直方图很难表达:

  • 比较不同类别的数据,例如比较不同产品的销售量。直方图首要用于展现数据的散布状况,而不适合比较不同类别的数据。
  • 显现数据的变化趋势,例如展现某个产品在不同时刻段的销售额。柱状图能够将不同时刻段的数据以不同的柱子展现,而直方图无法有效地表明时刻变化的趋势。
  • 比较不同组织或区域的数据,例如比较不同城市的人口数量。柱状图能够将不同组织或区域的数据以不同的柱子展现,而直方图无法有效地进行比较。
  • 可视化数据的散布状况,例如展现不同年龄段的人口份额。柱状图能够将不同年龄段的数据以不同的柱子展现,而直方图首要用于表明连续变量的散布状况,不适合表明离散变量的份额。

2.2. 适用直方图而不适用柱状图

以下适用直方图的剖析场景,用柱状图很难表达:

  • 表明连续变量的散布状况,例如展现一个班级学生的身高散布。柱状图适用于离散变量,不能有效地表明连续变量的散布状况。
  • 剖析数据的频率散布,例如计算一个城市每天的交通拥堵指数。直方图能够显现不同数值规模的频率散布状况,而柱状图只能显现各个类别的计数。
  • 探究数据的异常值,例如查看一组温度数据中是否存在异常高或低的值。直方图能够经过调查数据的散布状况来检测异常值,而柱状图无法供给相同的信息。
  • 比较不同组的数据散布,例如比较男性和女人的体重散布。直方图能够将不同组的数据散布在同一图表中进行比较,而柱状图只能比较同一组的不同类别的数据。

3. 剖析示例

最后,经过实际的数据来演示两种图形在实战中的区别。
基于用相同的数据,制作两种图形,来直观的理解在实际剖析场景中如何选择这两类图形。

接下来运用王者荣耀KPL2023春季赛的相关数据进行剖析,制作柱状图和直方图。
数据来历王者荣耀官网,能够从下面的网址中下载:
databook.top/wzry/2023-s…

其间包括3个数据文件:

  1. league-2023春季赛.csv 战队数据
  2. player-2023春季赛.csv 选手数据
  3. hero-2023春季赛.csv 英豪数据

3.1. 选手参赛场次的剖析

读取数据:

import pandas as pd
df = pd.read_csv("d:/share/data/player-2023春季赛.csv")
data = df.loc[:, ["选手", "竞赛场次"]]
data

明晰柱状图和直方图的区别

一共有125条数据。

依据每个选手的竞赛场次,制作柱状图。

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
names = data["选手"].tolist()
ax.bar(names, data["竞赛场次"])
ax.set_xticklabels([])
ax.set_title("各个选手的竞赛场次")

明晰柱状图和直方图的区别

图中每个柱子表明的是每个选手的竞赛场次。
横轴每个刻度就是一个选手。

依据每个选手的竞赛场次,制作直方图。

fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.hist(data["竞赛场次"], bins=10)
ax.set_title("选手的竞赛场次散布状况")

明晰柱状图和直方图的区别

这里的横轴表明选手参与的场次,相当于柱状图的纵轴的含义。
纵轴是选手的人数,柱子的高度表明在区间规模内的选手个数。
经过直方图,能够了解到的信息是

  1. 参与 1~10场竞赛的选手最多
  2. 参与60场以上的选手也不少,说明各个战队的首发阵型还是比较稳定的。

制作直方图的代码中,我们设置了 bins=10,就是将竞赛场次分为10个区间
上面的数据中,最小的竞赛场次1,最大竞赛场次91,所以各个区间规模是:
1~10,10~19。。。82~91

3.2. 各个战队的胜率剖析

读取数据:

df = pd.read_csv("d:/share/data/league-2023春季赛.csv")
data = df.loc[:, ["战队", "胜率"]]
data["胜率"] = data["胜率"].str.replace("%", "")
data["胜率"] = data["胜率"].astype("float")
data

明晰柱状图和直方图的区别

依据每个战队的胜率,制作柱状图。

import matplotlib.ticker as mticker
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
names = data["战队"].tolist()
ax.bar(names, data["胜率"])
plt.xticks(rotation=90)
yticks = ax.get_yticks().tolist()
ax.yaxis.set_major_locator(mticker.FixedLocator(yticks))
ax.set_yticklabels(["{}%".format(x) for x in yticks])
ax.set_title("各个战队的胜率")

明晰柱状图和直方图的区别

从剖析成果能够看出:

  1. 大部分战队的胜率差不多
  2. 战队是依照名次从左到右排列的,胜率基本是跟着名次的下降也在缓慢下降的

依据每个战队的胜率,制作直方图。

fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.hist(data["胜率"], bins=5)
xticks = ax.get_xticks().tolist()
ax.xaxis.set_major_locator(mticker.FixedLocator(xticks))
ax.set_xticklabels(["{}%".format(x) for x in xticks])
ax.set_title("一切战队胜率散布状况")

明晰柱状图和直方图的区别

从直方图的成果能够看出,大部分战队的胜率在 40%~60% 左右。

3.3. 剖析总结

从上面两个剖析场景中,能够看出,

  1. 相同的数据,既能够制作柱状图,也能够制作直方图
  2. 两种图形展现的剖析成果,含义彻底不同
  3. 第一个剖析示例(选手参赛场次的剖析)中,更适合用直方图来剖析。
    1. 因为选手比较多,用柱状图看每个选手的竞赛场次含义不大
    2. 直方图看选手竞赛场次的散布更有含义。
  4. 第二个剖析示例(各个战队的胜率剖析)中,更适合用柱状图来剖析。
    1. 柱状图的话,不仅能够看到胜率状况,能够看到胜率和排名的联系
    2. 数据量太小,用直方图看散布含义不大