代码之家  ›  专栏  ›  技术社区  ›  David Underhill

如何使用matplotlib创建堆积折线图?

  •  42
  • David Underhill  · 技术社区  · 14 年前

    我希望能够生成一个堆积折线图(类似于使用的方法 here )使用python(最好使用matplotlib,但另一个库也可以)。我该怎么做?

    这和 stacked bar graph example 在他们的网站上,除了我希望顶部的酒吧连接线段和下面的区域被填补。我可以通过减少钢筋之间的间隙和使用大量的钢筋来估计这一点(但这看起来像是一个黑客,而且我不确定是否可能)。

    4 回复  |  直到 7 年前
        1
  •  48
  •   lofidevops    8 年前

    我相信 area plot >是此类型绘图的常用术语,并且在特定实例中背诵在op, Stacked Area plot >。

    Matplotlib没有“开箱即用”的功能,该功能结合了 both的数据处理和绘图/渲染步骤来创建这种类型的绘图,但很容易从Matplotlib和Numpy提供的组件中滚动您自己的绘图。

    下面的代码首先是堆栈,然后是绘图 导入numpy as np 从Matplotlib导入Pyplot作为plt #只是创建一些随机数据 Fnx=lambda:np.random.randint(3、10、10) y=np.行_堆栈((fnx(),fnx(),fnx())) #调用“cumsum”(累计和),传递您的y数据, #必须避免手动排序数据集 x=np.平均值(10) y_stack=np.cumsum(y,axis=0)3x10数组 图=plt.图()) ax1=图添加子批次(111) ax1.fill_between(x,0,y_stack[0,:],facecolor=“cc6666”,alpha=0.7) ax1.在(x,y_堆栈[0,:],y_堆栈[1,:],facecolor=“1dacd6”,alpha=0.7)之间填充_ ax1.在(x,y_堆栈[1,:]、y_堆栈[2,:]、facecolor=“6e5160”)之间填充_ 显示() < /代码>


    情节,在具体的情况下,在操作中背诵, 堆积面积图 .

    Matplotlib没有“开箱即用”功能 二者都 数据处理和绘图/渲染步骤可以创建这种类型的绘图,但是很容易从Matplotlib和Numpy提供的组件中滚动自己的绘图。

    下面的代码是第一个 堆栈 然后数据 绘制 情节。

    import numpy as NP
    from matplotlib import pyplot as PLT
    
    # just create some random data
    fnx = lambda : NP.random.randint(3, 10, 10)
    y = NP.row_stack((fnx(), fnx(), fnx()))   
    # this call to 'cumsum' (cumulative sum), passing in your y data, 
    # is necessary to avoid having to manually order the datasets
    x = NP.arange(10) 
    y_stack = NP.cumsum(y, axis=0)   # a 3x10 array
    
    fig = PLT.figure()
    ax1 = fig.add_subplot(111)
    
    ax1.fill_between(x, 0, y_stack[0,:], facecolor="#CC6666", alpha=.7)
    ax1.fill_between(x, y_stack[0,:], y_stack[1,:], facecolor="#1DACD6", alpha=.7)
    ax1.fill_between(x, y_stack[1,:], y_stack[2,:], facecolor="#6E5160")
    
    PLT.show()
    

    example of stacked area plot

        2
  •  54
  •   Victor Claude COULOMBE    10 年前

    Matplotlib的较新版本包含函数 plt.stackplot >,which allow for each different”out of the box“stacked area plots:”

    导入numpy as np 导入Pylab为plt x=np.平均值(0,10,1) y=x+5*np.随机.随机((5,x.尺寸) 基线=[“零”,“对称”,“摆动”,“加权摆动”] 对于枚举(基线)中的n、v: PLT.子批次(2、2、N+1) plt.stackplot(x,*y,基线=v) 商标名称(五) PLT.轴(“紧”)。 显示() < /代码>

    plt.stackplot
    ,允许多个不同的“开箱即用”堆积面积图:

    import numpy as np
    import pylab as plt
    
    X = np.arange(0, 10, 1) 
    Y = X + 5 * np.random.random((5, X.size))
    
    baseline = ["zero", "sym", "wiggle", "weighted_wiggle"]
    for n, v in enumerate(baseline):
        plt.subplot(2 ,2, n + 1)
        plt.stackplot(X, *Y, baseline=v)
        plt.title(v)
        plt.axis('tight')
    plt.show()
    

    Stack Plot using plt.stackplot.

        3
  •  7
  •   Benjamin Bannier    14 年前

    一个稍微简单一点的方法是首先使用线图,然后 matplotlib.pyplot.fill_between . 要模拟叠加,您必须自己将点向上移动。

    x = np.arange(0,4)
    y1 = np.array([1,2,4,3])
    y2 = np.array([5,2,1,3])
    # y2 should go on top, so shift them up
    y2s = y1+y2
    
    plot(x,y1)
    plot(x,y2s)
    fill_between(x,y1,0,color='blue')
    fill_between(x,y1,y2s,color='red')
    
        4
  •  4
  •   edge-case    7 年前

    如果你有一个数据帧,很容易:

    df=pd.dataframe(np.random.rand(10,4),columns=['a'、'b'、'c'、'd')
    DF。
    < /代码> 
    
    

    发件人:pandas文档

    enter image description here

    来自: pandas documentation