【问题标题】:Plotting Pandas DF with Numpy Arrays用 Numpy 数组绘制 Pandas DF
【发布时间】:2020-06-24 12:19:13
【问题描述】:

我有一个带有多列的 Pandas df,里面的每个单元格都有不同数量的 Numpy 数组元素。我想为列中的每个单元格绘制数组的所有元素。

我试过了

plt.plot(df['column'])
plt.plot(df['column'][0:])

两者都给出了 ValueErr:用序列设置数组元素

将这些值绘制到其对应的索引非常重要,因为索引表示此数据帧中的线性时间。如果有人向我展示如何正确执行此操作,我将不胜感激。也许除了 matplotlib.pylot 之外还有一个更适合这个的包?

谢谢

【问题讨论】:

    标签: python-3.x pandas numpy matplotlib


    【解决方案1】:

    plt.plot 需要一个 x 坐标列表和一个同样长的 y 坐标列表。由于您似乎希望将数据框的索引用于 x 坐标,并将每个单元格内容用于 y 坐标,因此您需要将 x 值重复与 y 坐标长度一样多的次数。

    请注意,这种格式不适合线图,因为连接后续点会创建一些奇怪的垂直线。 plt.plot 接受一个标记作为其第三个参数,例如 '.'在每个位置画一个简单的点。

    代码示例:

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    N = 30
    df = pd.DataFrame({f'column{c}':
                           [np.random.normal(np.random.uniform(10, 100), 1, np.random.randint(3, 11)) for _ in range(N)]
                       for c in range(1, 6)})
    legend_handles = []
    colors = plt.cm.Set1.colors
    desired_columns = df.columns
    for column, color in zip(desired_columns, colors):
        for ind, cell in df[column].iteritems():
            if len(cell) > 0:
                plotted, = plt.plot([ind] * len(cell), cell, '.', color=color)
        legend_handles.append(plotted)
    plt.legend(legend_handles, desired_columns)
    plt.show()
    

    请注意,pandas 并不是要在单元格中存储完整的数组。首选方法是以“长”形式创建一个数据框,每个值都位于单独的行中(重复“索引”)。 pandas 和 seaborn 的大部分函数都不理解单元格内的数组。

    这是一种创建可以使用 Seaborn 调用的长表单的方法:

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    import seaborn as sns
    
    N = 30
    df = pd.DataFrame({f'column{c}':
                           [np.random.normal(np.random.uniform(10, 100), 1, np.random.randint(3, 11)) for _ in range(N)]
                       for c in range(1, 6)})
    
    desired_columns = df.columns
    df_long_data = []
    for column in desired_columns:
        for ind, cell in df[column].iteritems():
            for val in cell:
                dict = {'timestamp': ind, 'column_name': column, 'value': val}
                df_long_data.append(dict)
    df_long = pd.DataFrame(df_long_data)
    sns.scatterplot(x='timestamp', y='value', hue='column_name', data=df_long)
    plt.show()
    

    【讨论】:

    • 这回答了你的问题吗?
    【解决方案2】:

    根据您的问题,您要绘制的每个单元格中都有 numpy 数组。要将您的数据传递给 plt.plot() 方法,您可能需要单独传递每个单元格,因为每当您尝试像您一样将其作为一个整体传递时,它实际上是您传递的一个序列。但是 plot() 方法将接受一个 numpy 数组。 这可能会有所帮助:

    for column in df.columns:
        for cell in df[column]:
            plt.plot(cell)
            plt.show()
    

    【讨论】:

    • 嗨,我试了一下。它为每个单元格输出一个单独的空图。我需要一个图表来显示整个列
    • 您可以使用 Matplotlib 模块中的多图功能:这将有助于python-course.eu/matplotlib_subplots.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多