如何在使用自定义刻度定位器和格式化程序时设置轴刻度标签的属性?

时间:2017-10-09 06:48:05

标签: python matplotlib

如果动态设置了刻度线(如下例所示),如何更改刻度标签properties(如sizerotation等)?我试过ax.set_xticklabels(ax.get_xticklabels(), rotation=90, size=7, ha='center'),它没有用。事实上,ax.get_xticklabels()甚至没有返回5中设置的MaxNLocator的正确数量的刻度标签 - 这是一个错误吗?

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, MaxNLocator
fig, ax = plt.subplots()
xs = range(26)
ys = range(26)
labels = list('abcdefghijklmnopqrstuvwxyz')


def format_fn(tick_val, tick_pos):
    if int(tick_val) in xs:
        return labels[int(tick_val)]
    else:
        return ''


ax.xaxis.set_major_formatter(FuncFormatter(format_fn))
ax.xaxis.set_major_locator(MaxNLocator(5, integer=True))
ax.set_xticklabels(ax.get_xticklabels(), rotation=90, size=7, ha='center')
ax.plot(xs, ys)

ax.get_xticklabels()获取空标签: enter image description here

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, MaxNLocator
fig, ax = plt.subplots()
xs = range(26)
ys = range(26)
labels = list('abcdefghijklmnopqrstuvwxyz')


def format_fn(tick_val, tick_pos):
    if int(tick_val) in xs:
        return labels[int(tick_val)]
    else:
        return ''


ax.xaxis.set_major_formatter(FuncFormatter(format_fn))
ax.xaxis.set_major_locator(MaxNLocator(5, integer=True))
ax.set_xticklabels(labels, rotation=90, size=7, ha='center')
ax.plot(xs, ys)

这会将标签偏移1.它应以a开头,而不是benter image description here

在答案here中,plt.xticks可以完成工作。但是,我想知道是否有任何方法可以使用面向对象的界面?因为我不想用plt.xticks全局设置这些属性。

2 个答案:

答案 0 :(得分:0)

您可以在调用plt.xticks(rotation=90)(在交互模式下工作)之前使用plot,或使用仅在非交互模式下工作的plt.setp(ax.xaxis.get_majorticklabels(), rotation=90)

请参阅this post for more info

答案 1 :(得分:-1)

编辑:回想起来,发现了相当合理的解决方案。

ax.set_xticklabels(ax.get_xticklabels(), rotation=90, size=7, ha='center')旨在将标签a g m s y旋转90度并使它们略微变小。从ax.get_xticklabels()获得的两个额外刻度标签在绘图轴限制处为空刻度''。它们正是您告诉您使用MaxNLocator绘制的情节,因为这会选择N个间隔,而不是N刻度。

只有当脚本完成后我才能调用ax am我才真正能够访问刻度标签。这表示在绘图时,未设置刻度标签,仅设置格式器和定位器,稍后生成刻度。这意味着ax.get_xticklabels()会在指定位置返回一个空列表。

因此,要从ax的引用开始工作,您必须手动设置滴答。

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from matplotlib.ticker import FuncFormatter, MaxNLocator
from matplotlib.text import Text
fig, ax = plt.subplots()
xs = range(26)
ys = range(26)
labels = list('abcdefghijklmnopqrstuvwxyz')

def format_fn(tick_val, tick_pos):
    if int(tick_val) in xs:
        return labels[int(tick_val)]
    else:
        return ''

ax.set_xticklabels(labels, rotation=90, size=7, ha='center')
ax.xaxis.set_major_formatter(FuncFormatter(format_fn))
ax.xaxis.set_major_locator(MaxNLocator(5, integer=True))

ax.plot(xs, ys)
plt.show()

作为对ImportanceOfBeingErnest的信任,因为他找到了一个解决这个问题的工作方案,在它成为问题之前:

fig.autofmt_xdate(bottom=0.1, rotation=90, ha='center')

也可以工作,因为图形对象可以在绘图时访问,因此需要“手动”设置刻度标签。但是,请注意,在缩放时,这与set_major_formatterset_major_locator函数之间存在潜在的讨厌交互。

enter image description here