即使具有较高的zorder,matplotlib文本也不位于补丁的顶部

时间:2019-02-15 16:46:24

标签: python pandas matplotlib

我在一个轴上绘制了雌性的数据,在另一个轴上绘制了雄性的数据。每个图都是用zorder = 0绘制的,但位置分别为position = 1和position = 2。我用zorder = 1,but as you can see的文本标记条,条与文本重叠。是因为它们在不同的轴上吗?在这种情况下,如何使一个轴上的文本高于另一个轴上的最高zorder?

def get_ages():
    df = pd.read_csv('surveydata.csv', low_memory=False)

    fems = df.loc[df['gender'] == 1]
    males =  df.loc[df['gender'] == 2]

    fdata = fems['age'].value_counts()
    mdata = males['age'].value_counts()

    fdata.sort_index(inplace=True)
    mdata.sort_index(inplace=True)
    print(fdata)
    print(mdata)
    fdata2 = fdata[0:14]
    mdata2 = mdata[0:14]
    fdata2['>31'] = sum(fdata[14:])
    mdata2['>31'] = sum(mdata[14:])

    fig = plt.figure()  # Create matplotlib figure

    ax = fig.add_subplot(111)  # Create matplotlib axes
    ax2 = ax.twinx()  # Create another axes that shares the same x-axis as ax.


    fdata2.plot(kind='bar', figsize=(10, 5.7), width=.4, color='pink', position=0, ax=ax,zorder=0)
    mdata2.plot(kind='bar', figsize=(10, 5.7), width=.4, color='lightskyblue', position=1, ax=ax2, zorder=0)
    ax.set_title("Ages", fontsize=18)
    ax.set_ylabel("Occurrence", fontsize=18)
    ax.set_facecolor('snow')
    ax.set_xlim(ax.patches[0].get_x() - 1, ax.patches[-1].get_x() + 1)
    ax2.set_yticks([])
    totals = []

    for i in ax.patches:
        totals.append(i.get_height())

    total = sum(totals)

    for i in ax.patches:
        ax.text(i.get_x() , i.get_height() + .5,
                str(round((i.get_height() / total) * 100, 2)) + '%', fontsize=8,
                color='black', horizontalalignment='left', zorder=9)



    totals = []
    for i in ax2.patches:
        totals.append(i.get_height())

    total = sum(totals)

    for i in ax2.patches:
        t = ax2.text(i.get_x()+ i.get_width(), i.get_height() + .5,
                str(round((i.get_height() / total) * 100, 1)) + '%', fontsize=8,
                color='black', horizontalalignment='right', zorder=10)

        for x in ax.texts: #Shifts text up and down in case they overlap.
            bb2 = x.get_window_extent(ax.get_figure().canvas.get_renderer())
            bb = t.get_window_extent(ax.get_figure().canvas.get_renderer())

            while bb2.overlaps(bb):
                t.set_y(a._y - .01)
                bb2 = x.get_window_extent(ax.get_figure().canvas.get_renderer())
                bb = t.get_window_extent(ax.get_figure().canvas.get_renderer())

0 个答案:

没有答案