在matplotlib中,我希望了解将标签覆盖到轴上的最干净,最强大的方法。这可能最好用一个例子证明:
虽然普通轴标签/刻度线每隔5.00单位放置另外的标签没有刻度已经叠加到轴上(这可以在1113.75处看到,其部分覆盖1114.00和1105.00,完全覆盖)。这些标签的字体和大小与正常,勾选的相同,背景(如果有的话)直到轴(如刻度标记)。
在matplotlib中获取此效果的最简单方法是什么?
修改
根据@ Ken的建议,我设法通过使用ax.yaxis.get_ticklines
和ax.yaxis.get_ticklabels
获取效果现有的刻度/标签来删除刻度标记并更改背景/标签的font / zorder。但是,我不确定如何最好地为轴添加新的刻度/标签。
换句话说,我正在寻找一个函数add_tick(ax.yaxis, loc)
,它会在位置loc
添加一个勾号,并返回tickline
和ticklabel
个对象供我操作。< / p>
答案 0 :(得分:0)
我从未尝试过这样做,但我认为Artist tutorial可能会对您有所帮助。特别是,最后一节有以下代码:
for line in ax1.yaxis.get_ticklines():
# line is a Line2D instance
line.set_color('green')
line.set_markersize(25)
line.set_markeredgewidth(3)
我认为使用像line.set_markersize(0)
之类的东西可能会使标记的大小为零。困难的部分可能是找到那些需要做的事情。 line.xdata
或line.ydata
数组可能包含足够的信息来隔离您需要的数据。当然,如果您手动添加刻度标记,则可能会在执行此操作时返回实例,因此您可以在创建实例时对其进行修改。
答案 1 :(得分:0)
我能够设计的最佳解决方案:
# main: axis; olocs: locations list; ocols: location colours
def overlay_labels(main, olocs, ocols):
# Append the overlay labels as ticks
main.yaxis.set_ticks(np.append(main.yaxis.get_ticklocs(), olocs))
# Perform generic formatting to /all/ ticks
# [...]
labels = reversed(main.yaxis.get_ticklabels())
markers = reversed(main.yaxis.get_ticklines()[1::2]) # RHS ticks only
glines = reversed(main.yaxis.get_gridlines())
rocols = reversed(ocols)
# Suitably format each overlay tick (colours and lines)
for label,marker,grid,colour in izip(labels, markers, glines, rocols):
label.set_color('white')
label.set_backgroundcolor(colour)
marker.set_visible(False)
grid.set_visible(False)
它不是特别优雅但似乎确实有效。