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的Flask框架与数据库连接的教程
Apr 20 Python
在Python中操作字典之update()方法的使用
May 22 Python
python通过socket查询whois的方法
Jul 18 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
利用python修改json文件的value方法
Dec 31 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
python 用pandas实现数据透视表功能
Dec 21 Python
python中tkinter复选框使用操作
Nov 11 Python
python绘制简单直方图(质量分布图)的方法
Python绘制散乱的点构成的图的方法
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 #Python
使用python绘制横竖条形图
python多次执行绘制条形图
Apr 20 #Python
Python 数据可视化工具 Pyecharts 安装及应用
You might like
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
php生成圆角图片的方法
2015/04/07 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
javascript静态的url如何传递
2007/05/03 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
python fabric使用笔记
2015/05/09 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
python 生成器协程运算实例
2017/09/04 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
Python定义一个Actor任务
2020/07/29 Python
python源文件的字符编码知识点详解
2021/03/04 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
小学生秋游活动方案
2014/02/23 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
分析并发编程之LongAdder原理
2021/06/29 Java/Android
如何Tomcat中使用ipv6地址
2022/05/06 Servers