我正在尝试在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)
有什么想法吗?
如果我没有充分解释任何问题,请告诉我。谢谢!
答案 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()
所有与x
和y
混在一起的方法是让两个数组很好地排列成一个数组,然后您可以使用*arg
方法作为{的输入{1}}。