数据可视化 —— 柱形图应用(大全)

一、案例一:单柱形图

1.导入库

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

2.给窗口名称和画布大小

python 复制代码
plt.figure(num='单柱形图', figsize=(6, 4), facecolor='w')

3.定义x、y轴的数据

python 复制代码
# range(0-4)
x = np.arange(5)
# 创建数组
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])

4.添加样式

python 复制代码
# 柱形图的宽度
bar_width = 0.3
python 复制代码
plt.title('5个月平均温度柱形图', fontsize=15)
plt.ylabel('温度(度)', color='k', fontsize=12)

5.修改x标签

python 复制代码
plt.xticks(x, ['1月', '2月', '3月', '4月', '5月'], color='k', fontsize=12)

6.画图

python 复制代码
plt.bar(x, y1, width=bar_width)

7.添加数据数值

python 复制代码
# 头标
for a, b in zip(x, y1):
    plt.text(a, b, '%d' % b, ha='center')

8.添加图例

python 复制代码
plt.legend(('5个月平均温度', '各个月平均温度', '测试'), shadow=True, fancybox=True)

9.显示窗口

python 复制代码
plt.show()

二、案例二:多柱形图(学生成绩)

python 复制代码
# 导入用于绘图的matplotlib.pyplot库,在后续代码中可以使用plt这个别名来调用该库中的绘图函数,
# 例如plt.figure()用于创建图形窗口,plt.bar()用于绘制柱形图等
import matplotlib.pyplot as plt

# 导入用于科学计算的numpy库,它提供了高效的多维数组对象和各种数学函数,
# 例如np.arange()用于生成等差数列,方便后续设置x轴刻度位置
import numpy as np

# 创建一个新的图形窗口,通过num参数设置窗口的标题为'多柱形图',
# 方便用户识别当前打开的图形窗口对应的图表内容;
# figsize参数用于设置图形窗口的大小,这里设置宽为12英寸,高为7英寸,
# 可以根据实际需求调整图形的大小;
# facecolor参数用于设置图形窗口的背景颜色,'w'代表白色,使得图形窗口背景为白色
plt.figure(num='多柱形图', figsize=(12, 7), facecolor='w')

# 由于matplotlib默认字体可能不支持中文显示,通过设置plt.rcParams['font.sans-serif']为'KaiTi',
# 将matplotlib使用的字体修改为楷体,这样在图表中显示中文标题、标签等内容时就不会出现乱码问题
plt.rcParams['font.sans-serif'] = 'KaiTi'

# 使用numpy的arange函数生成一个从0到4的整数数组,
# 这个数组将用于表示x轴上的刻度位置,后续绘制柱形图时会根据这些位置来确定柱子的横坐标
x = np.arange(5)

# 初始化一个空列表y,这个列表将用于存储不同科目的成绩数据,
# 每个元素是一个包含5个学生该科目成绩的列表
y = []
# 向列表y中添加语文成绩数据,列表中的每个元素对应一个学生的语文成绩
y.append([100, 80, 70, 15, 77])
# 向列表y中添加数学成绩数据,同样每个元素对应一个学生的数学成绩
y.append([91, 64, 50, 100, 55])
# 向列表y中添加英语成绩数据,每个元素对应一个学生的英语成绩
y.append([13, 14, 93, 95, 77])

# 设置每个柱形图的宽度为0.2,这个宽度值会影响柱子在图表中的显示宽度,
# 需要根据实际情况调整,避免柱子之间重叠或者间隔过大
bar_width = 0.2

# 使用plt.title函数为图表添加标题,标题内容为'学生成绩柱形图',
# fontsize参数设置标题的字体大小为20,使得标题更加醒目;
# color参数设置标题的颜色为黑色('k'代表黑色),增强标题的可读性
plt.title('学生成绩柱形图', fontsize=20, color='k')
# 使用plt.xlabel函数为x轴添加标签,标签内容为'姓名',
# 表明x轴代表的是不同学生的姓名;
# fontsize参数设置标签的字体大小为15,让标签清晰可见
plt.xlabel('姓名', fontsize=15)
# 使用plt.ylabel函数为y轴添加标签,标签内容为'成绩(分)',
# 表明y轴代表的是学生的成绩,单位是分;
# fontsize参数设置标签的字体大小为15,方便用户识别
plt.ylabel('成绩(分)', fontsize=15)

# 使用plt.ylim函数设置y轴的显示范围,从0到100分,
# 这样可以确保图表中只显示0到100分这个区间内的成绩,使图表更加聚焦于有效数据
plt.ylim(0, 100)

