Python使用matplotlib绘制堆积图

标签: CV  Python  matplotlib

堆积图,在计算机视觉的论文中是相当常见而表现力极强的一种图示方法,其表现为:

固定高度的矩形中,根据某一些数值意义相同的不同变量根据其数值大小占据矩形中连续的高度;

其与饼图相相似,都可以很清晰地表示不同变量所占比重大小的不同;

而它又优于饼图,当我们把不同时间状态下的比较结果拼接起来后,就可以很清楚看到随着时间的演进或者进程的进行,这些变量的权重比例发生的变化和趋势!

效果如下——

注:图1是小编本人的实验结果;图2是摘自论文Switchable Normalization的图,。

(一)原理

如上图所示,堆积图的形成原理即是先在同一个位置画出不同高度的图,新的高度是基于之前的所有值的和,再增加自身的高度得到的;

最后的工作就是把他们按照顺序叠在一起就可以了。一般来说,matplotlib如果没有特殊说明(调用 plt.close())那么就会在原来图的基础上继续做图。

(二)代码实现

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

col = ['yellow', 'lightskyblue', 'lightgreen', 'maroon', 
       'mediumseagreen', 'mediumvioletred', 'paleturquoise', 'pink', 
       'salmon', 'seagreen', 'orangered', 'olive', 'navy']
# 定义我们的颜色集合,没有特别说明的话,系统也会自己配置

"""
假设我们要画一个 m 行 n 列的堆积图,我们需要
矩阵:M --[m,n]
Steps:
    1) 手动盖第一层
        plt.bar(np.range(n), M[0], label, color)
        参数含义:a. 规定我们这个图有几条柱子 --[0, 1, 2, ..., (n-1)]
                 b. 作用于 M 的第一行 --[n,]
                 c. 第一层的名字(字符串)
                 d. 颜色(字符串)
"""
plt.bar(sr, M[0] / Div, label='layer_{}'.format(str(0)))

"""
Steps:
    2) for 循环继续构建剩余的层
        plt.bar(np.range(n), M[0], bottom, label, color)
        参数含义:a. 规定我们这个图有几条柱子 --[0, 1, 2, ..., (n-1)]
                 b. 作用于 M 的第一行 --[n,]
                 c. 用之前的值求和作为这一层的基础 --[n,]
                 d. 第一层的名字(字符串)
                 e. 颜色(字符串)
"""
for i in range(1, M.shape[0]):
    plt.bar(np.range(n), M[i, :], bottom=np.sum(M[0:i, :], axis = 0), label='layer_{}'.format(str(i)), color=col[i])

plt.legend()
plt.show()

plt.savefig('sample.jpg')# 保存
plt.close()

如果有多组要保持高度不变的话,可以对每一列做归一化,即每一列的所有元素除以这一列所有元素的和。

 

 

 

原文链接:加载失败,请重新获取