Заголовок сюжета Matplotlib перекрывается с x галочками - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть следующий код для генерации визуальных элементов для важности функции модели.

def plot_featu_imp(ax,df,plot_title='feature_imp'):
    feature_imp = df
    ax = feature_imp.plot(ax=ax,kind='barh',
                          x='feature_names',y='importn',color='g',sort_columns=True) #figsize=(12,10),
    rects = ax.patches

    for rect in rects:
        # Get X and Y placement of label from rect.
        x_value = rect.get_width()
        y_value = rect.get_y() + rect.get_height() / 2

        # Number of points between bar and label. Change to your liking.
        space = 5
        # Vertical alignment for positive values
        ha = 'left'

        # If value of bar is negative: Place label left of bar
        if x_value < 0:
            # Invert space to place label to the left
            space *= -1
            # Horizontally align label at right
            ha = 'right'

        # Use X value as label and format number with one decimal place
        label = "{:.3f}".format(x_value)

        # Create annotation
        ax.annotate(
            label,                      # Use `label` as label
            (x_value, y_value),         # Place label at end of the bar
            xytext=(space, 0),          # Horizontally shift label by `space`
            textcoords="offset points", # Interpret `xytext` as offset in points
            va='center',                # Vertically center label
            ha=ha,
            fontsize=15,
            color='tab:grey')                     

    ax.spines['top'].set_visible(True)
    ax.spines['right'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    ax.spines['left'].set_visible(False)

    ax.legend().set_visible(False)
    ax.tick_params(top=True, labeltop=True, bottom=False, left=False, right=False, labelleft=True, labelbottom=False,labelsize=20)
    ax.set_xlabel('Importance ',fontsize=20)
    ax.set_ylabel('Feature names',fontsize=20)
    ax.set_title(plot_title,fontsize=25)

    ax.title.set_position([0.1,1])
    return ax

Я хочу создать этот визуал для серии моделей.Например.

fig, ax = plt.subplots(2,1, figsize=(20,10), facecolor='w', edgecolor='k')
# plt.tight_layout()
for i in range(2):
    df=pd.DataFrame({'feature_names':['a','b','c'],'importn':[0.1,0.3,0.6]})
    plot_featu_imp(ax[i],df,'model'+str(i))
plt.show()

plot output Теперь проблема заключается в наложении заголовка на x-метки. Я пытался установить положение заголовка с помощью set_position, но это не такРабота.Есть ли способ создать зазор между этими двумя.

Заранее спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Вы сами устанавливаете позицию на y = 1, которая находится точно над осями.Если бы вы выбрали большее число здесь, вы бы получили название дальше,

ax.title.set_position([0.1,1.25])

Однако я бы предпочел установить для заполнения в пределах вызова set_title:

ax.set_title(plot_title,fontsize=25, loc="left", pad=30)

enter image description here

Здесь дополнительно используется fig.tight_layout().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...