如何在Y轴的不同高度上绘制列表列表?

时间:2018-12-06 21:09:51

标签: python list matplotlib

通过在Python中具有列表列表,我需要使用Y轴上的台阶将它们(使用Matplotlib和Python)绘制在另一个列表之下。
例如:ll = [[1,2,3], [0,3,4]]

对于ll,是列表列表,Y轴上的步长为4(最大值)。 偏移量初始化为0。 随着每个列表的绘制,偏移量将随着Y轴上的步进而增加。 每个列表在X轴上的值为1,2,3,因为每个子列表中都有3个点。
对于第一个列表,Y轴上的值将为1,2,3(偏移量为0),对于第二个列表,Y轴上的值将为4,6,7,我将offset(0 + step(4)= 4)添加到每个元素。

对于下一个元素,偏移量将为8。此值将添加到第3个列表中的每个元素(如果示例中存在),依此类推... 我还需要连接同一列表中的点。 ll只能包含2个以上的列表。 情节看起来像:
Plotted list of lists

我编写的代码:

x = np.arange(0, len(list_of_lists[0]))
y = list_of_lists[0]

step_on_y = max([item for sublist in list_of_lists for item in sublist])

lines = []
rows = 0
for list_in in range(len(list_of_lists)):
    for i in range(0, len(list_of_lists[list_in]) - 1):
        pair = [(x[i], list_of_lists[list_in][i] + rows), (x[i + 1], list_of_lists[list_in][i+1] + rows)]
        lines.append(pair)
    rows = rows + step_on_y

linecoll = matcoll.LineCollection(lines)
fig, ax = plt.subplots()

ax.add_collection(linecoll)
print(len(x), len(list_of_lists)*len(list_of_lists[0]))
plt.scatter(x, y, s=1)

plt.xlabel('X')
plt.ylabel('Y')
plt.xticks(x)
plt.ylim(0, 30)

plt.show()

我得到的结果是: The result I get

我如何获得理想的结果?我应该在代码中修改什么?

2 个答案:

答案 0 :(得分:1)

我相当肯定您正在使这一过程变得更加复杂。

这是一段代码,应该可以执行您想要的操作 (我添加了一条水平的灰色虚线以显示下一个“列表”的绘图开始的位置)
PS:在此示例中,我使用上一个列表的最大值作为下一个列表的偏移量,以确保绘图之间不重叠,但是您可以轻松地使其恒定或自定义它

import numpy as np
import matplotlib.pyplot as plt

ll = [[1,2,3], [1,3,4], [1,1,1], [4,5,6]]
c = ['k','r','b','g','c']

x = np.arange(0, len(ll[0]))
a = np.array( ll)


step = 0
ax = plt.subplot()
for n,l in enumerate( a):
    ax.plot(x, l + step)
    ax.scatter(x, l + step)
    ax.axhline(y=step, color='#cccccc', dashes=[5,3])

    step += np.max(l)

plt.show()

答案 1 :(得分:1)

我的方法是在一个绘图命令中绘制所有线条,包括圆。

因此,我使用ll的numpy数组表示形式,并将偏移量添加到从第二个开始的所有子列表中。 偏移量数组只是每个子列表的最大值的累积和。

import numpy as np
import matplotlib.pyplot as plt

ll = [[1,2,3], [1,3,4], [2, 3, 4], [1, 1, 2]]
arr = np.array(ll).T

arr[:, 1:] += np.cumsum(np.max(arr[:, :-1], axis=0))

plt.subplots()
plt.plot([1, 2, 3], arr, '-o', mfc='w')

enter image description here