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练习程序批量修改文件名
Jan 16 Python
python创建进程fork用法
Jun 04 Python
详解Django的CSRF认证实现
Oct 09 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 Python
Python银行系统实战源码
Oct 25 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
什么是python的id函数
Jun 11 Python
Python安装并操作redis实现流程详解
Oct 13 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
python绘制简单直方图(质量分布图)的方法
Python绘制散乱的点构成的图的方法
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 #Python
使用python绘制横竖条形图
python多次执行绘制条形图
Apr 20 #Python
Python 数据可视化工具 Pyecharts 安装及应用
You might like
请php正则走开
2008/03/15 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
浅谈php自定义错误日志
2015/02/13 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
window.opener用法和用途实例介绍
2013/08/19 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
2017/01/10 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
9种python web 程序的部署方式小结
2014/06/30 Python
详解Django中的form库的使用
2015/07/18 Python
python编程开发之日期操作实例分析
2015/11/13 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python中常见的异常总结
2018/02/20 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
自主招生自荐信
2013/12/08 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
庆祝儿童节标语
2014/10/09 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript