一种方法是在交替位置创建小刻度并赋予它们更大的刻度长度。 AMultipleLocator
主要刻度为 2 时,每 2 个刻度一次。添加MultipleLocator
次要刻度为 1 会填补空白,因为主要刻度会自动抑制重叠位置的次要刻度。刻度线的颜色可以变浅,以获得刻度线和标签之间的更大对比度。
当通过seaborn或pandas生成绘图时,只要可以提供明确的标签列表,同样的方法就可以工作。
from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np
letters = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
N = 80
names = [letters[i // 26] + letters[i % 26] for i in range(N)]
values = np.random.binomial(100, 0.1, N)
cmap = plt.cm.get_cmap('rainbow')
colors = [cmap(i / N) for i in range(N)]
plt.bar(names, values, color=colors)
ax = plt.gca()
ax.xaxis.set_major_locator(ticker.MultipleLocator(2))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))
ax.xaxis.set_minor_formatter(ticker.IndexFormatter(names))
ax.tick_params(axis='x', which='minor', length=15)
ax.tick_params(axis='x', which='both', color='lightgrey')
ax.autoscale(enable=True, axis='x', tight=True)
plt.show()
PS:@MadPhysicist 的评论中添加换行符的想法更加简单。它看起来有点不同:
from matplotlib import pyplot as plt
import numpy as np
letters = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
N = 80
names = [('\n' if i % 2 == 1 else '') + letters[i // 26] + letters[i % 26] for i in range(N)]
values = np.random.binomial(100, 0.1, N)
cmap = plt.cm.get_cmap('rainbow')
colors = [cmap(i / N) for i in range(N)]
plt.bar(names, values, color=colors)
plt.gca().autoscale(enable=True, axis='x', tight=True)
plt.show()