数据可视化~matplotlib阶梯图,直方图

原文链接:http://www.juzicode.com/archives/2630

这篇文章介绍matplotlib绘制阶梯图和直方图,直方图在图像处理中有比较广泛的用途,用来表示的是数值分布图,可以看出是柱状图的一种特殊变种。

1、step阶梯图

用法类似pyplot.plot(),多了个参数where表示划线阶梯在该点的前中后哪个位置,可以是’pre’,’mid’,’post’等三种类型,默认’pre’。

print('\n-----欢迎来到juzicode.com')
print('-----公众号: 桔子code/juzicode \n')   
 
import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':
    plt.rc('font',family='SimSun',size='9')
    plt.rc('axes',unicode_minus='False')
    
    x = np.arange(20)
    y = np.sin(x / 2)
    
    plt.step(x, y + 2, label='pre')#默认where='pre'     #step画图方式
    plt.plot(x, y + 2, 'o--', color='green', alpha=0.3) #plot 画图方式

    plt.step(x, y + 1, where='mid', label='mid')
    plt.plot(x, y + 1, '*--', color='red', alpha=0.3)

    plt.step(x, y, where='post', label='post')
    plt.plot(x, y, '<--', color='blue', alpha=0.3)

    plt.grid(axis='both', color='0.8')#axis可以为'x','y','both'三种
    plt.legend(title='参数where:')
    plt.title('step画图 By 桔子code')
    plt.show()

2、hist()直方图

先看一个一维数组x,讨论在一维数组上的含义,首先找到这个一维数组的最小min和最大值max,将这个min~max的长度划分为bins个区间,再在x中找这些数落在每个区间中的数目。

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)

bins,柱子的数目,也就是要把x的值划分为多少个区间。函数原型为None,但是会根据配置文件读出设置为10。

range,不用手动设置,会自动根据x的范围计算,从x.min~x.max。

返回值,第一个返回值为每个bin的数目,是一个array,长度等于入参bins;第二个返回值就是划分这些bins的区间,长度等于bins+1。

是的,这个hist绘图函数会有明确含义的返回值!!

如果传入的x是一个二维数组,这时候hist绘图将会以列为一组数据单独绘制直方图,如果搞错了行列关系导致要处理的列的数目太多,就会因为无法分配足够的资源导致程序挂起或者反应奇慢。

举个栗子,如果要显示一个512*512像素的灰度图的直方图,用pyplot.imread()读出的是一个shape=(512,512)的二维数组,如果直接用hist画直方图,会因为列数太多绘图较慢或者资源不足无法显示,这时应该先将这个二维数组转换为一维数组再画直方图,这样也体现了图像处理中直方图的含义。

A、一维数组的例子

#juzicode.com,#VX:桔子code
import numpy as np
import matplotlib.pyplot as plt
plt.rc('font',family='Youyuan',size='9')
plt.rc('axes',unicode_minus='False')

a = np.random.randn(2000)
print('a.shape=',a.shape)
print('a.max=',a.max(),'a.min=',a.min())
print()
plt.hist(a,bins=50)
plt.title('正态分布 by桔子code')
plt.show()
a.shape= (2000,)
a.max= 3.1718286876888175 a.min= -3.1820211445746693

B、二数组的例子

如果传入hist的数组是二维的,会将每列单独拆分出来绘制直方图,下面的例子是一个包含了2列数据的二维数组。

print('\n-----欢迎来到juzicode.com')
print('-----公众号: 桔子code/juzicode \n')   

import numpy as np
import matplotlib.pyplot as plt
plt.rc('font',family='Youyuan',size='9')
plt.rc('axes',unicode_minus='False')

a = np.random.randn(2000,2) #在numpy数组的列上进行拆分
print('a.shape=',a.shape)
print('a.max=',a.max(),'a.min=',a.min())
print()
plt.hist(a,bins=50)
plt.title('正态分布 by桔子code')
plt.show()

如果是三维数组,不可以直接用hist绘图,需要将三维数组拆分后再绘图,否则会抛异常,一个错误例子和解决方法可以参考这里: Python错误集锦:pyplot.hist()绘制直方图时提示:ValueError: x must have 2 or fewer dimensions

发表评论

电子邮件地址不会被公开。 必填项已用*标注