使用定位器而不跳过刻度标签

时间:2018-01-26 05:41:57

标签: python pandas matplotlib

我在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)

然后我明白了: enter image description here

就格式而言,这看起来很棒,但数据点实际上是错误标记的 - 它表示2018实际上是2017年的数据,其中2020年是2021年的数据。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

pandas bar plot生成一个图,其中每个柱放置在一个连续的整数位置,从0开始。使用的定位器是FixedLocator,它存储那些位置(0,1,2,3,...)和formatter是FixedFormatter,用于存储每个位置的ticklabel。如果您现在更改定位器而不更改格式化程序,则事情会变得不同步。要避免这种情况,需要更改格式化程序和定位器。由于在这种情况下我们没有一个好的格式化器,我们应该坚持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()