一、前言

前面文章中我们已经实现了饼图的绘制,现在就来实现柱状图的绘制

为方便分析理解,将源文件示例图展示如下:

Python matplotlib将excel数据转换为图表【柱状图】_Python

二、步骤解析

柱状图

1 预处理数据

pandas读取excel,提取状态列数据,筛选出x轴数据和y轴数据

import pandas

path = "xxx问题记录.xlsx"
df = pandas.read_excel(path)  # pandas读取excel
data = df['状态']  # 提取状态列的数据
x_data = (data.drop_duplicates().dropna()).values  # 去重并去掉空值
y_data = data.value_counts(sort=False).values  # 筛选计数,不排序
print(f"x_data:{x_data}")
print(f"y_data:{y_data}")

运行结果:

Python matplotlib将excel数据转换为图表【柱状图】_Python_02

2 绘制图表

安装导入matplotlib第三方库,创建bar对象并传入前面处理好的x_data和y_data

import os
import pandas
from matplotlib import pyplot as mpl


def create_bar(path, col, x_title, y_title, title):
    """
    绘制柱状图
    :param path: 文件路径
    :param col: excel文件中的指定列名
    :param x_title: x轴标题
    :param y_title: y轴标题
    :param title: 柱状图标题
    :return:
    """
    # 预处理数据
    file_name = os.path.basename(path).split('.xlsx')[0]  # 截取data_path的文件名
    df = pandas.read_excel(path)  # pandas读取excel
    data = df[col]  # 提取指定列的数据
    x_data = (data.drop_duplicates().dropna()).values  # 去重并去掉空值
    y_data = data.value_counts(sort=False).values  # 筛选计数,不排序
    # 绘制图表
    figure = mpl.figure()  # 创建图像
    mpl.bar(x_data, y_data)  # 柱状图
    mpl.xlabel(x_title)  # 设置x轴标题名称
    mpl.ylabel(y_title)  # 设置y轴标题名称
    mpl.title(f"【{file_name}】{title}", fontsize=16)  # 设置标题名称和字体大小
    mpl.show()  # 显示图像


if __name__ == "__main__":
    file_path = "xxx问题记录.xlsx"
    create_bar(file_path, '状态', '状态', '数量', '状态分布图')

运行结果:

Python matplotlib将excel数据转换为图表【柱状图】_图表_03

问题1--图表中文显示异常:

设置图表rcParams参数的字体可以解决中文展示问题,这里设置字体为宋体

mpl.rcParams['font.sans-serif'] = ['STSong']
问题2--图表中缺少y轴数据标签:

设置柱状图图表的text文本标签

for index, val in enumerate(y_data):  # 设置y轴数据
    mpl.text(x_data[index], val, val, ha='center', va='bottom')
问题3--自定义柱状图颜色:

设置柱状图对象bar的color参数,下面是随机添加柱状图颜色的代码片段

bars = mpl.bar(x_data, y_data, color=random_color(len(y_data)))

def random_color(num):
    """柱状图随机颜色"""
    color_list = ['r', 'g', 'b', 'y', 'c', 'm']
    if num <= len(color_list):
        color = random.sample(color_list, num)
    else:
        gap = num - len(color_list)
        color1 = random.sample(color_list, len(color_list))
        color2 = random.sample(color_list, gap)
        color = color1 + color2
    return color
问题4--自定义图表样式:

这里我们通过mplcyberpunk第三方库来自定义柱状图的样式

import mplcyberpunk

mpl.style.use('cyberpunk')
mplcyberpunk.add_bar_gradient(bars=bars)

3 柱状图完整代码

import os
import random
import mplcyberpunk
import pandas
from matplotlib import pyplot as mpl


def create_bar(path, col, x_title, y_title, title):
    """
    绘制柱状图
    :param path: 文件路径
    :param col: excel文件中的指定列名
    :param x_title: x轴标题
    :param y_title: y轴标题
    :param title: 柱状图标题
    :return:
    """
    # 预处理数据
    file_name = os.path.basename(path).split('.xlsx')[0]  # 截取data_path的文件名
    df = pandas.read_excel(path)  # pandas读取excel
    data = df[col]  # 提取指定列的数据
    x_data = (data.drop_duplicates().dropna()).values  # 去重并去掉空值
    y_data = data.value_counts(sort=False).values  # 筛选计数,不排序
    # 绘制图表
    mpl.style.use('cyberpunk')
    mpl.rcParams['font.sans-serif'] = ['STSong']  # 设置字体为宋体--设置后可正常显示中文
    figure = mpl.figure()  # 创建图像
    bars = mpl.bar(x_data, y_data, color=random_color(len(y_data)))  # 柱状图
    mpl.xlabel(x_title)  # 设置x轴标题名称
    mpl.ylabel(y_title)  # 设置y轴标题名称
    mpl.title(f"【{file_name}】{title}", fontsize=16)  # 设置标题名称和字体大小
    for index, val in enumerate(y_data):  # 设置y轴数据
        mpl.text(x_data[index], val, val, ha='center', va='bottom')
    mplcyberpunk.add_bar_gradient(bars=bars)  # 柱状图颜色渐变
    mpl.show()  # 显示图像


def random_color(num):
    """柱状图随机颜色"""
    color_list = ['r', 'g', 'b', 'y', 'c', 'm']
    if num <= len(color_list):
        color = random.sample(color_list, num)
    else:
        gap = num - len(color_list)
        color1 = random.sample(color_list, len(color_list))
        color2 = random.sample(color_list, gap)
        color = color1 + color2
    return color


if __name__ == "__main__":
    file_path = "xxx问题记录.xlsx"
    create_bar(file_path, '状态', '状态', '数量', '状态分布图')
    create_bar(file_path, '优先级', '优先级', '数量', '优先级分布图')

运行结果:

Python matplotlib将excel数据转换为图表【柱状图】_图表_04

Python matplotlib将excel数据转换为图表【柱状图】_excel_05