Python 使用定位器而不跳过记号标签
matplotlib图表x轴上的记号标签有些拥挤,所以我想降低标签出现的频率。似乎有一些函数(multiplelocator、maxlocator)用于此功能,但这些函数只是将现有标签隔开,而不是跳过任何实际的标签。例如,如果我运行这个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
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]
。谢谢-这非常有用,而且解释也很清楚。