如何获得数据帧的简单散点图(更喜欢使用seaborn)

2024-05-17 05:05:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试分散绘制以下数据帧:

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轴和y轴上的x,y,z列。

当我试图通过mydf.plot(kind="scatter")与pandas进行绘图时,会得到错误ValueError: scatter requires and x and y column。是否必须将数据帧分解为适当的参数?我真正想做的是把这个散布图和西伯恩一起画出来。


Tags: and数据dataframepandasindexplotnp绘制
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")

输出:

Plot of data

只是跑步

mydf.plot(style=".")

对我来说很好:

example scatterplot as result of the code above

相关问题 更多 >