我正在尝试制作一个图表,我正在注意一些问题。
我的图表在x轴上有一个对数刻度,显示时间。我希望能够做的是将现有(但不可预测)的数字刻度标签保持在100个单位,1000个单位,10000个单位等,还要在x轴上添加自定义刻度标签,以便更清楚“人类”可读的“时间间隔发生 - 例如我希望能够标记'一周','一个月','6个月'等。
我可以使用matplotlib.pyplot.annotate()来标记点,但它并没有真正做我想要的。我真的不想在图表上方放置文字和箭头,我只想添加一些额外的自定义刻度标记。有什么想法吗?
答案 0 :(得分:16)
如果您真的想添加额外的刻度,可以使用axis.xaxis.get_majorticklocs()
获取现有的刻度,添加要添加的内容,然后使用axis.xaxis.set_ticks(<your updated array>)
设置刻度。
另一种方法是添加垂直线using axvline
。优点是您不必担心将自定义tick插入现有数组,但您必须手动注释这些行。
另一种替代方法是使用自定义刻度添加链接轴。
答案 1 :(得分:12)
来自http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.xticks:
# return locs, labels where locs is an array of tick locations and
# labels is an array of tick labels.
locs, labels = xticks()
所以你需要做的就是获取locs
和labels
,然后根据自己的喜好修改labels
(虚拟示例):
labels = ['{0} (1 day)','{0} (1 weak)', '{0} (1 year)']
new_labels = [x.format(locs[i]) for i,x in enumerate(labels)]
然后运行:
xticks(locs, new_labels)
答案 2 :(得分:5)
这是我的解决方案。主要优点是:
代码:
#!/usr/bin/python
from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
#Function to add ticks
def addticks(ax,newLocs,newLabels,pos='x'):
# Draw to get ticks
plt.draw()
# Get existing ticks
if pos=='x':
locs = ax.get_xticks().tolist()
labels=[x.get_text() for x in ax.get_xticklabels()]
elif pos =='y':
locs = ax.get_yticks().tolist()
labels=[x.get_text() for x in ax.get_yticklabels()]
else:
print("WRONG pos. Use 'x' or 'y'")
return
# Build dictionary of ticks
Dticks=dict(zip(locs,labels))
# Add/Replace new ticks
for Loc,Lab in zip(newLocs,newLabels):
Dticks[Loc]=Lab
# Get back tick lists
locs=list(Dticks.keys())
labels=list(Dticks.values())
# Generate new ticks
if pos=='x':
ax.set_xticks(locs)
ax.set_xticklabels(labels)
elif pos =='y':
ax.set_yticks(locs)
ax.set_yticklabels(labels)
#Get numpy arrays
x=np.linspace(0,2)
y=np.sin(4*x)
#Start figure
fig = plt.figure()
ax=fig.add_subplot(111)
#Plot Arrays
ax.plot(x,y)
#Add a twin axes
axr=ax.twinx()
#Add more ticks
addticks(ax,[1/3,0.75,1.0],['1/3','3/4','Replaced'])
addticks(axr,[0.5],['Miguel'],'y')
#Save figure
plt.savefig('MWE.pdf')
答案 3 :(得分:1)
我喜欢Miguel的上述答案。工作得很好。但是,必须进行小幅调整。以下内容:
# Get back tick lists
locs=Dticks.keys()
labels=Dticks.values()
必须更改为
# Get back tick lists
locs=list(Dticks.keys())
labels=list(Dticks.values())
因为,在Python 2.7 + / 3中,Dict.keys()和Dict.values()返回dict_keys和dict_values对象,matplotlib不喜欢(显然)。有关PEP 3106中这两个对象的更多信息。