Python matplotlib(2D绘图库)2

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()
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值