Python matplotlib(2D绘图库)全 下

文章目录

        • plt.hist:(频率分布)直方图
        • plt.bar:条形(统计)图/柱状图
        • plt.stackplot:堆叠图
        • plt.pie:饼图

plt.hist:(频率分布)直方图

直方图与条形图的区别
(1)条形图(柱状图)用长条形表示每一个类别,长条形的长度表示类别的频数,宽度表示表示类别。
(2)直方图是用面积表示各组频数的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义。当宽度一样时,一般就用长条形长度表示频数。
(3)条形图(柱状图)主要用于展示离散型数据分布特征,而直方图则主要用于展示连续性数据分布特征。直观上,直方图各个长条形是衔接在一起的,连续排列,表示数据间的数学关系;条形图(柱状图)各长条形之间留有空隙,分开排列,区分不同的类。

区别 频数分布直方图 条形图(柱状图)
横轴上的数据 连续的,是一个范围 孤立的,代表一个类别
长条形之间 没有空隙 有空隙
频数的表示 一般用长条形面积表示;当宽度相同时,用长度表示 长条形的长度

函数
plt.hist(x,bins=None,range=None, density=None, bottom=None, histtype=‘bar’, align=‘mid’, log=False, color=None, label=None, stacked=False, normed=None)

关键参数

  • x: 数据集,最终的直方图将对数据集进行统计
  • bins: 画直方图的个数,个数越多,条形带越紧密。
  • range: tuple,显示的区间
  • density: bool,默认为False,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density
  • histtype: 可选{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}之一,默认为bar,推荐使用默认配置,step使用的是梯状,‘stepfilled’ 表示去除条柱的黑色边框
  • align: 可选{‘left’, ‘mid’, ‘right’}之一,默认为’mid’,控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认
  • log: bool,默认False,即y坐标轴是否选择指数刻度
  • stacked: bool,默认为False,是否为堆积状图
  • normed =1 表示将出现频次进行了归一化。 normed=0,则为频次;现已被density取代。

返回值

  • n : array or list of arrays(箱子的值)
  • bins : array(箱子的边界)
  • patches : list or list of lists

示例1

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

设置matplotlib正常显示中文和负号

matplotlib.rcParams[‘font.sans-serif’]=[‘SimHei’] # 用黑体显示中文
matplotlib.rcParams[‘axes.unicode_minus’]=False # 正常显示负号

随机生成(10000,)服从正态分布的数据

data = np.random.randn(10000)
#density=False:频数,density=True:频率
plt.hist(data, bins=40, density=True, facecolor=“blue”, edgecolor=“black”, alpha=0.7)

显示横轴标签

plt.xlabel(“区间”)

显示纵轴标签

plt.ylabel(“频数/频率”)

显示图标题

