rep*_*man 182 python matplotlib
我想对绘图中的几个选定的刻度标签进行一些修改.
例如,如果我这样做:
label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
Run Code Online (Sandbox Code Playgroud)
更改刻度标签的字体大小和方向.
但是,如果尝试:
label.set_text('Foo')
Run Code Online (Sandbox Code Playgroud)
刻度标签未被修改.如果我这样做:
print label.get_text()
Run Code Online (Sandbox Code Playgroud)
没有打印.
这里有些陌生.当我尝试这个时:
from pylab import *
axes = figure().add_subplot(111)
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
axes.plot(t, s)
for ticklabel in axes.get_xticklabels():
print ticklabel.get_text()
Run Code Online (Sandbox Code Playgroud)
仅打印空字符串,但该图包含标记为"0.0","0.5","1.0","1.5"和"2.0"的刻度线.
Joe*_*ton 258
警告:除非ticklabels已经设置为字符串(通常是例如boxplot中的情况),否则这将不适用于任何比matplotlib更新的版本1.1.0.如果您使用当前的github主服务器,这将无法正常工作.我不确定问题是什么......这可能是一次意想不到的改变,或者可能不是......
通常,你会沿着这些方向做点什么:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# We need to draw the canvas, otherwise the labels won't be positioned and
# won't have values yet.
fig.canvas.draw()
labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'
ax.set_xticklabels(labels)
plt.show()
Run Code Online (Sandbox Code Playgroud)

要理解为什么需要跳过这么多箍,你需要更多地了解matplotlib的结构.
Matplotlib故意避免对蜱等进行"静态"定位,除非明确告知.假设您需要与绘图进行交互,因此绘图,刻度,刻度标签等的边界将会动态变化.
因此,您不能只设置给定刻度标签的文本.默认情况下,每次绘制绘图时,都会由轴的定位器和格式化程序重新设置.
但是,如果将Locators和Formatters设置为静态(FixedLocator和FixedFormatter分别),则tick标签保持不变.
这是什么set_*ticklabels或ax.*axis.set_ticklabels做什么.
希望这更清楚地说明为什么更改单个刻度标签有点令人费解.
通常,您实际想要做的只是注释某个位置.在那种情况下,请研究一下annotate.
CT *_*Zhu 85
在较新版本中matplotlib,如果您没有使用一堆str值设置刻度标签,则''默认情况下(当绘图时,标签只是刻度值).知道了,要获得所需的输出,需要这样的东西:
>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>,
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>,
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()
Run Code Online (Sandbox Code Playgroud)
结果:

现在如果你检查一下_xticklabels,它们就不再是一堆了''.
>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']
Run Code Online (Sandbox Code Playgroud)
它适用于从1.1.1rc1当前版本的版本2.0.
raf*_*lle 76
也可以使用pylab和xticks来做到这一点
import pylab as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()
Run Code Online (Sandbox Code Playgroud)
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
sta*_*nri 11
axis类有一个set_yticklabels函数,允许你设置刻度标签,如下所示:
#ax is the axes instance
group_labels = ['control', 'cold treatment',
'hot treatment', 'another treatment',
'the last one']
ax.set_xticklabels(group_labels)
Run Code Online (Sandbox Code Playgroud)
我还在研究为什么你上面的例子不起作用.
自问这个问题已经有一段时间了。截至今天(matplotlib 2.2.2),经过一些阅读和试用,我认为最佳/正确的方法如下:
Matplotlib有一个名为模块,ticker即“中包含用于支持完全可配置的蜱定位和格式化”。要修改绘图中的特定刻度,以下对我有用:
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
def update_ticks(x, pos):
if x == 0:
return 'Mean'
elif pos == 6:
return 'pos is 6'
else:
return x
data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()
Run Code Online (Sandbox Code Playgroud)
警告! x是刻度的值,并且pos是刻度在轴上的相对位置。请注意,建立索引时,其pos值以开头1,而不是0通常的。
就我而言,我试图y-axis用百分比值格式化直方图的格式。mticker有另一个名为的类PercentFormatter,可以轻松实现此目的,而无需像以前一样定义单独的函数:
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()
Run Code Online (Sandbox Code Playgroud)
在这种情况下xmax,数据值对应于100%。百分比计算为x / xmax * 100,这就是我们固定的原因xmax=1.0。同样,decimals是要在该点之后放置的小数位数。
这也适用于 matplotlib 3:
x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']
plt.xticks(x1, squad, rotation=45)
Run Code Online (Sandbox Code Playgroud)
小智 6
这有效:
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(1,1)
x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']
ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)
Run Code Online (Sandbox Code Playgroud)
如果您不使用figandax并且想要修改所有标签(例如用于规范化),您可以执行以下操作:
labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))
Run Code Online (Sandbox Code Playgroud)