Home > database >  x-labels rendered twice on matplotlib plot
x-labels rendered twice on matplotlib plot

Time:05-26

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')

enter image description here

CodePudding user response:

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()))
  • Related