添加字符串作为自定义 x 刻度,但同时保留现有(数字)刻度标签? matplotlib.pyplot.annotate 的替代品?

问题描述 投票:0回答:4

我正在尝试生成一个图表,但在注释它时遇到一些问题。

我的图表在 x 轴上有一个对数刻度,显示时间。我想要做的是将现有的(但不可预测的)数字刻度标签保持在 100 个单位、1000 个单位、10000 个单位等,同时还在 x 轴上添加自定义刻度标签,以明确哪里更“人性化”发生“可读”的时间间隔——例如,我希望能够标记“一周”、“一个月”、“6 个月”等。

我可以使用 matplotlib.pyplot.annotate() 来标记点,但它并没有真正做到我想要的。我真的不想在图表顶部添加文本和箭头,我只想添加一些额外的自定义刻度线。有什么想法吗?

python matplotlib annotate axis-labels
4个回答
17
投票

如果您确实想添加额外的刻度,您可以使用

axis.xaxis.get_majorticklocs()
获取现有的刻度,添加您想要添加的任何内容,然后使用
axis.xaxis.set_ticks(<your updated array>)
设置刻度。

另一种方法是使用 axvline

 添加垂直线。优点是您不必担心将自定义刻度插入现有数组,但您必须手动注释这些行。 

另一种选择是添加带有自定义刻度的链接轴。


15
投票
来自

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)
    

5
投票
这是我的解决方案。主要优点是:

    您可以指定轴(对于双轴或同时使用多个轴很有用)
  • 您可以指定轴(在x轴或y轴上打勾)
  • 您可以轻松添加新的蜱虫,同时保留自动的蜱虫
  • 如果您添加已存在的勾号,它会自动替换。
代码:

#!/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')
    

1
投票
我喜欢米格尔上面的回答。效果很好。然而,必须进行一些小的调整。以下:

# 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

© www.soinside.com 2019 - 2024. All rights reserved.