python matplotlib 多个子图、堆积柱状图、频次/频率直方图绘画

子图的绘画通过add_subplot进行。

如下所示,先根据figsize定义的图片大小调用plt.figure画图,然后通过返回的fig对象,调用fig.add_subplot函数进行对应子图的绘画,前两个参数是每行以及每列的子图个数,下面代码所示为2*2的由4个子图构成的图片。第三个参数代表子图的编号,按行开始从1开始编号1、2、3、4……

figsize = 18,18

fig = plt.figure(figsize=figsize)

ax1 = fig.add_subplot(2,2,1)

之后可通过调用返回的ax对象进行画图操作,尤其是设置每个子图的刻度字体,需要通过ax.get_xticklabels()和ax.get_yticklabels进行调用。

ax1.plot(index1,distance_distribution1,'-r',linewidth=5.0)

plt.tick_params(labelsize=25)

plt.xlabel('distance',font2)

plt.ylabel('probability',font2)

labels = ax1.get_xticklabels() + ax1.get_yticklabels()

[label.set_fontname('Times New Roman') for label in labels]

plt.axis([0, 1.2, 0, 0.175])  #代表横纵坐标的取值范围,前两个为x轴范围,后两个为y轴范围

plt.grid(linestyle='--')  #用于设置网格,--代表为虚线,默认值plt.grid(True)为实线

堆积柱状图的绘画主要调用plt.bar函数,下面给出一个画堆积柱状图的简单示例。

第一行先画一个简单的柱状图,之后使用for循环进行累加调用,bottom是指当前要画的柱状下面的柱形长度,也就是说在y[i]之前y[0:i]的总和,是一个累计的过程。

在我们这里,y原本是一个矩阵,有n行3列,所以取y[0]是取矩阵第一行的三个值,也就是一个三维向量。

sub_max取得是矩阵y的前i行,然后使用map(sum,zip(*sub_matrix))是对矩阵进行按列求和,每一列求一个值,也就是求对应位上的累计值。

这里的color设置值是因为我调用了beautifulplot中的颜色,不使用这个包的话,可以调换成普通的颜色设置

p1 = plt.bar(np.arange(3), y[0], width,color=set2[0])

bar = []

for i in range(1,4):
    
    sub_matrix = y[0:i]
    
    print sub_matrix
    
    csum = map(sum,zip(*sub_matrix))
    
    print csum
    
    p3 = plt.bar(np.arange(3), y[i], width,bottom=csum,color=set2[i])
    
    bar.append(p3)

频次直方图

plt.hist(all_distance_vector, bins=15, color="#13eac9",range=(0,1.5))

其中bins可以设置直方图桶的个数,值越多区间分隔越细;range可以设置直方图上显示的数值分布范围,即最左边bin和最右边bin的大小。

有时候我们想画密度直方图,对应纵轴y轴为密度,则可以使用

plt.hist(all_distance_vector,normed=1, bins=15, color="#13eac9",range=(0,1.5))

通过参数normed可以将直方图变为整体面积为1,纵轴为密度值。

有时我们想画频率分布直方图,纵轴是落在每个区间上的频率,而非频次,此时可以使用

plt.hist(all_distance_vector,weights=np.zeros_like(all_distance_vector) + 100./ all_distance_vector.size, bins=15, color="#13eac9",range=(0,1.5))
如果我们想画累计直方图,也就是说从左到右依次累计,我们可以添加参数 cumulative=True。


猜你喜欢

转载自blog.csdn.net/u010358304/article/details/79301357