具有不同垂直起点和终点的垂直条形图

时间:2020-01-09 08:56:57

标签: python

我正在尝试编写一个代码,该代码绘制从头到尾运行的竖线。每个条都有不同的起点和终点,所有点均为负。我尝试使用plt.bar,但到目前为止还没有真正的成功。

import matplotlib.pyplot as plt

x  = 1
y  = [-97, -27]

plt.subplot(111, frameon=False)
plt.ylim(-280, 1)
plt.bar(x+0.0, y,  width=0.1)

但是,这会创建一个从-97到0(而不是-97到-27)的条形图。如何以一种不错的方式绘制此图?

Plt.bar()首先绘制从0到-97的条形,然后从0到-27绘制条形。我可以在背景色中绘制第二个条形,但是我发现这是一个丑陋的解决方案。有人知道如何解决这个问题吗?

谢谢!

我想要的例子: An example of what I want

1 个答案:

答案 0 :(得分:0)

您必须使用bar绘图功能的bottom参数。

默认情况下,条形接地为0。 在下面的示例中,我定义了一些带有两端的钢筋。 Matplotlib需要底点和高度。 因此,我用列表理解来计算它们:

  • [abs(b[0] - b[1]) for b in bars]返回每个小节的高度;
  • [min(b) for b in bars]给出每个小节的底部。

然后您也可以玩颜色等等。

由您决定如何存储条形坐标。 要么坚持目前的格式,要么两端都坚持。 另外,您可以进行更改以更适合Matplotlib的用法,将它们存储为(bottom, height)

import matplotlib.pyplot as plt

def main():

    bars = [(-97, -27), (-50, -10), (-2, -15)]

    plt.subplot(111, frameon=False)
    plt.xlim(-1, len(bars))
    plt.ylim(-100, 1)

    plt.bar(range(len(bars)),
            [abs(b[0] - b[1]) for b in bars],
            bottom=[min(b) for b in bars],
            width=0.1)
    plt.show()

if __name__ == "__main__":
    main()

如果希望Matplotlib自动处理不同的条形颜色,请在同一轴上多次调用bar函数。

import matplotlib.pyplot as plt

def main():

    bars = [(-1, -14), (-3, -20), (-2, -23), (-2, -26)]

    fig, ax = plt.subplots(1, 1, figsize=(5, 10))
    plt.xlim(0, len(bars)+4)
    plt.ylim(-28, 1)
    plt.xticks([])

    for i, bar in enumerate(bars):
        ax.bar(i+3,
               abs(bar[0] - bar[1]),
               bottom=min(bar),
               width=0.9)
    plt.show()

if __name__ == "__main__":
    main()

enter image description here