pyplot.bar函数重新封装

参考:  https://blog.csdn.net/jenyzhang/article/details/52047557

     https://blog.csdn.net/liangzuojiayi/article/details/78187704

需求:

封装一个带分组功能的bar绘制函数

绘制效果:

代码:

 1 # -*- coding: utf-8 -*-
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4
 5 class Bar(object):
 6     r‘‘‘
 7     请使用with打开绘图
 8     ‘‘‘
 9     def __init__(self):
10         self.colors=[
11             "#0ed4e8",
12             "#318bae",
13             "#6b914c",
14             "#8492c3",
15             "#495aa2",
16             "#6841ac",
17             "#aa6547",
18             "#aaa350",
19         ]
20
21     def __call__(self,quants=None,labels=None,**kwargs):
22         self.draw(quants,labels,**kwargs)
23     def __enter__(self):
24         plt.figure(figsize=(10,10))
25         return self
26     def __exit__(self, exc_type, exc_val, exc_tb):
27         plt.show()
28         plt.close()
29     def draw(self,quants=None,labels=None,**kwargs):
30         if not quants:
31             print(‘数据为空‘)
32             return
33         if type(quants[0]) == int or type(quants[0]) == float:
34             num_label = 1
35             isInt = True
36         else:
37             num_label = len(quants[0])
38             isInt = False
39         width = 0.4
40         ind = np.linspace(0.5, 9.5, len(quants))
41         X=ind - width / 2
42         xlabels_pos=X+(num_label-1)*width / 2
43         if isInt:
44             plt.bar(X, quants, width, color=‘green‘)
45         else:
46             quants=np.array(quants)
47             if type(kwargs.get(‘classlabels‘, ‘‘)) == list:
48                 classlabels = kwargs.get(‘classlabels‘, ‘‘)
49                 plt.legend(loc=‘upper right‘)
50             else:
51                 classlabels = [‘‘]*len(quants[0])
52             for i in range(len(quants[0])):
53                 plt.bar(X+width*i, quants[:,i], alpha=0.9, width=width, facecolor=self.colors[i], edgecolor=‘white‘, label=classlabels[i], lw=1)
54         # labels
55         plt.xlabel(kwargs.get(‘xlabel‘, ‘x‘))
56         plt.ylabel(kwargs.get(‘ylabel‘, ‘y‘))
57         if not labels:
58             labels = list(range(1, len(quants) + 1))
59         plt.xticks(xlabels_pos, labels)
60         # title
61         plt.title(kwargs.get(‘title‘, ‘‘))
62         plt.grid(linestyle=‘-.‘)
63
64 if __name__=="__main__":
65     labels = [‘USA‘, ‘China‘, ‘India‘, ‘Japan‘, ‘Germany‘, ‘Russia‘, ‘Brazil‘, ‘UK‘, ‘France‘, ‘Italy‘]
66     quants = [15094025.0, 11299967.0, 4457784.0, 4440376.0, 3099080.0, 2383402.0, 2293954.0, 2260803.0, 2217900.0,
67               1846950.0]
68     labels3 = [‘USA‘, ‘China‘, ‘India‘]
69     quants3= [[15094025.0, 11299967.0, 4457784.0], [4440376.0, 3099080.0, 2383402.0], [2293954.0, 2260803.0, 2217900.0]]
70     with Bar() as bar:
71         plt.subplot(2,1,1)
72         bar(quants3,labels3,xlabel="xlabel3",ylabel=‘ylabel3‘,title=‘title3‘,classlabels=["A",‘B‘,‘C‘])
73         plt.subplot(2, 1, 2)
74         bar(quants, labels, xlabel="xlabel", ylabel=‘ylabel‘, title=‘title‘,)

原文地址:https://www.cnblogs.com/xunhanliu/p/10614245.html

时间: 2024-11-10 17:19:30

pyplot.bar函数重新封装的相关文章

使用matplotlib中的bar函数绘制柱状图

