ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

对比excel,用matplotlib绘制柱状图添加table图表

2021-07-03 13:01:05  阅读:302  来源: 互联网

标签:set bar 单元格 excel matplotlib 柱状图 plt ax table


大家好,我是才哥。

最近在做数据可视化的时候,希望在图上同时显示数据表。关于这个需求,用excel可以比较方便,直接快速布局中选择布局5即可。那么,如果我们想用python也来完成这项任务,可以怎么做呢?

期望效果预览

excel作图效果

1. Excel简单绘制

就很简单了,直接选中数据插入柱状图,然后在图表工具-设计-快速布局中选择相应的布局即可。

案例数据及效果

excel图表设计->快速布局—>布局5

2. Python绘制

那这里我们用到的是matplotlibbartable

将图表元素进行拆解,可以分为柱状图和数据表,刚好matplotlib提供了对应的接口。

2.1 柱状图绘制

先绘制柱状图,案例中是两组数据,所以是组合柱状图。在本次绘制中,有以下几个知识点,可以记一记:

  • 设置标题时的位置(用参数x,y指定)
  • 设置坐标轴标题时用参数rotation旋转方向
  • 设置坐标轴区间范围
  • 显示数据标签(用ax.bar_label方法)
import numpy as np
import matplotlib.pyplot as plt

# 中文及负数显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建画布
fig, ax = plt.subplots(figsize=(10, 4), dpi=100)

# 案例数据
data = [[150, 200,  -50, -100,  -75],
        [300, 125,  -80,  75, -100],
        ]
# 列与行
columns = ('周一', '周二', '周三', '周四', '周五')
rows = ['才哥', '楠楠']

# 作图参数
index = np.arange(len(columns))-0.1
bar_width = 0.4

# 设置柱状图颜色
colors = ['turquoise', 'coral']

# 柱状图
bar1 = plt.bar(index, data[0], 
               bar_width, color=colors[0], edgecolor='grey')
bar2 = plt.bar(index+bar_width, data[1],
               bar_width, color=colors[1], edgecolor='grey')

# 设置标题
ax.set_title('工作日收益情况', fontsize=16, y=1.1,x=0.44)
# 设置坐标轴标题
ax.set_ylabel("元", fontsize=12, color='black', alpha=0.7, rotation=360)
# 设置Y轴区间
ax.set_ylim(-150, 350)

# 显示数据标签
ax.bar_label(bar1, label_type='edge')
ax.bar_label(bar2, label_type='edge')

# x,y轴刻度不显示
ax.tick_params(axis=u'both', which=u'both', length=0)
# x轴刻度及刻度值不显示
plt.xticks([])

输出如下:

组合柱状图

2.2. 图表table绘制

先看看图表table的绘制,我们拿案例数据来单独绘制看看:

# 创建画布
fig, ax = plt.subplots(figsize=(10, 4), dpi=100)
# table图表
the_table = plt.table(cellText=data, 
                      rowLabels=rows,rowColours=colors,
                      colLabels=columns, cellLoc='center', loc="bottom",
                      bbox=[0, -0.4, 1, 0.24]
                      )

输出如下:

table

关于 plt.table的参数介绍如下:

cellText:表格单元格文本,字符串中的换行符暂不支持,可能导致文本超出单元格边界
cellColours:表格单元格背景色
cellLoc:表格单元格文本的对齐方式,取值范围为{‘left’, ‘center’, ‘right’},默认值为’right’
colWidths:表格单元格宽度
rowLabels:表格行表头文本
rowColours:表格行表头背景色
rowLoc:表格行表头文本的对齐方式,取值范围为{‘full’, ‘left’, ‘right’},默认值为’left’
colLabels:表格列表头文本
colColours:表格列表头背景色
colLoc:表格列表头文本的对齐方式,取值范围为{‘full’, ‘left’, ‘right’},默认值为’left’
loc:单元格相对于子图的位置
bbox:绘制表格的边界框

最后,我们需要做的就是将上述两个图进行组合,组合过程中可能需要做一些格式微调。

2.3. 组合

在本次案例中,对组合图需求有以下几点:

  • 柱状图边框不显示
  • 图表table中列名高度需要高一些,单元格的高度要低一些
  • 图例位置需要和对应行一致

为了实现上诉需求,我们可以通过以下方式来处理:

# 设置单元格高度
cellDict = the_table.get_celld()
for i in range(0, len(columns)):
    cellDict[(0, i)].set_height(0.6)
    for j in range(1, len(rows)+1):
        cellDict[(j, i)].set_height(0.4)

# 设置图表table中行名单元格的高度
cellDict[(1, -1)].set_height(0.4)
cellDict[(2, -1)].set_height(0.4)

# 设置图表table单元格文本字体
the_table.auto_set_font_size(False)
the_table.set_fontsize(10)

# 设置图表table单元格边框
for key, cell in the_table.get_celld().items():
    cell.set_linewidth(0.6)

# 边框隐藏
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

name = ['', '']
# 设置图例的位置
ax.legend(name, handlelength=0.7, labelspacing=0.6,
          bbox_to_anchor=(-0.1, -0.23),
          loc='upper left', frameon=False)

最终,我们可以得到比较满意的效果:

image-20210701002921132

以上就是本次全部内容,大家可以修改参数多试试以熟悉掌握。

标签:set,bar,单元格,excel,matplotlib,柱状图,plt,ax,table
来源: https://blog.csdn.net/dxawdc/article/details/118438624

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有