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列表与元组详解实例
Nov 01 Python
Python守护进程(daemon)代码实例
Mar 06 Python
用Python的线程来解决生产者消费问题的示例
Apr 02 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
Python实现螺旋矩阵的填充算法示例
Dec 28 Python
python format 格式化输出方法
Jul 16 Python
用Python识别人脸,人种等各种信息
Jul 15 Python
Python内置函数locals和globals对比
Apr 28 Python
python 简单的调用有道翻译
Nov 25 Python
对Keras自带Loss Function的深入研究
May 25 Python
asyncio异步编程之Task对象详解
Mar 13 Python
python绘制简单直方图(质量分布图)的方法
Python绘制散乱的点构成的图的方法
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 #Python
使用python绘制横竖条形图
python多次执行绘制条形图
Apr 20 #Python
Python 数据可视化工具 Pyecharts 安装及应用
You might like
PHP模板引擎SMARTY
2006/10/09 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
Python3实现转换Image图片格式
2018/06/21 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
英国网上花店:Bunches
2016/11/29 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
机械专业毕业生自荐信
2013/11/02 职场文书
初中班主任评语大全
2014/04/24 职场文书
改革共识倡议书
2014/08/29 职场文书
2014年档案室工作总结
2014/12/01 职场文书