# 使用plt.xticks函数移动x轴刻度标签的位置,
# x + bar_width将刻度标签的位置向右移动bar_width的距离,
# 使得刻度标签位于每个柱子组的中间位置;
# 同时设置x轴刻度标签为学生的姓名,依次为'小红'、'小明'、'小爱'、'小雪'、'小白',
# 方便用户对应每个柱子代表的学生
plt.xticks(x + bar_width, ['小红', '小明', '小爱', '小雪', '小白'])

# 使用for循环遍历不同科目的成绩数据,len(y)表示成绩数据列表y的长度,也就是科目的数量
for i in range(len(y)):
    # 使用plt.bar函数绘制每个科目的柱形图,
    # x + i * bar_width表示每个柱子的x轴位置,根据i的值进行偏移,
    # 确保不同科目的柱子依次排列,不会重叠;
    # y[i]表示当前科目的成绩数据,即每个学生在该科目上的成绩;
    # width=bar_width设置柱子的宽度为之前定义的bar_width
    plt.bar(x + i * bar_width, y[i], width=bar_width)
    # 为每个柱子添加数据标签,使用zip函数将每个柱子的x轴位置和对应的成绩组合成元组,
    # 方便后续在每个柱子顶部添加成绩数值
    for a, b in zip(x + i * bar_width, y[i]):
        # 使用plt.text函数在每个柱子的顶部添加成绩数值,
        # a表示标签的x轴位置,b表示标签的y轴位置,即柱子的顶部;
        # '%d' % b将成绩数值转换为整数格式的字符串作为标签内容;
        # ha='center'设置标签在柱子顶部居中显示,使图表更加美观
        plt.text(a, b, '%d' % b, ha='center')

# 使用plt.legend函数为图表添加图例,
# 图例中的标签分别为'语文成绩'、'数学成绩'、'英语成绩',
# 对应不同颜色的柱子代表的科目;
# shadow=True为图例添加阴影效果,增强图例的立体感;
# fancybox=True让图例的边框呈现圆角效果,使图例更加美观
plt.legend(['语文成绩', '数学成绩', '英语成绩'], shadow=True, fancybox=True)

# 使用plt.show函数显示绘制好的图表,将图形窗口展示给用户
plt.show()

三、案例三:3个分店的销售额

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

