如何使用matplotlib创建堆叠线图?

Dav*_*ill 44 python matplotlib

我希望能够用Python 生成一个堆叠的线图(类似于这里使用的方法)(最好使用matplotlib,但另一个库也可以).我怎样才能做到这一点?

这类似于他们网站上的堆叠条形图示例,除了我希望条形图的顶部与线段连接并且下面的区域要填充.我可以通过减少条形之间的间隙和使用大量条形来近似这个(但这看起来像是一个黑客,而且我不确定它是否可能).

Hoo*_*ked 55

较新版本的matplotlib包含该功能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()
Run Code Online (Sandbox Code Playgroud)

使用plt.stackplot堆栈图.


dou*_*oug 50

我认为Area Plot是这种类型的绘图的常用术语,并且在OP,Stacked Area Plot中列举的具体实例中.

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()
Run Code Online (Sandbox Code Playgroud)

堆积区域图的示例

  • 既然你想要非常完整,为什么不把它变成`stackplot(x,yn,colorlist)`并在上游提交一个功能请求bug? (13认同)

Ben*_*ier 7

稍微不那么强硬的方式是首先使用折线图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')
Run Code Online (Sandbox Code Playgroud)


edg*_*ase 6

如果您有一个数据框,这很容易:

df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area();
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

来自:熊猫文档