代码之家  ›  专栏  ›  技术社区  ›  Venkatachalam

MatplotLib子批次标题与X记号重叠

  •  0
  • Venkatachalam  · 技术社区  · 6 年前

    我有以下代码来生成模型特性重要性的视觉效果。

    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记号之间有重叠 我试过用“设置位置”来设置标题的位置,但没有成功。有没有办法在这两者之间制造间隙。

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   ImportanceOfBeingErnest    6 年前

    您自己将位置设置为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() 已被另外使用。