matplotlib:如何获得 N 个子图的刻度?

matplotlib: How do I get even ticks for N subplots?

我有一个图,由 5 个不同的图组成,使用 matplotlib 创建,可以在 post 的末尾看到。

x 轴上的刻度到处都是。有的有 2 个,有的有 3 个,甚至没有对齐。

我的问题:有什么方法可以让我始终如一地获得每个图,例如 xtick 0.1、0.5 和 0.9?或者只是告诉 matplotlib 总是显示 N 个 xticks 的方法?

以下是我目前的代码。如果它很糟糕,我深表歉意,我对 matplotlib 非常陌生。

for runtime_data in loader.all_runtime_data:
    fig, axd = plt.subplot_mosaic([['topleft', 'topright'],['midleft', 'midright'],['bottom', 'bottom']])
    for key in runtime_data.keys():
        data = runtime_data[key] 
        # naive
        axd['topleft'].boxplot(data[loader.pingpongKey])
        axd['topleft'].tick_params(axis='both', labelsize=12)
        axd['topleft'].set_xticks([1], ['Pingpong'])
        axd['topleft'].set_ylabel('Time (ms)', fontsize=12)

        axd['topright'].boxplot(data[loader.threadringKey])
        axd['topright'].tick_params(axis='both', labelsize=12)
        axd['topright'].set_xticks([1], ['Threadring'])
        axd['topright'].set_ylabel('Time (ms)', fontsize=12)

        axd['midleft'].boxplot(data[loader.bigKey])
        axd['midleft'].tick_params(axis='both', labelsize=12)
        axd['midleft'].set_xticks([1], ['Big'])
        axd['midleft'].set_ylabel('Time (ms)', fontsize=12)

        axd['midright'].boxplot(data[loader.bangKey])
        axd['midright'].tick_params(axis='both', labelsize=12)
        axd['midright'].set_xticks([1], ['Bang'])
        axd['midright'].set_ylabel('Time (ms)', fontsize=12)

        axd['bottom'].boxplot(data[loader.reverseBangKey])
        axd['bottom'].tick_params(axis='both', labelsize=12)
        axd['bottom'].set_xticks([1], ['Reversebang'])
        axd['bottom'].set_ylabel('Time (ms)', fontsize=12)

        plt.tight_layout()
        plt.savefig('plots/boxplots/' + key + '-boxplot.pgf', bbox_inches='tight')

要对齐 y-axis 上的刻度数,您可以使用 set_yticks() 指定任意列表或数字数组。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(20200417)
all_data = [np.random.randint(0, val, size=100) for val in [10,100,500,1000]]

fig, axd = plt.subplot_mosaic([['topleft', 'topright'],['midleft', 'midright']])
axd['topleft'].boxplot(all_data[0])
axd['topleft'].tick_params(axis='both', labelsize=12)
axd['topleft'].set_xticks([1], ['Pingpong'])
axd['topleft'].set_ylabel('Time (ms)', fontsize=12)
axd['topleft'].set_yticks(np.arange(0,11,5))

axd['topright'].boxplot(all_data[1])
axd['topright'].tick_params(axis='both', labelsize=12)
axd['topright'].set_xticks([1], ['Threadring'])
axd['topright'].set_ylabel('Time (ms)', fontsize=12)
axd['topright'].set_yticks([0,50,100])

axd['midleft'].boxplot(all_data[2])
axd['midleft'].tick_params(axis='both', labelsize=12)
axd['midleft'].set_xticks([1], ['Big'])
axd['midleft'].set_ylabel('Time (ms)', fontsize=12)
axd['midleft'].set_yticks([0,250,500])

axd['midright'].boxplot(all_data[3])
axd['midright'].tick_params(axis='both', labelsize=12)
axd['midright'].set_xticks([1], ['Bang'])
axd['midright'].set_ylabel('Time (ms)', fontsize=12)
axd['midright'].set_yticks([0,500,1000])

plt.tight_layout()
#plt.savefig('plots/boxplots/' + key + '-boxplot.pgf', bbox_inches='tight')
plt.show()

使用具有 3 个箱子和 3 个刻度的 MaxNLocator

import matplotlib.ticker as mticker

for ax in axd.values():
    ax.yaxis.set_major_locator(mticker.MaxNLocator(nbins=3, min_n_ticks=3))

或者带有 3 个刻度的 LinearLocator,尽管这个可能 return 浮动刻度:

import matplotlib.ticker as mticker

for ax in axd.values():
    ax.yaxis.set_major_locator(mticker.LinearLocator(numticks=3))