首页 > 解决方案 > Seaborn Scatter 中一行的图形部分

问题描述

我有一个数据框,它是由日期时间索引的列,我想在 Seaborn 的列中散点图由日期时间索引的每一行的一部分。我不知道如何做到这一点并使它看起来可读。

我曾尝试在 x 和 y 轴上使用 loc 和 iloc 进行 scatter 调用,但我无法让它绘制。

df = pd.DataFrame({'123': ['20.908', 8.743, 8.34, 2.4909],
                 '124': ["2", 2.34, 0, 4.1234],
                  '412': ["3", 20.123, 3.123123, 0],
                   '516': ["5", 20.123, 3.123123, 0],
                   '129': ["10", 20.123, 3.123123, 0]},

                 index=['2015-01-10', '2015-02-10', '2015-03-10', '2015-04-10'])

df2 = df.transpose()

df2 是我想要绘制的数据框,尽管两者都可以。

所需的输出是每行的散点图,其中 x 按时间索引,y 是行值。

标签: pythonseaborn

解决方案


有点猜测,但是...

df = pd.DataFrame({'123': [20.908, 8.743, 8.34, 2.4909],
                 '124': [2, 2.34, 0, 4.1234],
                  '412': [3, 20.123, 3.123123, 0],
                   '516': [5, 20.123, 3.123123, 0],
                   '129': [10, 20.123, 3.123123, 0]},

                 index=['2015-01-10', '2015-02-10', '2015-03-10', '2015-04-10'])

# Melt & set index as datetime
df = df.reset_index().melt(id_vars='index', var_name='col', value_name='value').set_index('index')
df = df.set_index(pd.DatetimeIndex(df.index))

# Select data to plot by slicing datetime index
df_plot = df.loc[(df.index > pd.Timestamp('2015-02-01')) 
              & (df.index < pd.Timestamp('2015-04-30'))]

# Plot
sns.scatterplot(data=df_plot,
                x=df_plot.index.to_native_types(),
                    # Use to_native_types to handle datetime index
                y='value',
                hue='col',
                palette=sns.color_palette("Set1", df_plot['col'].nunique()))
                    # Specify palette & number of colors to 
                    # handle values stored as strings 
                    # (seemingly a seaborn bug)

散点图

请注意,seaborn 不能很好地处理日期,并且有比这个答案更好的处理日期时间轴的方法。参见,例如这个问题及其答案


推荐阅读