如何获得数据框的简单散点图(最好使用 seaborn)
How do I get a simple scatter plot of a dataframe (preferrably with seaborn)
我正在尝试散点图以下数据框:
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 绘制这个散点图。
就运行
mydf.plot(style=".")
适合我:
Seaborn 实际上是围绕 pandas.DataFrame
构建的。但是,您的 data frame needs to be "tidy":
- 每个变量构成一列。
- 每个观察值形成一行。
- 每种类型的观测单元组成一个table。
由于您想在同一个图上绘制 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")
输出:
我正在尝试散点图以下数据框:
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 绘制这个散点图。
就运行
mydf.plot(style=".")
适合我:
Seaborn 实际上是围绕 pandas.DataFrame
构建的。但是,您的 data frame needs to be "tidy":
- 每个变量构成一列。
- 每个观察值形成一行。
- 每种类型的观测单元组成一个table。
由于您想在同一个图上绘制 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")
输出: