首页 > 解决方案 > 如何获得具有交替距离的 xticks?

问题描述

我有一个条形图,其中 x 轴有国家的 2 个字母标签。我必须选择一个非常小的字体,所以 x-ticks 不会相互重叠。有什么方法可以指定 x 刻度和 x 轴之间的距离,这样我就可以选择更大的字体而不会重叠标签?

目前:

在此处输入图像描述

期望的例子:

axis:  ----------------------
ticks: c1  c3  ...
         c2  c4   ...

标签: pythonmatplotlibseaborn

解决方案


一种方法是在交替位置创建次要刻度并赋予它们更大的刻度长度。主要刻度的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()

使用换行符绘图


推荐阅读