Подзаголовки строятся неправильно, matplotlib

#matplotlib #subplot

#matplotlib #подзаголовок

Вопрос:

Я хотел бы иметь сетку 2×2, каждая из которых состоит из 8 раз по три столбца рядом друг с другом. Это потому, что у меня есть четыре параметра оценки, каждый из которых оценивает качество 8 языков для трех моделей.

Я смог построить один из них, но он не работает для трех других, находящихся в моей сетке сюжета.

На данный момент это выглядит так: введите описание изображения здесь

 eval_list = ["F1-Werte (micro)", "Precision", "Recall", "Accuracy"]
lang_list = ["Alle Sprachen", "Chinesisch", "Deutsch", "Englisch", "Finnisch", "Französisch", "Italienisch", "Spanisch"]

x = np.arange(start=1, stop=9, step=1)


fig, axes = plt.subplots(2, 2, figsize=(10,10), sharex=False)
df_list = list()
count = 0
for eval_elem in eval_list:
    flair = list()
    bert = list()
    roberta = list()

    for lang in lang_list:
        flair.append(dfBest.query("Eval==@eval_elem").query("Lang==@lang").query("Model=='multiflair'").iloc[0]['Average'])
        bert.append(dfBest.query("Eval==@eval_elem").query("Lang==@lang").query("Model=='bert'").iloc[0]['Average'])
        roberta.append(dfBest.query("Eval==@eval_elem").query("Lang==@lang").query("Model=='roberta'").iloc[0]['Average'])
    
    #ax = plt.subplot(2,2,count 1)
    
    a = 1 if count > 1 else 0
    b = 1 if count%2!=0 else 0
    
    axes[a][b].bar(x-0.2, flair, width=0.2, color='b', align='center')
    axes[a][b].bar(x, bert, width=0.2, color='g', align='center')
    axes[a][b].bar(x 0.2, roberta, width=0.2, color='r', align='center')

    plt.xticks(x, lang_list, rotation=90)
    plt.title(eval_list[count])
    plt.legend(bbox_to_anchor=(1.1, 1), labels=["multiflair", "bert", "roberta"])
    plt.show()
    count  = 1
  

Три списка flair, bert и roberta представляют данные, и все они правильно отображают список из восьми чисел с плавающей запятой на каждой итерации, но в остальном я не знаю, что не так с макетом.

Комментарии:

1.Тогда я бы попробовал axes = np.flatten(axes) count полностью избавиться for n, eval_elem in enumerate(val_list): ... ax = axes[n] от них. Таким образом, вы не беспокоитесь о 2D-аспекте этого списка осей. Затем избавьтесь от всех plt. основанных функций и поместите ax. везде. удалить plt.show() из цикла и добавить fig.show() после него.

2. Я бы bar_kwargs = dict(width=0.2, align='center') ax.bar(..., ..., **bar_kwargs) также добавил туда и для компактности, поскольку эти параметры являются общими для всех баров.

3. Что вы подразумеваете под командой np.flatten ? Это говорит мне, что у numpy не было такой команды (хотя я знаю, что она должна существовать)

4. Остальное понятно, спасибо за ваши отзывы и идею с bar_kwargs

5. Ах, да, мой плохой, flatten это ndarray метод, а не функция модуля. axes = np.array(axes).flatten() затем. Это превратится [[ax0, ax1], [ax2, ax3]] в [ax0, ax1, ax2, ax3] так, чтобы было легче выполнять итерации.