plt.figure(num='多柱形图', figsize=(14, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'

# 使用pandas的read_excel函数读取指定路径的Excel文件,
# 这里文件名为'2022年某店铺3个分店销售额.xlsx',并将读取的数据存储在DataFrame对象df中
df = pd.read_excel('2022年某店铺3个分店销售额.xlsx')

# 使用numpy的arange函数生成一个从0到指定长度的整数数组,
# 这里指定长度为DataFrame中'月份'列的元素数量,该数组将作为后续图表x轴的刻度位置
x = np.arange(len(df['月份']))

# 初始化一个空列表y,用于存储不同分店的销售额数据
y = []
# 将DataFrame中'第一分店'列的数据添加到列表y中,代表第一分店各月的销售额
y.append(df['第一分店'])
# 将DataFrame中'第二分店'列的数据添加到列表y中,代表第二分店各月的销售额
y.append(df['第二分店'])
# 将DataFrame中'第三分店'列的数据添加到列表y中,代表第三分店各月的销售额
y.append(df['第三分店'])

# 设置每个柱形图的宽度为0.2,这个宽度会影响柱形图在图表中的显示效果,
# 需要根据数据量和图表大小进行调整,避免柱子之间过于拥挤或过于稀疏
bar_width = 0.2

# 设置图表的标题为'2022年某店铺3个分店销售额',并将标题字体大小设置为20,
# 使标题更加醒目,方便用户快速了解图表的主题
plt.title('2022年某店铺3个分店销售额', fontsize=20)

# 设置图表x轴的标签为'月份',表明x轴代表的是不同的月份
plt.xlabel('月份')

# 设置图表y轴的标签为'销售额(万元)',表明y轴代表的是各分店的销售额,单位为万元,
# 同时将标签字体大小设置为15,使标签更加清晰
plt.ylabel('销售额(万元)', fontsize=15)

# 设置y轴的显示范围,从0到40,即只显示销售额在0到40万元之间的数据,
# 这样可以使图表聚焦于这个范围内的数据,避免显示无关的数值
plt.ylim(0, 40)

# 设置x轴的刻度标签位置和内容,将刻度标签的位置向右移动bar_width的距离,
# 使刻度标签位于每组柱子的中间位置,刻度标签内容为DataFrame中'月份'列的数据
plt.xticks(x + bar_width, df['月份'])

# 使用for循环遍历不同分店的销售额数据,len(y)表示列表y的长度,即分店的数量
for i in range(len(y)):
    # 绘制每个分店的柱形图,x + i * bar_width确定柱子的x轴位置,
    # 不同分店的柱子会依次排列,不会重叠;y[i]是该分店各月的销售额数据;
    # width=bar_width设置柱子的宽度为之前定义的宽度
    plt.bar(x + i * bar_width, y[i], width=bar_width)
    # 为每个柱子添加数据标签,使用zip函数将柱子的x轴位置和对应的销售额组合成元组,
    # 方便后续在每个柱子顶部添加销售额数值
    for a, b in zip(x + i * bar_width, y[i]):
        # 在每个柱子的顶部添加销售额数值,a是标签的x轴位置,b是标签的y轴位置,
        # '%.2f' % b将销售额数值格式化为保留两位小数的字符串,ha='center'使标签在柱子顶部居中显示
        plt.text(a, b, '%.2f' % b, ha='center')

# 绘制平均参考线,计算三个分店销售额的平均值,
# 先分别计算每个分店销售额的平均值,再将这三个平均值相加并除以3得到总的平均值
# linestyle='-'设置参考线的样式为实线,color='r'设置参考线的颜色为红色
plt.axhline(y=(sum(y[0]) / len(y[0]) + sum(y[1]) / len(y[1]) + sum(y[2]) / len(y[2])) / 3,
            linestyle='-',
            color='r')



# 为图表添加图例,图例中的标签依次为'平均工资'(此处可能有误,应为'平均销售额')、
# '第一分店'、'第二分店'、'第三分店',shadow=True为图例添加阴影效果,
# fancybox=True使图例的边框呈现圆角效果,增强图例的美观性
plt.legend(['平均工资', '第一分店', '第二分店', '第三分店'], shadow=True, fancybox=True)

# 将绘制好的图表保存为图片文件,文件名为'2022年3个分店销售额柱形图',
# 保存的图片格式会根据文件名的后缀自动确定,默认是PNG格式
plt.savefig('2022年3个分店销售额柱形图')

# 显示绘制好的图表,将图形窗口展示给用户
plt.show()

四、案例四:各班级学生成绩

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

plt.figure(num='多柱形图', figsize=(12, 6), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'

df = pd.read_excel('全校高二年级各班男女生英语成绩评估.xlsx')
x = np.arange(len(df['班级名称']))

y = df['平均成绩(男生)']
y2 = df['平均成绩(女生)']

# 这里定义了误差棒的高度,预留的功能
# error = [1000, 200, 150, 100, 100, 500, 1000, 880]


bar_width = 0.3
plt.title('全校高二年级各班男女生英语成绩评估', fontsize=20)

plt.ylabel('平均成绩', fontsize=15)


plt.ylim(0, 120)
plt.xticks(x + 0.15, df['班级名称'])

# 使用 zip 函数将 x 轴位置、男生平均成绩和女生平均成绩组合成元组,
# 然后遍历这些元组,为每个班级的男女生平均成绩柱子添加数据标签
for a, b, c in zip(x, df['平均成绩(男生)'], df['平均成绩(女生)']):
    plt.text(a, b / 2, '%.1f' % b, ha='center', va='center')
    plt.text(a + bar_width, c / 2, '%.1f' % c, ha='center', va='center')


plt.bar(x, y, width=bar_width)
plt.bar(x + bar_width, y2, width=bar_width)
plt.legend(['平均成绩(男生)', '平均成绩(女生)'], shadow=True, fancybox=True)

plt.savefig('全校高二年级各班男女生英语成绩评估(柱形图).png')


plt.show()

五、案例五:不同产品各季度销售额

python 复制代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as ms

# 设置主题风格
ms.use('seaborn-v0_8-colorblind')
plt.figure(num='多柱形图', figsize=(12, 8), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('不同产品各季度的销售额.xlsx')
x = np.arange(len(df['季度']))
y = []
y.append(df['产品A'])
y.append(df['产品B'])
y.append(df['产品C'])

# fontfamily:设置字体,fontstretch:斜体
plt.title('不同产品各季度的销售额', fontsize=20, fontfamily='SimHei', fontstyle='italic')
plt.ylabel('销售额(元)',fontsize=14,fontweight='book')
plt.ylim(0, 9000)
plt.xticks(x + 0.2, df['季度'],fontstyle='italic', rotation=-60)


bar_width = 0.2

for i in range(len(y)):
    # 画柱形
    plt.bar(x + i * bar_width, y[i], width=bar_width)
    # 写标签
    for a, b in zip(x + i * bar_width, y[i]):
        plt.text(a, b + 200, '%d' % b, ha='center')

plt.legend(['产品A', '产品B', '产品C', ], shadow=True, fancybox=True)
plt.show()
相关推荐
数据智能老司机2 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机3 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机3 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机3 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i3 小时前
drf初步梳理
python·django
每日AI新事件3 小时前
python的异步函数
python
这里有鱼汤4 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook13 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室13 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三15 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试