来自多个数据帧的pairplot列,这些数据帧由类别列中的类标记

2024-06-16 15:01:42 发布

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

我不知道如何做到这一点,但我相信这是可行的。我有三个dataframes具有相同的列定义,但数据集来自不同的年份。然后,我想成对地绘制数字列,一列一列地绘制这些df中的数据,并适当地标记数据来源的集合。目的是了解按年份比较的每一列的数据模式

我用这2dataframes来说明我的意思,其中df1中的数据集分别来自2018年和df22019

df1
          id      speed    accelaration      jerk      mode
0          1      1.94     -1.01             1.05      foot
1          1      0.93      0.04            -0.17      foot
2          3      0.50     -0.16             0.05      bike
3          3      0.57      0.05             0.19      bike
4          5      3.25     -0.13            -0.09      bus
5          5      0.50     -0.25             0.25      bus
6          5      0.25      0.10             0.25      bus

df2
          id    speed   accelaration      jerk      mode
0         17      1.5      0.00           0.00      foot
1         17      1.5      0.00          -0.30      foot
2         17      1.5     -0.30           0.06      foot
3         15     4.55      0.01          -0.36      bike
4         15     4.57     -0.35           0.02      bike
5         87     9.82     -0.29          -0.12      bus
6         87     8.65     -0.78           0.07      bus

忽略id列,我希望得到一个类似于此图的结果(这只是我绘制的预期结果的一个示例):

enter image description here

简单地为每个df调用sns.pairplot()两次不会得到预期的结果,正如我所做的那样:

sns.pairplot(df1, vars=df1.columns[1:4], hue='mode')
sns.pairplot(df2, vars=df2.columns[1:4], hue='mode')
plt.show()

enter image description here

有人能描述一下如何从中得到预期的答案吗


Tags: 数据iddfmode绘制df1speeddf2
1条回答
网友
1楼 · 发布于 2024-06-16 15:01:42
  • 给定数据帧,在每个数据帧中添加一个'year'
  • 使用pandas.concat组合数据帧
    • 重置索引,但不要删除它。索引将用作x轴,因为尚未提供索引。这将保持来自每个数据帧的数据的相对位置
  • 'speed''acceleration''jerk'堆叠成一列'event',以创建一个长而整齐的格式数据帧
  • ^{}绘制数据,并用^{}映射。
    • 'index'列而不是dfl.index用作x-axis
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# add year to the dataframes
df1['year'] = 2018
df2['year'] = 2019

# combine the dataframes
df = pd.concat([df1, df2]).reset_index()

# stack the dataframe into a long (tidy) format
dfl = df.set_index(['index', 'id', 'mode', 'year']).stack().reset_index().rename(columns={'level_4': 'event', 0: 'value'})

# display(dfl)
   index  id  mode  year         event  value
0      0   1  foot  2018         speed   1.94
1      0   1  foot  2018  accelaration  -1.01
2      0   1  foot  2018          jerk   1.05
3      1   1  foot  2018         speed   0.93
4      1   1  foot  2018  accelaration   0.04
5      1   1  foot  2018          jerk  -0.17
6      2   3  bike  2018         speed   0.50
7      2   3  bike  2018  accelaration  -0.16
8      2   3  bike  2018          jerk   0.05
9      3   3  bike  2018         speed   0.57


# plot a FacetGrid mapped with a scatterplot
g = sns.FacetGrid(data=dfl, row='event', col='mode', hue='year')
g.map(sns.scatterplot, 'index', 'value').add_legend(bbox_to_anchor=(1, 0.5), loc='center left')
g.fig.tight_layout()

enter image description here

相关问题 更多 >