Python matplotlib绘制条形统计图 处理多个实验多组观测值


Posted in Python onApril 21, 2022

效果图展示如下:

Python matplotlib绘制条形统计图 处理多个实验多组观测值

该代码可以处理多个实验多组观测值的展示,代码如下:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.pyplot import MultipleLocator

def plot_bar(experiment_name, bar_name, bar_value, error_value=None,):
    """

    Args:
        experiment_name: x_labels
        bar_name: legend name
        bar_value: list(len(experiment_name), each element contains a np.array(),
                   which contains bar value in each group
        error_value: list(len(experiment_name), each element contains a np.array(),
                   which contains error value in each group
    Returns:

    """

    # 用于正常显示中文标签
    # plt.rcParams["font.sans-serif"]=['SimHei']

    colors = ['lightsteelblue', 'cornflowerblue', 'royalblue', 'blue', 'mediumblue', 'darkblue', 'navy', 'midnightblue',
              'lavender', ]

    assert len(bar_value[0]) <= len(colors)  # if not try to add color to 'colors'

    plt.rcParams['axes.unicode_minus'] = False
    plt.style.use('seaborn')
    font = {'weight': 'normal', 'size': 20, }
    font_title = {'weight': 'normal', 'size': 28, }
    # bar width
    width = 0.2
    # groups of data
    x_bar = np.arange(len(experiment_name))
    # create figure
    plt.figure(figsize=(10, 9))

    ax = plt.subplot(111)  # 假如设置为221,则表示创建两行两列也就是4个子画板,ax为第一个子画板

    # plot bar

    bar_groups = []
    value = []
    for i in range(len(bar_value[0])):
        for j in range(len(experiment_name)):
            value.append(bar_value[j][i])
        group = ax.bar(x_bar - (len(experiment_name)-3-i)*width, copy.deepcopy(value), width=width, color=colors[i], label=bar_name[i])
        bar_groups.append(group)
        value.clear()


    # add height to each bar
    i = j = 0
    for bars in bar_groups:
        j = 0
        for rect in bars:
            x = rect.get_x()
            height = rect.get_height()
            # ax.text(x + 0.1, 1.02 * height, str(height), fontdict=font)
            # error bar
            if error_value:
                ax.errorbar(x + width / 2, height, yerr=error_value[j][i], fmt="-", ecolor="black",
                            elinewidth=1.2, capsize=2,
                            capthick=1.2)
            j += 1
        i += 1

    # 设置刻度字体大小
    plt.xticks(fontsize=15)
    plt.yticks(fontsize=18)
    # 设置x轴的刻度
    ax.set_xticks(x_bar)
    ax.set_xticklabels(experiment_name, fontdict=font)

    # 设置y轴的刻标注
    ax.set_ylabel("Episode Cost", fontdict=font_title)
    ax.set_xlabel('Experiment', fontdict=font_title)

    # 是否显示网格
    ax.grid(False)

    # 拉伸y轴
    ax.set_ylim(0, 7.5)
    # 把轴的刻度间隔设置为1,并存在变量里
    y_major_locator = MultipleLocator(2.5)
    ax.yaxis.set_major_locator(y_major_locator)

    # 设置标题
    plt.suptitle("Cost Comparison", fontsize=30, horizontalalignment='center')

    plt.subplots_adjust(left=0.11, bottom=0.1, right=0.95, top=0.93, wspace=0.1, hspace=0.2)
    # 设置边框线宽为2.0
    ax.spines['bottom'].set_linewidth('2.0')
    # 添加图例
    ax.legend(loc='upper left', frameon=True, fontsize=19.5)
    # plt.savefig("test.png")
    plt.show()
    plt.legend()

if __name__ == "__main__":
    test_experiment_name = ["Test 1", "Test 2", "Test 3", "Test 4"]
    test_bar_name = ['A', "B", "C"]
    test_bar_value = [
        np.array([1, 2, 3]),
        np.array([4, 5, 6]),
        np.array([3, 2, 4]),
        np.array([5, 2, 2])
    ]
    test_error_value = [
        np.array([1, 1, 2]),
        np.array([0.2, 0.6, 1]),
        np.array([0, 0, 0]),
        np.array([0.5, 0.2, 0.2])
    ]
    plot_bar(test_experiment_name, test_bar_name, test_bar_value, test_error_value)

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
Python 字符串操作方法大全
Mar 11 Python
python写入中英文字符串到文件的方法
May 06 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
python开发利器之ulipad的使用实践
Mar 16 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
快速了解Python相对导入
Jan 12 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
numpy 返回函数的上三角矩阵实例
Nov 25 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
Python3基本输入与输出操作实例分析
Feb 14 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
Python中tqdm的使用和例子
Sep 23 Python
python绘制简单直方图(质量分布图)的方法
Python绘制散乱的点构成的图的方法
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 #Python
使用python绘制横竖条形图
python多次执行绘制条形图
Apr 20 #Python
Python 数据可视化工具 Pyecharts 安装及应用
You might like
支持oicq头像的留言簿(二)
2006/10/09 PHP
PHP+ajax 无刷新删除数据
2010/02/20 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
php实现httpRequest的方法
2015/03/13 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
javascript中call apply 的应用场景
2015/04/16 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
vue.js中created方法作用
2018/03/30 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
Python selenium根据class定位页面元素的方法
2019/02/26 Python
用django设置session过期时间的方法解析
2019/08/05 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
python 元组的使用方法
2020/06/09 Python
Python 多进程原理及实现
2020/12/21 Python
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
C#面试问题
2016/07/29 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
优秀员工自荐信范文
2013/10/05 职场文书
专升本自我鉴定
2013/10/10 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
退休感言
2014/01/28 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
幼儿园教师求职信
2015/03/20 职场文书
律政俏佳人观后感
2015/06/09 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers