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))
我有一个图,由 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))