使用matplotlib.pyplot.fill绘制多条曲线

时间:2015-01-16 15:34:52

标签: python numpy matplotlib

我正在尝试在matplotlib中创建一个'fill'图形,该图形来自一对包含要绘制多个“曲线”的numpy数组。 numpy数组的形式为:

xarray([[   0],    #curve 1
        [ 100],    #curve 1
        [ 200],    #curve 1
        [   0],    #curve 2
        [ 100],    #curve 2
        [ 200]])   #curve 2

yarray([[ 11],     #curve 1
        [ 22],     #curve 1
        [ 22],     #curve 1
        [ 19],     #curve 2
        [ 12],     #curve 2
        [  0]])    #curve 2

此示例代码中有两条曲线(即x = 0-200两次)。实际的数组有~300条曲线,所有曲线都是从x = 0开始的,尽管我可以根据需要对它们进行编号(使用包含曲线编号的另一个数组)。每个xy对中的点数也各不相同。

我想用alpha值〜0.01(即几乎透明)绘制它们,以便大多数曲线下方的区域显示最多的颜色。

但是,如果我将x和y数组放入fill函数(plt.fill(xarray, yarray, alpha=0.01)),它会将所有数据视为单个曲线,因此当曲线位于其顶部时,alpha值不会堆叠。

我不确定如何将x和y数组更改为plt.fill函数将接受的逗号分隔数组列表。某些东西,以便最终结果将等同于我手动编写:

plt.fill(x1, y1, x2, y2, ... yn, xn, alpha=0.01)

有什么想法吗?

如果我没有充分解释任何问题,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:1)

您需要将系列分成多个数组并调用绘图功能。这些图将在同一图中绘制。您需要每个系列的长度来分割系列或使用标记分割(如您所说" 0"是(总是?)连接系列的第一个元素。

import numpy as np
import matplotlib.pyplot as plt

xarray = np.array([[   0],    #curve 1
                   [ 100],    #curve 1
                   [ 200],    #curve 1
                   [   0],    #curve 2
                   [ 100],    #curve 2
                   [ 200]])   #curve 2

yarray = np.array([[ 11],     #curve 1
                   [ 22],     #curve 1
                   [ 22],     #curve 1
                   [ 19],     #curve 2
                   [ 12],     #curve 2
                   [  0]])    #curve 2

# can the value "0" can be used separate xy pairs?
indices = np.argwhere(xarray[:,0] == 0)
for i in range(len(indices)):
    try:
        i0 = indices[i]
        i1 = indices[i+1]
    except:
        i0 = indices[i]
        i1 = len(xarray[:,0])
    plt.fill(xarray[i0:i1,0], yarray[i0:i1,0])
plt.show()

答案 1 :(得分:0)

通过使用各种numpy例程进行一些调整,您可以尝试以下内容:

import numpy as np
from matplotlib import pyplot as plt

x = np.array([[   0], [ 100], [ 200],
              [   0], [ 100], [ 200], 
              [0], [100], [200], [300]])
y = np.array([[ 11], [ 22], [ 22],
              [ 19], [ 12], [  0],
              [11], [33], [11], [22]])
indices = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 2])

split = np.where(np.diff(indices))[0] + 1
x = np.squeeze(x)
y = np.squeeze(y)
x = np.split(x, split)
y = np.split(y, split)

xy = np.vstack((x, y))
xy = xy.T.flatten()

plt.figure()
plt.fill(*xy, alpha=0.01)
plt.show()

所有与xy混在一起的方法是让两个数组很好地排列成一个数组,然后您可以使用*arg方法作为{的输入{1}}。