【问题标题】:Using locators without skipping tick labels使用定位器而不跳过刻度标签
【发布时间】:2018-07-05 11:52:08
【问题描述】:

matplotlib 图表的 x 轴上的刻度标签有点拥挤,所以我正在考虑降低标签出现的频率。似乎有一些功能(multiplelocator,maxnlocator),但这些只是将现有标签隔开,而不是跳过任何实际标签。例如,如果我运行这个

df = pd.DataFrame(columns=['bond 1','bond 2'],
                  index=[2017,2018,2019,2020,2021,2022])
df['bond 1'] = [4,5,6,6,5,4]
df['bond 2'] = [8,6,4,4,6,8]

fig,ax=plt.subplots(1)
ax = df.plot(ax=ax, kind='bar', colormap='copper')

locator = tick.MultipleLocator(base=2)
ax.xaxis.set_major_locator(locator)

然后我得到这个:

就格式而言,这看起来不错,但数据点实际上被错误标记了——它说 2018 年实际上是 2017 年的数据,它说 2020 年是 2021 年的数据。

谁能告诉我是否有任何简单的方法可以将标签隔开而不会将它们映射到错误的数据点上?

谢谢!

【问题讨论】:

  • 我不知道定位器,但在this answer 中有一种方法可以做到这一点。适应你的例子:for label in ax.xaxis.get_ticklabels()[1::2]: 然后label.set_visible(False)
  • @ThomasKühn:谢谢,这实际上是一个很好的解决方法。
  • 好的,如果这对您有帮助,您介意我将其标记为重复吗(即使它不是 Locator 解决方案)?
  • @ThomasKühn 是的,当然 - 随便你怎么想。

标签: python pandas matplotlib


【解决方案1】:

pandas 条形图生成一个图,其中每个条形都放置在从 0 开始的连续整数位置。使用的定位器是 FixedLocator,它存储这些位置 (0,1,2,3,...),格式化程序是 @ 987654323@ 存储每个位置的刻度标签。如果您现在更改定位器而不更改格式化程序,事情就会不同步。为了避免这种情况,需要同时更改格式化程序和定位器。由于我们没有在这种情况下使用好的格式化程序,我们应该坚持使用FixedFormatter,这也意味着坚持使用FixedLocator。我们可能仍会更改 FixedLocator 的刻度数并更改 FixedFormatter 以反映这一点。

import matplotlib.pyplot as plt
from matplotlib import ticker 
import pandas as pd

df = pd.DataFrame(columns=['bond 1','bond 2'],
                  index=[2017,2018,2019,2020,2021,2022])
df['bond 1'] = [4,5,6,6,5,4]
df['bond 2'] = [8,6,4,4,6,8]

fig,ax=plt.subplots(1)
ax = df.plot(ax=ax, kind='bar', colormap='copper')

locator = ax.xaxis.get_major_locator()
locator.locs = locator.locs[::2]
formatter = ax.xaxis.get_major_formatter()
formatter.seq = formatter.seq[::2]

plt.show()

【讨论】:

  • @ThomasKühn Uhhh,我刚刚看到该解决方案不适用于一般情况,在计算来自nbins 的刻度数时发生了一些奇怪的魔法,需要小心的。因此,我编辑了答案。当然,现在可以使用 [::N] 而不是 [::2],其中 N 是任何非零正整数。
  • 谢谢 - 这很有帮助,解释也很清楚。
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多