使用柱状图显示三日电影的票房信息 要显示的数据为2018年12月7日-9日四场电影的票房信息 四场电影分别为:无名之辈,狗十三,毒液:知名守卫者,憨豆特工3 2018年12月7日四场电影票房分别为:[991.94, 375.64, 200.48, 73.27] 2018年12月8日四场电影票房分别为:[1908.22, 547.61, 466.23, 193.8] 2018年12月9日四场电影票房分别为:[1532.87, 525.63, 332.35, 170.57] 本次绘图思路: 1.x轴

函数的封装

第一次写这种风格的代码,就用了上一篇的代码来做的测试,一次成功(毕竟连看都没看过具体实现过程,就在cpp上看到过几句ifndef.endif,还是挺开心的),效果不错,但稍微感觉隐藏函数的实现的细节等,貌似运行慢了点,毕竟强行include了过来,不知道是不是错觉. 具体过程如下(我用的是VC++ 6.0): 在写好的代码工作室中添加头文件,名字就按自己的代码主要实现的是什么功能来命名比较好,比如 STACK.H,一看就知道是关于栈的,然后就没然后了.具体就看头文件的内容吧: #ifndef _

js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装

1. offsetParent  获取的最近的定位的父元素   offsetLeft/offsetTop  是相对于offsetParent的距离 offsetHeight/offsetWidth 获取盒子的大小   border + height + padding <style> #box { width: 200px; height: 200px; background-color: #ff0000; } #child { width: 100px; height: 100px; mar

辛巴学院-Unity-剑英陪你零基础学c#系列(四)函数和封装

这还是草稿 ? 辛巴学院:正大光明的不务正业. 国庆长假结束了,我的心情是这样的: 你总是起不早,起不早独自一个人沉睡到天亮你无怨无悔的梦着那副本我知道你根本就不想上班你总是起不早,起不早放假总是短暂,上班太难请个病假,再睡上一天 今天我们聊c#的函数和封装 这个话题其实你有无数的资料,每个写过代码,没写过代码的人,都知道这些玩意.我也没有太多新奇的角度,先记住这一点 这不是数学,这不是数学,这不是数学. 我接触最早的语言是basic,那个时候函数还没有那么深入人心,不是visual basic

PHP单文件、多个单文件、多文件上传函数的封装

//表单: //s.php //要在选择上传文件时能一次选择多个文件,那么就加multiple="multiple" ,还有注意下name="myFile1"和name="myFile[]"的区别,单文件.多文件上传. <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title

【好程序员训练营】Objective-C学习笔记----------成员变量和成员函数的封装

<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>------我的OC语言笔记,期待与您交流! 前言--在我们开发项目的过程中,很多时候我们不想程序里面的成员变量或者成员函数暴露出来,我们只希望别人通过一些方法来调用这些变量或者函数, 这时就需要用到成员变量和成员函数的封装 一.成员变量的封装 @interface Person:NSObject{ @privat

PHP单文件上传原理及上传函数的封装

<?php //单文件上传函数的封装 //文件上传原理:将客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定目录即可. //文件的方向:客户端-->服务器(临时文件)-->指定目录,当文件进入服务器时它就是临时文件了,这时操作中要用临时文件的名称tmp_name. //在客户端设置上传文件的限制(文件类型和大小)是不安全的,因为客户能通过源代码修改限制,所以在服务端这里设置限制. //设置编码为UTF-8,以避免中文乱码 header('Content-Type:text/ht

将函数指针封装成委托

使用NativeMethod类动态读取C++Dll,获得函数指针,并且将指针封装成C#中的委托.原因很简单,C#中已经不能使用指针了,如下                      int hModule = NativeMethod.LoadLibrary(@"c:"CppDemo.dll"); IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "Add"); 详细请参见代码 using Syste

JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 this的特点 this就代表本类对象 这在我们的set方法里面是有的 public void setName(String name) { this.name = name; } this代表他所在的函数对属对象的引用 现在我们这里有这么一个需求 //公共的 类 类名 public class H