【问题标题】:Plot list of tuples (containing the graph number)绘制元组列表(包含图号)
【发布时间】:2020-04-24 06:12:01
【问题描述】:

我的问题与“Python: plot list of tuples”有关。区别在于元组的结构。第一部分显示图的编号,第二部分显示值 (y)。 我设法将数据从一个大列表中提取到三个列表中。

如何将这个元组列表绘制成三个图(线图)?

[(1, '0'), (1, '4'), (1, '2'), (1, '6'), (1, '3'), (1, '4'), (1, '5'), (1, '6'), (1, '7'), (1, '12'), (1, '23')]
[(2, '1'), (2, '7'), (2, '2'), (2, '4'), (2, '1'), (2, '7'), (2, '2'), (2, '3'), (2, '4'), (2, '2'), (2, '3')]
[(3, '2'), (3, '4'), (3, '4'), (3, '2'), (3, '1'), (3, '13'), (3, '9'), (3, '8'), (3, '4'), (3, '2'), (3, '7')]

【问题讨论】:

  • 请说明您想要的结果是什么。否则,答案将只是:“你不能。”因为:如果每个元组的第一个元素是绘图的编号,那么每个元组中只剩下一个元素。而且你不能从一维数据中绘制一条二维线。
  • 第二个值在 (y) 轴上,对于 (x),每个新元组只加 1。 (x 重新从 0 开始的新图)

标签: python list matplotlib plot


【解决方案1】:

你必须为你的元组创建一个第三维来表示 x 轴,否则没有什么可以绘制的。我假设这些是有序的,并且列表中元组的索引可以被视为一种时间元素。

我认为如果你一步一步地理解它会更容易理解。您可以将每个元组中的第一项视为线条颜色,将第二项视为 y 轴值。假设这些是按顺序排列的,您可以枚举每个列表并将递增值作为您的 x 轴值。

所以遍历所有 3 个列表,然后遍历每个枚举元组,将最终数据集的 x、y 和颜色值附加到主列表 data

将它们放入 pandas 数据框并使用 seaborn 干净地创建您正在寻找的多线图。

import pandas as pd
import seaborn as sns

a = [(1, '0'), (1, '4'), (1, '2'), (1, '6'), (1, '3'), (1, '4'), (1, '5'), (1, '6'), (1, '7'), (1, '12'), (1, '23')]
b = [(2, '1'), (2, '7'), (2, '2'), (2, '4'), (2, '1'), (2, '7'), (2, '2'), (2, '3'), (2, '4'), (2, '2'), (2, '3')]
c = [(3, '2'), (3, '4'), (3, '4'), (3, '2'), (3, '1'), (3, '13'), (3, '9'), (3, '8'), (3, '4'), (3, '2'), (3, '7')]

data = []
for x in [a,b,c]:
    for i, t in enumerate(x):
        data.append([i, t[0], t[1]])

df = pd.DataFrame(data)
df = df.astype(int)
df.columns=['Time','Color','Value']

sns.lineplot(x='Time',y='Value',hue='Color',data=df)

【讨论】:

  • 我使用了这样的答案组合:data = [] for x in [a]: for i, t in enumerate(x): data.append([i, int(t[1])]) plt.plot(*zip(*cleaner(data))) plt.show()
【解决方案2】:

也一样,只是添加一个函数来清理元组,将字符串转换为int:

import matplotlib.pyplot as plt

p1 = [(1, '0'), (1, '4'), (1, '2'), (1, '6'), (1, '3'), (1, '4'), (1, '5'), (1, '6'), (1, '7'), (1, '12'), (1, '23')]
p2 = [(2, '1'), (2, '7'), (2, '2'), (2, '4'), (2, '1'), (2, '7'), (2, '2'), (2, '3'), (2, '4'), (2, '2'), (2, '3')]
p3 = [(3, '2'), (3, '4'), (3, '4'), (3, '2'), (3, '1'), (3, '13'), (3, '9'), (3, '8'), (3, '4'), (3, '2'), (3, '7')]

def cleaner(mylist):
    out = []
    for tup in mylist:
        newtup = tuple()
        for item in tup:
            newtup += (int(item),)
        out.append(newtup)
    return(out)

plt.plot(*zip(*cleaner(p1)))
plt.show()

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2021-12-03
    • 2021-07-22
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2020-12-25
    • 2021-10-28
    相关资源
    最近更新 更多