简体   繁体   中英

x-labels rendered twice on matplotlib plot

I have a plot that uses 9 labels on the x-axis. However, because I have split up the plot into two axes, it seems that it requires 18 labels (hence the added list of empty strings) instead for some reason.

This seems to make the x-labels be rendered twice, making them seem to have a bold typeface. Image of the problem is attached.

And here is the current code I'm using. I apologize for the quality of the code. I am new to matplotlib.

    benchmark_data = all_benchmark_data[loader.pingpongKey]

    fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(9,7), dpi=80)
    fig.subplots_adjust(hspace=0.05)

    ax1.boxplot(benchmark_data.values())
    ax2.boxplot(benchmark_data.values())

    ax1.set_ylim(380, 650) 
    ax2.set_ylim(110, 180)

    # hide the spines between ax and ax2
    ax1.spines.bottom.set_visible(False)
    ax2.spines.top.set_visible(False)
    ax1.xaxis.tick_top()
    ax1.tick_params(labeltop=False)  # don't put tick labels at the top
    ax2.xaxis.tick_bottom()

    ax1.tick_params(axis='both', labelsize=10)
    ax2.tick_params(axis='both', labelsize=10)

    xlabels = ['', '', '', '', '', '', '', '', ''] + (list(benchmark_data.keys()))
    ax1.set_xticklabels(xlabels)
    ax1.set_ylabel('Time (ms)', fontsize=10)
    ax1.yaxis.set_label_coords(-0.06,0)
    #ax2.set_ylabel('Time (ms)', fontsize=10)
    plt.xticks(fontsize=10, rotation=45)

    ax1.yaxis.set_major_locator(ticker.MaxNLocator(nbins=5, min_n_ticks=5))
    ax2.yaxis.set_major_locator(ticker.MaxNLocator(nbins=5, min_n_ticks=5))

    d = .5  # proportion of vertical to horizontal extent of the slanted line
    kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
                linestyle="none", color='k', mec='k', mew=1, clip_on=False)
    ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
    ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

    plt.tight_layout()
    plt.savefig('plots/boxplots/' + loader.pingpongKey + '-boxplot.png', 
    bbox_inches='tight')

在此处输入图像描述

Because you are using sharex=True , the second time you plot the boxplot you will create another 9 ticks that are added to the axis (which is in common between ax1 and ax2 ). The solution in your case is to turn off sharex (the axis will be aligned anyway) and set the xticklabels on ax2 :

# No sharex.
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(9,7), dpi=80)

# ...

# Set ticks for ax2 instead of ax1 and only the 9 labels are needed.
ax2.set_xticklabels(list(benchmark_data.keys()))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM