python - 如何获得具有交替距离的 xticks?
问题描述
我有一个条形图,其中 x 轴有国家的 2 个字母标签。我必须选择一个非常小的字体,所以 x-ticks 不会相互重叠。有什么方法可以指定 x 刻度和 x 轴之间的距离,这样我就可以选择更大的字体而不会重叠标签?
目前:
期望的例子:
axis: ----------------------
ticks: c1 c3 ...
c2 c4 ...
解决方案
一种方法是在交替位置创建次要刻度并赋予它们更大的刻度长度。主要刻度的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()
推荐阅读
- html - 如何在百里香的文本框中设置预设值?
- c# - C# 实现特定类型函数的泛型类列表
- vue.js - 如何在vueJS中获取重定向链中的最后一个url
- javascript - 为什么在执行 GET XmlHttpRequest 时无法读取和提取此 HTTP 标头?
- themes - 有没有办法将 jupyter 样式添加到 google colab 中?
- php - Symfony 5:在扩展的加载方法中加载包时出错
- spring - 客户端断开连接后 Spring RSocket 高 CPU 使用率
- css - 如何将以下子元素左对齐到第一个子元素的右边缘?
- html - 跨度元素忽略 TranslateZ()
- php - 如果 php.ini 中的 memory_limit 设置为 -1 是什么意思?