如何在matplotlib轴上标记值范围?

时间:2017-12-20 21:56:01

标签: python matplotlib visualization axis-labels

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

“0”标签跨越两个刻度之间,因为在直方图中只有0s的单独bin,而轴的其余部分是线性的以指示其他bin的边界。 底层并不重要,但是应该有一些指示器“0”跨越整个箱子。

我到目前为止找到的最接近的解决方案是“自己画画”(How to add group labels for bar charts in matplotlib?)。 我期待的是.axvspan()等效于轴(因为.axvline()用于刻度线),就像用于标记.axvspan()的内容一样。

1 个答案:

答案 0 :(得分:6)

轴“没有.axvspan()等价物。 .axvline()也不是“for ticks”。并且没有任何意图用于标记.axvspan()

让我们回答如何在情节下方产生一些红色括号(paranthesis)的问题。您基本上只需绘制一个支架形式的线条,并根据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()

enter image description here