【问题标题】:How do I get a simple scatter plot of a dataframe (preferrably with seaborn)如何获得数据框的简单散点图(最好使用 seaborn)
【发布时间】:2015-05-30 12:26:42
【问题描述】:

我正在尝试散点图以下数据框:

mydf = pd.DataFrame({'x':[1,2,3,4,5,6,7,8,9], 
                 'y':[9,8,7,6,5,4,3,2,1], 
                 'z':np.random.randint(0,9, 9)},
                index=["12:00", "1:00", "2:00", "3:00", "4:00", 
                       "5:00", "6:00", "7:00", "8:00"])



        x   y   z
 12:00  1   9   1
  1:00  2   8   1
  2:00  3   7   7
  3:00  4   6   7
  4:00  5   5   4
  5:00  6   4   2
  6:00  7   3   2
  7:00  8   2   8
  8:00  9   1   8

我希望将时间“12:00, 1:00, ...”作为 x 轴,将 x,y,z 列作为 y 轴。

当我尝试通过 mydf.plot(kind="scatter") 使用 pandas 进行绘图时,我收到错误 ValueError: scatter requires and x and y column。我是否必须将我的数据框分解为适当的参数?我真正想做的是用 seaborn 绘制这个散点图。

【问题讨论】:

    标签: python pandas dataframe seaborn


    【解决方案1】:

    只是跑步

    mydf.plot(style=".")
    

    对我来说很好用:

    【讨论】:

    • 谢谢,这就是我想要的。但我仍然不明白如何通过 seaborn 获得这个。
    • 不清楚您的意思是“与 seaborn”。 Pandas 使用 matplotlib 进行绘图,因此将继承其所有绘图的 seaborn 样式,与直接使用 matplotlib 没有任何不同。
    • 啊,我对此感到困惑。谢谢。
    【解决方案2】:

    Seaborn 实际上是围绕pandas.DataFrames 构建的。但是,您的data frame needs to be "tidy"

    1. 每个变量构成一列。
    2. 每个观察形成一行。
    3. 每种类型的观察单元形成一个表格。

    由于您想在同一个图上绘制 x、y 和 z,因此它们看起来实际上是不同的观察结果。因此,您实际上拥有三个变量:时间、价值和使用的字母。

    "tidy" standard comes from Hadly Wickham, who implemented it in the tidyr package

    首先,我将索引转换为日期时间:

    mydf.index = pd.DatetimeIndex(mydf.index)
    

    然后我们转换成整洁的数据:

    pivoted = mydf.unstack().reset_index()
    

    并重命名列

    pivoted = pivoted.rename(columns={"level_0": "letter", "level_1": "time", 0: "value"})
    

    现在,我们的数据如下所示:

      letter                time  value
    0      x 2019-03-13 12:00:00      1
    1      x 2019-03-13 01:00:00      2
    2      x 2019-03-13 02:00:00      3
    3      x 2019-03-13 03:00:00      4
    4      x 2019-03-13 04:00:00      5
    

    不幸的是,seaborn 不能很好地使用 DateTimes,因此您可以将小时提取为整数:

    pivoted["hour"] = pivoted["time"].dt.hour
    

    有了这种形式的数据框,seaborn 就可以轻松地获取数据了:

    import seaborn as sns
    sns.set()
    
    sns.scatterplot(data=pivoted, x="hour", y="value", hue="letter")
    

    输出:

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 2019-09-26
      • 2020-05-14
      • 2020-12-04
      • 1970-01-01
      • 2018-11-09
      • 2020-11-07
      • 2021-10-28
      • 2015-07-23
      相关资源
      最近更新 更多