0

在 matplotlib 中,我想知道将标签覆盖到轴上的最干净、最可靠的方法。这可能最好用一个例子来说明:

标签

虽然每 5.00 个单位放置正常轴标签/刻度,但轴上已覆盖了额外的不带刻度的标签(这可以在 1113.75 看到,部分覆盖 1114.00 和完全覆盖的 1105.00)。标签的字体和大小也与它们正常的、勾选的、背景(如果有的话)一直到轴(就像刻度线一样)对应的字体和大小相同。

在 matplotlib 中获得这种效果的最简单方法是什么?

编辑 根据@Ken 的建议,我已经设法通过使用和删除刻度标记并更改标签的背景/字体/zorder来获得现有刻度/标签的效果。但是,我不确定如何最好地向轴添加新的刻度/标签。ax.yaxis.get_ticklinesax.yaxis.get_ticklabels

换句话说,我正在寻找一个add_tick(ax.yaxis, loc)在位置添加刻度loc并返回ticklineticklabel对象供我操作的函数。

4

2 回答 2

0

我从未尝试过这样做,但我认为Artist 教程可能对您有所帮助。特别是,最后一节有以下代码:

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.xdataor数组可能line.ydata包含足够的信息来隔离您需要的信息。当然,如果您手动添加刻度线,则可能会在您这样做时返回实例,因此您可以在创建它们时修改它们。

于 2012-08-08T22:29:20.507 回答
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)

它不是特别优雅,但似乎确实有效。

于 2012-08-16T13:13:56.067 回答