一、前言
前面文章中我们已经实现了饼图的绘制,现在就来实现柱状图的绘制
为方便分析理解,将源文件示例图展示如下:
二、步骤解析
柱状图
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}")
运行结果:
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, '状态', '状态', '数量', '状态分布图')
运行结果:
问题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, '优先级', '优先级', '数量', '优先级分布图')
运行结果: