柱形图
柱形图,又称长条图、柱状统计图、条图、条状图、棒形图,是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。柱形图在数据可视化中具有多种作用和用途,包括:
-
比较:柱形图是比较不同类别或组之间数量差异的常用工具。通过比较矩形条的高度或长度,可以直观地了解各个类别或组的数值大小,从而快速识别出最大值、最小值和趋势变化。
-
分布:柱形图可以显示数据的分布情况。通过观察矩形条的高度分布,可以了解数据集中在哪些区间或类别上,以及是否存在异常值或离群点。
-
排名:柱形图可以用于排名不同类别或组的顺序。根据矩形条的高度或长度,可以确定各个类别或组的排名顺序,从而帮助做出决策或优先级排序。
-
趋势:柱形图可以显示时间或其他变量对数量的影响。通过在不同时间点或变量上绘制矩形条,可以观察到数量的变化趋势,从而帮助预测未来的走势或做出战略决策。
-
强调:柱形图可以突出显示特定类别或组的重要性。通过增加特定类别或组的矩形条的颜色、阴影或标签,可以使其在图表中更加突出,吸引观察者的注意。
1.bar()
我们可以使用 pyplot 中的 bar() 方法来绘制柱形图。bar() 方法语法格式如下:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
2.参数说明
x:浮点型数组,柱形图的 x 轴数据。
height:浮点型数组,柱形图的高度。
width:浮点型数组,柱形图的宽度。
bottom:浮点型数组,底座的 y 坐标,默认 0。
align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。
**kwargs::其他参数。
简单柱形图
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, color = ["#4CAF50","red","hotpink","#556B2F"])
plt.show()
简单柱形图(纵向)
纵向的柱形图可以使用 barh() 方法来设置:
import matplotlib.pyplot as plt
import numpy as np
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.barh(x,y)
plt.show()
两组数据并列柱形图
并列柱形图在数据可视化中有以下几个主要作用:
-
比较多个类别或组:并列柱形图可以用于比较多个类别或组之间的数值差异。通过将柱形图并列在同一水平位置上,观察者可以直观地比较它们之间的高度差异,从而了解每个类别或组的数值特征。
-
显示关联关系:并列柱形图可以用于显示多个类别或组之间的关联关系。通过将柱形图并列在一起,观察者可以比较它们之间的相对大小和趋势,从而发现它们之间的关联或相互影响。
-
强调单个类别或组的变化:并列柱形图可以突出显示单个类别或组的变化情况。通过将柱形图放置在同一水平位置上,观察者可以直接比较它们的高度差异,进而了解每个类别或组的变化程度。
-
比较不同属性或指标:并列柱形图还可以用于比较不同属性或指标在多个类别或组之间的差异。通过并列柱形图,可以在同一图表中同时显示多个属性或指标的数值,从而方便比较它们之间的差异和关系。
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(9, 9))
n = 5
X = np.arange(n) + 1.0
width = 0.3
# width:柱的宽度
# X是1,2,3,4,5,6,7,8,柱的个数
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
# uniform均匀分布的随机数,normal是正态分布的随机数,0.5-1均匀分布的数,一共有n个
Y1 = np.random.uniform(0.5, 1.0, n)
Y2 = np.random.uniform(0.5, 1.0, n)
plt.bar(X - width/2, Y1, width=width, facecolor='lightskyblue', label='1')
plt.bar(X + width/2, Y2, width=width, facecolor='yellowgreen', label='2')
# 功能1
x_labels = ["G1", "G2", "G3", "G4", "G5"]
# 用第1组...替换横坐标x的值
plt.xticks(X, x_labels)
# 水平柱状图plt.barh,属性中宽度width变成了高度height
# 打两组数据时用+
# facecolor柱状图里填充的颜色
# edgecolor是边框的颜色
# 想把一组数据打到下边,在数据前使用负号
# plt.bar(X, -Y2, width=width, facecolor='#ff9999', edgecolor='white')
# 给图加text
# 显示图例
plt.legend()
for x, y in zip(X, Y1):
plt.text(x - width/2, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x + width/2, y + 0.005, '%.2f' % y, ha='center', va='bottom')
# plt.ylim(0, +1.25)
plt.show()
三组数据并列柱形图
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(9, 9))
n = 5
X = np.arange(n) + 1.0
width = 0.3
# width:柱的宽度
# X是1,2,3,4,5,6,7,8,柱的个数
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
# uniform均匀分布的随机数,normal是正态分布的随机数,0.5-1均匀分布的数,一共有n个
Y1 = np.random.uniform(0.5, 1.0, n)
Y2 = np.random.uniform(0.5, 1.0, n)
Y3 = np.random.uniform(0.5, 1.0, n)
plt.bar(X - width, Y1, width=width, facecolor='lightskyblue', label='1')
plt.bar(X, Y2, width=width, facecolor='yellowgreen', label='2')
plt.bar(X + width, Y3, width=width, facecolor='red', label='3')
# 功能1
x_labels = ["G1", "G2", "G3", "G4", "G5"]
# 用第1组...替换横坐标x的值
plt.xticks(X, x_labels)
# 水平柱状图plt.barh,属性中宽度width变成了高度height
# 打两组数据时用+
# facecolor柱状图里填充的颜色
# edgecolor是边框的颜色
# 想把一组数据打到下边,在数据前使用负号
# plt.bar(X, -Y2, width=width, facecolor='#ff9999', edgecolor='white')
# 给图加text
# 显示图例
plt.legend()
for x, y in zip(X, Y1):
plt.text(x - width, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y3):
plt.text(x + width, y + 0.005, '%.2f' % y, ha='center', va='bottom')
# plt.ylim(0, +1.25)
plt.show()
四组数据并列柱形图
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(12, 9))
n = 5
X = np.arange(n) + 1.0
width = 0.2
# width:柱的宽度
# X是1,2,3,4,5,6,7,8,柱的个数
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
# uniform均匀分布的随机数,normal是正态分布的随机数,0.5-1均匀分布的数,一共有n个
Y1 = np.random.uniform(0.5, 1.0, n)
Y2 = np.random.uniform(0.5, 1.0, n)
Y3 = np.random.uniform(0.5, 1.0, n)
Y4 = np.random.uniform(0.5, 1.0, n)
plt.bar(X - 3*width/2, Y1, width=width, facecolor='lightskyblue', label='1')
plt.bar(X - width/2, Y2, width=width, facecolor='b', label='2')
plt.bar(X + width/2, Y3, width=width, facecolor='yellowgreen', label='3')
plt.bar(X + 3*width/2, Y4, width=width, facecolor='r', label='4')
# 功能1
x_labels = ["G1", "G2", "G3", "G4", "G5"]
# 用第1组...替换横坐标x的值
plt.xticks(X, x_labels)
# 水平柱状图plt.barh,属性中宽度width变成了高度height
# 打两组数据时用+
# facecolor柱状图里填充的颜色
# edgecolor是边框的颜色
# 想把一组数据打到下边,在数据前使用负号
# plt.bar(X, -Y2, width=width, facecolor='#ff9999', edgecolor='white')
# 给图加text
# 显示图例
plt.legend()
for x, y in zip(X, Y1):
plt.text(x - 3*width/2, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x - width/2, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y3):
plt.text(x + width / 2, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y4):
plt.text(x + 3*width / 2, y + 0.005, '%.2f' % y, ha='center', va='bottom')
# plt.ylim(0, +1.25)
plt.show()
堆叠柱形图
堆叠柱形图在数据可视化中有以下几个主要作用:
-
比较组成部分:堆叠柱形图可以用于比较多个类别或组的不同部分在整体中的贡献程度。通过堆叠不同的柱形图,每个柱形图表示一个类别或组,可以直观地比较它们在整体中的相对大小。这对于展示数据的组成结构、分析各部分之间的比例和趋势非常有用。
-
显示累积效果:堆叠柱形图可以显示多个类别或组的累积效果。每个堆叠柱形图的高度表示该类别或组的总值,而柱形图中的每个部分表示该部分的贡献。通过堆叠不同的柱形图,可以清晰地展示累积效果,例如各类别或组的总销售额随时间的变化情况。
-
强调总体趋势:堆叠柱形图可以帮助观察者更容易地发现总体趋势。通过比较堆叠柱形图的整体高度,可以直观地判断不同类别或组之间的总体增长或减少趋势。这对于分析数据的总体变化、发现异常情况以及做出决策非常有帮助。
-
可视化数据分布:堆叠柱形图还可以用于可视化数据的分布情况。通过堆叠不同的柱形图,可以看到每个部分在整体中的相对比例,从而了解数据的分布特征。这对于发现数据的偏差、异常或集中情况非常有用。
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(9, 12))
n = 5
X = np.arange(n) + 1.0
width = 0.3
# width:柱的宽度
# X是1,2,3,4,5,6,7,8,柱的个数
# numpy.random.uniform(low=0.0, high=1.0, size=None), normal
# uniform均匀分布的随机数,normal是正态分布的随机数,0.5-1均匀分布的数,一共有n个
Y1 = np.random.uniform(0.5, 1.0, n)
Y2 = np.random.uniform(0.5, 1.0, n)
Y3 = np.random.uniform(0.5, 1.0, n)
Y11 = np.random.uniform(0.5, 1.0, n)
Y22 = np.random.uniform(0.5, 1.0, n)
Y33 = np.random.uniform(0.5, 1.0, n)
plt.bar(X - width, Y1, width=width, facecolor='b', label='1-bottle')
plt.bar(X - width, Y11, width=width, bottom=Y1, facecolor='lightskyblue', label='1-top')
plt.bar(X, Y2, width=width, facecolor='g', label='2-bottle')
plt.bar(X, Y22, width=width, bottom=Y2, facecolor='yellowgreen', label='2-top')
plt.bar(X + width, Y3, width=width, facecolor='red', label='3-bottle')
plt.bar(X + width, Y33, bottom=Y3, width=width, facecolor='y', label='3-top')
# 功能1
x_labels = ["G1", "G2", "G3", "G4", "G5"]
# 用第1组...替换横坐标x的值
plt.xticks(X, x_labels)
# 水平柱状图plt.barh,属性中宽度width变成了高度height
# 打两组数据时用+
# facecolor柱状图里填充的颜色
# edgecolor是边框的颜色
# 想把一组数据打到下边,在数据前使用负号
# plt.bar(X, -Y2, width=width, facecolor='#ff9999', edgecolor='white')
# 给图加text
# 显示图例
plt.legend()
for x, y in zip(X, Y1+Y11):
plt.text(x - width, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2+Y22):
plt.text(x, y + 0.005, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y3+Y33):
plt.text(x + width, y + 0.005, '%.2f' % y, ha='center', va='bottom')
# plt.ylim(0, +1.25)
plt.show()