如果动态设置了刻度线(如下例所示),如何更改刻度标签properties(如size
,rotation
等)?我试过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)
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)
在答案here中,plt.xticks
可以完成工作。但是,我想知道是否有任何方法可以使用面向对象的界面?因为我不想用plt.xticks
全局设置这些属性。
答案 0 :(得分:0)
您可以在调用plt.xticks(rotation=90)
(在交互模式下工作)之前使用plot
,或使用仅在非交互模式下工作的plt.setp(ax.xaxis.get_majorticklabels(), rotation=90)
。
答案 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_formatter
和set_major_locator
函数之间存在潜在的讨厌交互。