Python 使用定位器而不跳过记号标签

Python 使用定位器而不跳过记号标签,python,pandas,matplotlib,Python,Pandas,Matplotlib,matplotlib图表x轴上的记号标签有些拥挤,所以我想降低标签出现的频率。似乎有一些函数(multiplelocator、maxlocator)用于此功能,但这些函数只是将现有标签隔开,而不是跳过任何实际的标签。例如,如果我运行这个 df = pd.DataFrame(columns=['bond 1','bond 2'], index=[2017,2018,2019,2020,2021,2022]) df['bond 1'] = [4,5,6,6,5,4

matplotlib图表x轴上的记号标签有些拥挤,所以我想降低标签出现的频率。似乎有一些函数(multiplelocator、maxlocator)用于此功能,但这些函数只是将现有标签隔开,而不是跳过任何实际的标签。例如,如果我运行这个

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年的数据

有没有人能告诉我,有没有什么简单的方法可以将标签隔开,而不让它们映射到错误的数据点上


谢谢

pandas条形图生成一个绘图,其中每个条形图都位于一个连续的整数位置,从0开始。正在使用的定位器是一个
FixedLocator
,它存储这些位置(
0,1,2,3,
),格式化程序是一个
FixedFormatter
,它存储每个位置的标签。如果现在更改定位器而不更改格式化程序,则会出现不同步。为了避免这种情况,需要同时更改格式化程序和定位器。因为在这种情况下我们没有好的格式化程序可供使用,所以我们应该坚持使用
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()

pandas条形图生成一个绘图,其中每个条形图都位于从0开始的连续整数位置。正在使用的定位器是一个
FixedLocator
,它存储这些位置(
0,1,2,3,
),格式化程序是一个
FixedFormatter
,它存储每个位置的标签。如果现在更改定位器而不更改格式化程序,则会出现不同步。为了避免这种情况,需要同时更改格式化程序和定位器。因为在这种情况下我们没有好的格式化程序可供使用,所以我们应该坚持使用
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()

我不知道定位器,但有一种方法可以做到。根据您的示例:
对于ax.xaxis.get_ticklebals()[1::2]:
然后
label.set_visible(False)
@ThomasKühn:谢谢,这实际上是一个很好的解决方法。好的,如果这对您有帮助,您介意我将其标记为重复(即使它不是
定位器
解决方案)?@ThomasKühn是,当然-你认为最好的。可能的重复我不知道定位器,但有一种方法可以做到这一点。根据您的示例:
对于ax.xaxis.get_ticklebals()[1::2]:
然后
label.set_visible(False)
@ThomasKühn:谢谢,这实际上是一个很好的解决方法。好的,如果这对您有帮助,您介意我将其标记为重复(即使它不是
定位器
解决方案)?@ThomasKühn是,当然-不管你怎么想。可能是@ThomasKühn uhh的重复,我只是看到解决方案在一般情况下不起作用,在计算nbins的滴答数时会出现一些奇怪的魔法,这是需要注意的。因此,我编辑了答案。当然,现在可以使用
[::2]
而不是
[::N]
,其中N是任何非零正整数。谢谢-这非常有用,而且解释也很清楚。@ThomasKühn uhh,我刚刚看到解决方案不适用于一般情况,从
nbins
计算滴答声的数量时,会出现一些奇怪的魔法,需要注意这些。因此,我编辑了答案。当然,现在可以用N表示任何非零正整数来代替
[::2]
。谢谢-这非常有用,而且解释也很清楚。