我正在尝试生成一个图表,但在注释它时遇到一些问题。
我的图表在 x 轴上有一个对数刻度,显示时间。我想要做的是将现有的(但不可预测的)数字刻度标签保持在 100 个单位、1000 个单位、10000 个单位等,同时还在 x 轴上添加自定义刻度标签,以明确哪里更“人性化”发生“可读”的时间间隔——例如,我希望能够标记“一周”、“一个月”、“6 个月”等。
我可以使用 matplotlib.pyplot.annotate() 来标记点,但它并没有真正做到我想要的。我真的不想在图表顶部添加文本和箭头,我只想添加一些额外的自定义刻度线。有什么想法吗?
如果您确实想添加额外的刻度,您可以使用
axis.xaxis.get_majorticklocs()
获取现有的刻度,添加您想要添加的任何内容,然后使用 axis.xaxis.set_ticks(<your updated array>)
设置刻度。
另一种方法是使用 axvline
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)
#!/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')
# 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。