当前位置: 首页 > news >正文

Python分组柱形图绘制全攻略

一、代码分析

1. 数据准备层

categories = ['Q1', 'Q2', 'Q3', 'Q4']  # X轴离散类别
sales_A = [23, 45, 12, 67]  # 系列A数据
sales_B = [34, 30, 53, 28]  # 系列B数据
  • 关键点:数据必须为数值型列表/数组,类别与数据长度一致

2. 图表构建层

width = 0.35  # 柱宽控制分组间距
x = np.arange(len(categories))  # 生成0,1,2,3作为基准坐标

3. 绘图核心

rects1 = ax.bar(x - width/2, sales_A, width, label='产品A', ...)
rects2 = ax.bar(x + width/2, sales_B, width, label='产品B', ...)
  • 参数解析

    • edgecolor:柱体边框色(增强辨识度)

    • color:使用十六进制色彩代码(专业设计规范)

4. 专业美化层

ax.grid(axis='y', linestyle='--', alpha=0.7)  # 仅显示y轴网格线
ax.legend(title='产品线')  # 图例标题提升可读性
  • 设计原则:避免视觉干扰(如x轴网格线)

5. 数据标注

ax.annotate(f'{height}', xytext=(0, 3), ha='center', va='bottom')
  • 交互设计:3像素垂直偏移避免文字重叠


二、柱形图通用编写模板

import matplotlib.pyplot as plt
import numpy as npdef create_grouped_bar_chart(data_dict, title="", xlabel="", ylabel=""):"""Parameters:data_dict: {'系列1': [值1,值2...], '系列2': [...]} """# 1. 数据准备categories = list(data_dict.keys())values = list(data_dict.values())n_series = len(values)# 2. 计算布局width = 0.8 / n_series  # 动态柱宽x = np.arange(len(values[0]))  # 基准坐标# 3. 创建图表fig, ax = plt.subplots(figsize=(10, 6))# 4. 绘制柱形组colors = plt.cm.tab10.colors  # 使用专业配色for i in range(n_series):offset = width * (i - n_series/2 + 0.5)rects = ax.bar(x + offset, values[i], width, label=categories[i], color=colors[i],edgecolor='white')# 自动标注for rect in rects:height = rect.get_height()ax.annotate(f'{height:.1f}',xy=(rect.get_x() + rect.get_width()/2, height),xytext=(0, 3),textcoords="offset points",ha='center', va='bottom')# 5. 专业美化ax.set_title(title, pad=20, fontsize=14)ax.set_xlabel(xlabel)ax.set_ylabel(ylabel)ax.set_xticks(x)ax.set_xticklabels([f'Q{i+1}' for i in range(len(x))])ax.legend(title="数据系列", frameon=False)ax.grid(axis='y', linestyle=':', alpha=0.4)plt.tight_layout()return fig, ax# 使用示例
data = {'北京': [45, 32, 56, 71],'上海': [51, 28, 63, 59],'广州': [38, 41, 49, 62]
}
create_grouped_bar_chart(data, title="三大城市季度销售对比")
plt.show()

三、关键设计原则

1. 布局规范

元素推荐参数作用
画布大小figsize=(10,6)保持黄金分割比例
柱体间距width=0.8/n_series动态适应系列数量
颜色方案plt.cm.tab10专业配色且色盲友好

2. 交互增强技巧

# 添加悬停效果(需配合Jupyter)
def hover(event):if event.inaxes == ax:for rect in rects1 + rects2:if rect.contains(event)[0]:rect.set_alpha(0.5)fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)

3. 性能优化

# 大数据集优化(>10万条)
ax.bar(x, data, width, rasterized=True)  # 启用栅格化
plt.savefig('output.pdf', dpi=300)  # 矢量图输出

四、常见变体实现

1. 堆叠柱形图

bottom = np.zeros(len(categories))
for i, (label, values) in enumerate(data_dict.items()):ax.bar(x, values, width, label=label, bottom=bottom,color=colors[i])bottom += values  # 累加底部位置

2. 百分比柱形图

total = np.sum(values, axis=0)
percent = values / total * 100
ax.bar(x, percent, ...)
ax.set_ylabel("占比(%)")

3. 双向柱形图

ax.barh(x, positive_data, label='正向')
ax.barh(x, negative_data, label='负向', left=-negative_data)

五、调试指南

  1. 柱体错位:检查x ± offset计算逻辑

  2. 文字重叠:调整xytext偏移量或旋转标签

  3. 颜色混淆:使用色盲友好配色(viridis/plasma

  4. 性能卡顿:对大数据集使用rasterized=True

 

http://www.dtcms.com/a/286666.html

相关文章:

  • 题解:CF1866D Digital Wallet
  • 熔断和降*的区别
  • 使用pt-toolkit工具包进行MySQL性能优化实战指南
  • 算法训练营day24 回溯算法③ 93.复原IP地址 、78.子集、 90.子集II
  • AWS SSL证书无缝迁移完整指南 - 零业务中断方案
  • Python 进程间通信:TCP安全加密数据传输
  • H3CNE小小综合实验
  • 模拟数据生成---使用NGS数据模拟软件VarBen
  • SLM343CK-DG Sillumin数明半导体高性能LED驱动芯片 抗干扰+耐高温 车载照明专用
  • 二叉树(建立 + 遍历 + 拓展)
  • 外部DLL创建及使用
  • 灵巧手(具身智能入门十一)
  • if (a == 1 a == 2 a == 3)返回true的问题思考
  • NVIDIA 驱动安装失败问题排查与解决(含离线 GCC 工具链安装全过程)
  • MySQL组内拼接group_concat函数
  • MyUI会员排名VcMember组件文档
  • Java与Vue技术搭建的SRM招标采购管理系统,提供源码,涵盖招标、投标、评标全流程,助力企业高效规范采购管理
  • spring-cloud微服务部署-feign服务间调用
  • NFS读写性能评估与优化指南(下)
  • 二叉搜索树:高效的查找结构
  • 自学力扣:最长连续序列
  • python-pptx 的layout 布局
  • CCF编程能力等级认证GESP—C++1级—20250628
  • 扫地机器人,需要回归第一性原理
  • Docker安装教程
  • Visual Studio C++编译器优化等级详解:配置、原理与编码实践
  • 第七章 愿景07 实习小宇
  • LLC电源设计专题--详细讲解
  • Web开发 02
  • 贪吃蛇(C++实现)