比较直方图中的两个向量

时间:2017-12-01 00:23:27

标签: python matplotlib vector histogram

我有两个向量,例如

price1 = [28688, 28241, 30091]  
price2 =[27285, 29924, 35291]   

我需要放入直方图以便可视化差异并逐个元素地进行比较。我试过的是

ind = np.arange(N)
width = 0.2     
a1 = plt.bar(ind, price1, width, color='black')
b1 = plt.bar(ind, price2, width, color='red')

但是生成的直方图有一个问题:如果price1的元素(在这个例子中是最后两个)小于price2的相应元素,在图中我看不到它的相对条,而如果它&& #39; s越大越好。我希望在每种情况下都可以看到两个值。

enter image description here

P.S。由于我在同一个图中有几对矢量要比较,我不能简单地将两个条并排放置,以避免我想要的混淆,对于每个条两个值。

已编辑:修复代码缩进。将变量名称从price0,price1更改为price1,pirce2。

2 个答案:

答案 0 :(得分:2)

为了拥有最小的条形图,您可以对数据进行排序。将它放入列数组可以很容易。然后,您可以遍历已排序的数组,根据高度绘制条形图 - 从背景中的最高位置开始。可以根据参数排序数组和ListedColormap完成着色。

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

price1 = [28688, 28241, 30091]
price2 = [27285, 29924, 35291]   
prices = np.c_[price1,price2]

asort = np.argsort(prices,axis=1)
sort = np.sort(prices,axis=1)

cmap=matplotlib.colors.ListedColormap(["black", "red"])
ind = np.arange(prices.shape[0])
width = 0.2 

for i in range(prices.shape[1]-1,-1,-1):
    plt.bar(ind, sort[:,i], width, color=cmap(asort[:,i]))    

plt.show()

enter image description here

好处是,这很容易扩展到更多的价格清单;我们只需要在数组中添加另一个列表,为colormap添加另一种颜色。

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

price1 = [28688, 28241, 30091]
price2 = [27285, 29924, 35291]
price3 = [26000, 29000, 36000]
prices = np.c_[price1,price2,price3]

asort = np.argsort(prices,axis=1)
sort = np.sort(prices,axis=1)

cmap=matplotlib.colors.ListedColormap(["black", "red", "C0"])
ind = np.arange(prices.shape[0])
width = 0.2 

for i in range(prices.shape[1]-1,-1,-1):
    plt.bar(ind, sort[:,i], width, color=cmap(asort[:,i]))    

plt.show()

enter image description here

答案 1 :(得分:1)

我认为您需要检查每个元素并更改绘图顺序。

import numpy as np
import matplotlib.pyplot as plt

N = 3

price1 = [28688, 28241, 30091]
price2 =[27285, 29924, 35291]

ind = np.arange(N)
width = 0.2
bar_handlers_a = []
bar_handlers_b = []
for i, p1, p2 in zip(ind, price1, price2):
    if p1 < p2:
        b1 = plt.bar(i, p2, width, color='red')
        a1 = plt.bar(i, p1, width, color='black')
    else:
        a1 = plt.bar(i, p1, width, color='black')
        b1 = plt.bar(i, p2, width, color='red')

    bar_handlers_a.append(a1)
    bar_handlers_b.append(b1)

plt.show()