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编程实现语音控制电脑
Apr 01 Python
python每隔N秒运行指定函数的方法
Mar 16 Python
python实现合并两个数组的方法
May 16 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
python操作oracle的完整教程分享
Jan 30 Python
python实现微信自动回复机器人功能
Jul 11 Python
Python3常用内置方法代码实例
Nov 18 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
Python flask框架端口失效解决方案
Jun 04 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 Python
python绘制简单直方图(质量分布图)的方法
Python绘制散乱的点构成的图的方法
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 #Python
使用python绘制横竖条形图
python多次执行绘制条形图
Apr 20 #Python
Python 数据可视化工具 Pyecharts 安装及应用
You might like
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
php常用正则函数实例小结
2016/12/29 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
python3.7.0的安装步骤
2018/08/27 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
联想德国官网:Lenovo Germany
2018/07/04 全球购物
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
2014年迎新年活动方案
2014/02/19 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
golang 语言中错误处理机制
2021/08/30 Golang