Python / Matplotlib - 查找一组条形

时间:2017-08-10 09:32:47

标签: python matplotlib drawing

我有来自Matplotlib的这张图片: enter image description here

我想为图中的每个类别(cat i with i in [1-10])写出最高值及其相应的图例。 下面你可以直观地找到我想要实现的目标: enter image description here

事实是,由于matplotlib的绘图方式,我不知道是否可能。

基本上,这是绘制多个条形码的部分:

# create plot
fig, ax = plt.subplots(figsize = (9,9))
index = np.arange(len_category)
if multiple:
    bar_width = 0.3
else :
    bar_width = 1.5
opacity = 1.0
#test_array contains test1 and test2
cmap = get_cmap(len(test_array))

for i in range(len(test_array)):
        count = count + 1
        current_label = test_array[i]
        rects = plt.bar(index-0.2+bar_width*i, score_array[i], bar_width, alpha=opacity, color=np.random.rand(3,1),label=current_label )

plt.xlabel('Categories')
plt.ylabel('Scores')
plt.title('Scores by Categories')
plt.xticks(index + bar_width, categories_array)
plt.legend()        

plt.tight_layout()
plt.show()

这是我为了做我想要实现的目标而添加的部分。但它会搜索图形中所有条形的最大值。例如,test1的最大值为cat10,test2的最大值为cat2。相反,我希望拥有每个类别的最大值

 for i in range(len(test_array)):
       count = count + 1
       current_label = test_array[i]
       rects = plt.bar(index-0.2+bar_width*i, score_array[i], bar_width,alpha=opacity,color=np.random.rand(3,1),label=current_label )

       max_score_current = max(score_array[i])
       list_rect = list()
       max_height = 0
       #The id of the rectangle who get the highest score
       max_idx = 0

         for idx,rect in enumerate(rects):
            list_rect.append(rect)
            height = rect.get_height()
            if height > max_height:
                max_height = height
                max_idx = idx
            highest_rect = list_rect[max_idx]
            plt.text(highest_rect.get_x() + highest_rect.get_width()/2.0, max_height,  str(test_array[i]),color='blue', fontweight='bold')
         del list_rect[:]

您对我如何实现这一目标有所了解吗?

谢谢

2 个答案:

答案 0 :(得分:2)

通常最好将数据生成和可视化分开。在绘图之前,只需获取必要的数据,而不是遍历条形本身。这使一切变得更加简单。

首先创建一个要使用的标签列表,然后循环遍历这些位置以进行注释。在下面的代码中,标签是通过字典将列数组的argmax映射到测试集来创建的。

import numpy as np
import matplotlib.pyplot as plt

test1 = [6,4,5,8,3]
test2 = [4,5,3,4,6]

labeldic = {0:"test1", 1:"test2"}

a = np.c_[test1,test2]
maxi = np.max(a, axis=1)
l = ["{} {}".format(i,labeldic[j]) for i,j in zip(maxi, np.argmax(a, axis=1))]

for i in range(a.shape[1]):
    plt.bar(np.arange(a.shape[0])+(i-1)*0.3, a[:,i], width=0.3, align="edge", 
            label = labeldic[i])

for i in range(a.shape[0]): 
    plt.annotate(l[i], xy=(i,maxi[i]), xytext=(0,10), 
                 textcoords="offset points", ha="center")
plt.margins(y=0.2)
plt.legend()
plt.show()

enter image description here

答案 1 :(得分:2)

从您的问题来看,您想要实现的目标并不完全清楚,但假设您希望打印在该栏上方的一个组中每个栏的相对高度,这是实现该目标的一种方法:

count

结果如下:

enter image description here