我有两个向量,例如
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越大越好。我希望在每种情况下都可以看到两个值。
P.S。由于我在同一个图中有几对矢量要比较,我不能简单地将两个条并排放置,以避免我想要的混淆,对于每个条两个值。
已编辑:修复代码缩进。将变量名称从price0,price1更改为price1,pirce2。
答案 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()
好处是,这很容易扩展到更多的价格清单;我们只需要在数组中添加另一个列表,为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()
答案 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()