plt.title(“频数/频率分布直方图”)
plt.show()

    示例2:
    连接直方图的中心

    import matplotlib.pyplot as plt
    import numpy as np
    

    x=np.random.randint(0,100,100)#生成【0-100】之间的100个数据,即 数据集
    bins=np.arange(0,101,10)#设置连续的边界值,即直方图的分布区间[0,10],[10,20]…
    width=10#柱状图的宽度
    #直方图会进行统计各个区间的数值
    frequency_each,,= plt.hist(x,bins,color=‘deepskyblue’,width=width,alpha=0.7)#alpha设置透明度,0为完全透明
    plt.xlabel(‘scores’)
    plt.ylabel(‘count’)
    plt.xlim(0,100)#设置x轴分布范围
    plt.plot(bins[1:]-(width//2),frequency_each,color=‘palevioletred’)#利用返回值来绘制区间中点连线
    plt.show()

      示例3:

      import  numpy as np
      import matplotlib.pyplot as plt
      #概率分布直方图
      #高斯分布
      #均值为0
      mean = 0
      #标准差为1,反应数据集中还是分散的值
      sigma = 1
      x=mean+sigma*np.random.randn(10000)
      fig,(ax0,ax1) = plt.subplots(nrows=2,figsize=(9,6))
      #第二个参数是柱子宽一些还是窄一些,越大越窄越密
      ax0.hist(x,40,histtype='bar',facecolor='yellowgreen',alpha=0.75)
      ##pdf概率分布图,一万个数落在某个区间内的数有多少个
      ax0.set_title('pdf')
      ax1.hist(x,20,histtype='bar',facecolor='pink',alpha=0.75,cumulative=True,rwidth=0.8)
      #cdf累计概率函数,cumulative累计。比如需要统计小于5的数的概率
      ax1.set_title("cdf")
      fig.subplots_adjust(hspace=0.4)
      plt.show()
      
         
         
         
         

        示例4:

        import numpy as np
        from numpy.linalg import cholesky
        import matplotlib.pyplot as plt
        

        sampleNo = 1000;

        一维正态分布

        下面三种方式是等效的

        mu = 3
        sigma = 0.1
        np.random.seed(0)
        s = np.random.normal(mu, sigma, sampleNo )
        #s = np.random.rand(1, sampleNo )
        plt.subplot(141)
        plt.hist(s, 10, density=True) #####bins=10

        np.random.seed(0)
        s = sigma * np.random.randn(sampleNo ) + mu
        plt.subplot(142)
        plt.hist(s, 30, density=True) #####bins=30

        np.random.seed(0)
        s = sigma * np.random.standard_normal(sampleNo ) + mu
        plt.subplot(143)
        plt.hist(s, 30, density=True) #####bins=30

        二维正态分布

        mu = np.array([[1, 5]])
        Sigma = np.array([[1, 0.5], [1.5, 3]])
        R = cholesky(Sigma)
        s = np.dot(np.random.randn(sampleNo, 2), R) + mu
        plt.subplot(144)

        注意绘制的是散点图,而不是直方图

        plt.plot(s[:,0],s[:,1],’+’)
        plt.show()

          plt.bar:条形(统计)图/柱状图

          函数

          matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, align=‘center’, data=None, kwargs*)
          生成竖直的条形图
          matplotlib.pyplot.barh()生成水平方向的条形图

          重要参数

          • x:标量序列。表示条形图的x坐标。
          • height:标量或者标量序列。条形高度。
          • width:标量或者数组,可选参数。条形之间的宽度,0~1,默认为:0.8。
          • bottom:标量或者数组,可选参数。条形图底部的y坐标,默认值为None。设置值时,下部分为空
          • color:标量或者数组,可选参数。条形图前景色。
          • edgecolor:标量或者数组,可选参数。条形图边界颜色。
          • linewidth:标量或者数组,可选参数。条形图边界宽度。如果为None,使用默认linewidth;如果为0,不画边界。默认为None。
          • tick_label:字符串或者数组,可选参数。条形图的tick标记,默认为None。
          • xerr:标量或者数组,可选参数。如果不是None,将把生成的errorbars用在条形图上,默认为None。
          • yerr:标量或者数组,可选参数。如果不是None,将把生成的errorbars用在条形图上,默认为None。
          • ecolor:标量或者数组,可选参数。指定errorbars的颜色,默认为None。
          • capsize:标量,可选参数。确定errorbars上限的长度,默认为None,从errorbar.capsize rcParam获取到值。
          • error_kw:字典类型,可选参数。kwags参数被传给errorbar方法。ecolor和capsize可能在这被指定而不是作为一个单独的kwargs。
          • align:{‘center’,‘edge’},可选参数,默认:‘center’。 如果是’edge’,通过左边界(条形图垂直)和底边界(条形图水平)来使条形图对齐。如果是’center’,将left参数解释为条形图中心坐标。通过传递一个给width设置复数,来使条形图以右边界进行对齐。
          • orientation:{‘vertical’,‘horizontal’},可选参数。设置条形图方向。
          • log:布尔类型,可选参数。如果为true,设置轴到log scale。默认为False。

          返回值
          bars:matplotlib.container.BarContainer。
          带有所有bar与errorbar的容器。

          示例1

          import numpy as np
          import matplotlib.mlab as mlab
          import matplotlib.pyplot as plt
          

          X = [0, 1, 2, 3, 4, 5]
          Y = [222, 42, 455, 664, 454, 334]
          fig = plt.figure()
          #plt.bar为我们创建条形图
          plt.bar([0,3,5,7,9],[5,2,7,8,2], label=“Example one”,color=‘r’) #红色

          plt.bar([2,4,6,8,10],[8,6,2,5,6], label=“Example two”, color=‘g’) #绿色
          plt.legend()
          plt.xlabel(‘bar number’)
          plt.ylabel(‘bar height’)
          plt.title(‘Epic Graph\nAnother Line! Whoa’)
          plt.show()

            plt.stackplot:堆叠图

            堆叠图用于显示『部分对整体』随时间的关系。 堆叠图基本上类似于饼图,只是随时间而变化。
            函数
            plt.stackplot(x,* args,** kwargs )

            重要参数

            • “x”:array,维度为n的一维数组
            • “y”:array,2d数组(维度MxN)或1d数组的序列(每维1xN)
            stackplot(x, y)    # where y is MxN(2d array of dimension MxN)  
            stackplot(x, y1, y2, y3, y4)  # where y1, y2, y3, y4, are all 1xNm  
            stackplot(x, y1, y2, y3, y4, labels=[], colors=[]) 
            
               
               
               
               
              • “baseline “:[‘zero’ , ‘sym’ ,‘wiggle’ , ‘weighted_wiggle’],计算基线的方法
              • “zero”:function,恒定的零基线,即一个简单的堆积图。
              • “sym”:function,围绕零对称,有时称为“ThemeRiver”
              • “wiggle”:function,最小化平方斜率的总和
              • “weighted_wiggle”:function,是否相同,但权重来说明每个图层的大小。它也被称为“Streamgraph”版式。
              • “labels “:string,要分配给每个数据系列的标签。
              • “colors “,string,颜色的列表或元组。这些将循环并用于对堆叠区域进行着色。

              示例1:
              考虑一个情况,一天有24小时,看看我们如何花费时间。 将我们的活动分为:睡觉,吃饭,工作和玩耍。假设我们要在5天的时间内跟踪它:

              import matplotlib.pyplot as plt
              days = [1,2,3,4,5]
              

              sleeping = [7,8,6,11,7]
              eating = [2,3,4,3,2]
              working = [7,8,7,2,2]
              playing = [8,5,7,8,13]

              plt.plot([],[],color=‘m’, label=‘Sleeping’, linewidth=5)
              plt.plot([],[],color=‘c’, label=‘Eating’, linewidth=5)
              plt.plot([],[],color=‘r’, label=‘Working’, linewidth=5)
              plt.plot([],[],color=‘k’, label=‘Playing’, linewidth=5)

              plt.stackplot(days, sleeping,eating,working,playing, colors=[‘m’,‘c’,‘r’,‘k’])

              plt.xlabel(‘x’)
              plt.ylabel(‘y’)
              plt.title(‘Interesting Graph\nCheck it out’)
              plt.legend()
              plt.show()

                plt.pie:饼图

                函数
                pie(x, explode=None, labels=None……)

                重要参数

                • x:为一个存放各部分占比的向量;
                • labels :list,(每一块)饼图外侧显示的说明文字;
                • explode :list,(每一块)离开中心距离;
                • colors:list,设置为各部分染色列表,元素一一对应
                • startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
                • shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
                • labeldistance:label标记的绘制位置,相对于半径的比例,默认值为1.1,如<1则绘制在饼图内侧;
                • autopct :list,设置饼图内百分比显示,可以使用format字符串或者format function '%1.1f’指小数点前后位数(没有用空格补齐);
                • pctdistance:类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
                • radius :控制饼图半径,默认值为1;
                • counterclock:指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
                • wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={‘linewidth’:3}设置wedge线宽为3。
                • textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
                • center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
                • frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
                • rotatelabels:布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

                注意
                (1)pie函数默认绘制形状为椭圆形,需自行设置坐标轴模式(plt.axis(‘equal’))来显示为圆形;
                (2)pie()绘制顺序默认从x正半轴开始逆时针方向,当x向量所有元素之和小于1时,画图会正常进行,但饼图会有缺口;

                示例1

                import matplotlib.pyplot as plt
                slices = [7,2,2,13]
                activities = ['sleeping','eating','working','playing']
                cols = ['c','m','r','b']
                

                plt.pie(slices,
                labels=activities,
                colors=cols,
                startangle=90,
                shadow= True,
                explode=(0,0.1,0,0),
                autopct=’%1.1f%%’)
                #0.1表示将eating那一块凸显出来

                plt.title(‘Interesting Graph\nCheck it out’)
                plt.show()

                  (1)可以选择指定图形的『起始角度』,在例1中,startangle=90 表示为饼图选择了90度角,这意味着第一个部分是一个竖直线条。
                  (2)explode表示(每一块)离开中心距离,如果不想拉出任何切片,传入0,0,0,0。explode=(0,0.1,0,0)表示第二块离开中心0.1。
                  (3)autopct,选择将百分比放置到图表上面,这里使用format字符串,’%1.1f%%'表示小数点后一位。

                  示例2

                  import matplotlib.pyplot as plt
                  plt.rcParams['font.sans-serif']=['SimHei']#将图表内容字体设置为黑体,可以正常显示中文
                  

                  ratios=[0.1,0.1,0.15,0.15,0.4]#存放比例列表
                  colors=[‘peru’,‘coral’,‘salmon’,‘yellow’,‘grey’]#存放颜色列表,与比例相匹配
                  labels=[“流行”,‘classic’,‘pop’,‘纯音乐’,‘blue’]#存放各类元素标签
                  explode=(0,0.1,0,0,0.08)

                  plt.pie(ratios,explode=explode,colors=colors,labels=labels)#绘制饼图
                  plt.title(‘歌单音乐种类百分比’)
                  plt.axis(‘equal’)#将饼图显示为正圆形
                  plt.show()

                    转载链接:

                    原链接:https://blog.csdn.net/yyl424525/article/details/92721739

                    你可能感兴趣的:(matplotlib)