【问题标题】:How can I label a span of values on matplotlib axis?如何在 matplotlib 轴上标记一系列值?
【发布时间】:2018-06-03 12:53:43
【问题描述】:

在我的直方图中,我需要像这样注释 X 轴:

“0”标签跨越两个刻度,因为只有直方图中的 0 有一个单独的 bin,而轴的其余部分是线性的,以指示其他 bin 的边界。 下括号并不重要,但应该有一些指示符表明“0”跨越整个 bin。

到目前为止,我发现的最接近的解决方案是“自己绘制”(How to add group labels for bar charts in matplotlib?)。 我正在寻找与轴等效的.axvspan()(因为.axvline() 用于刻度),例如用于标记.axvspan() 的东西。

【问题讨论】:

    标签: python matplotlib visualization axis-labels


    【解决方案1】:

    没有.axvspan() 等价于轴”".axvline()" 也不是 "for ticks"。而且也没有任何用于标记.axvspan() 的内容。

    所以让我们回答如何在图下方生成一些红色括号(括号)的问题。您基本上可以以括号的形式绘制一条线并根据 xaxis 变换定位它。下面是执行此操作的函数。

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots()
    ax.bar(range(-1,5),range(3,9), width=1, align="edge", ec="k", alpha=1)
    ax.set_xticks(range(1,6))
    
    
    def bracket(ax, pos=[0,0], scalex=1, scaley=1, text="",textkw = {}, linekw = {}):
        x = np.array([0, 0.05, 0.45,0.5])
        y = np.array([0,-0.01,-0.01,-0.02])
        x = np.concatenate((x,x+0.5)) 
        y = np.concatenate((y,y[::-1]))
        ax.plot(x*scalex+pos[0], y*scaley+pos[1], clip_on=False, 
                transform=ax.get_xaxis_transform(), **linekw)
        ax.text(pos[0]+0.5*scalex, (y.min()-0.01)*scaley+pos[1], text, 
                    transform=ax.get_xaxis_transform(),
                    ha="center", va="top", **textkw)
    
    bracket(ax, text="0", pos=[-1,-0.01], linekw=dict(color="crimson", lw=2) )
    plt.show()
    

    【讨论】:

    • “自己画”,然后
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多