【问题标题】:Plotting different groups of a dataframe in different subplots在不同的子图中绘制不同组的数据框
【发布时间】:2021-10-29 11:19:09
【问题描述】:

我想在一个主图中绘制 4 个不同的散点图。数据来自从 .csv 文件读取的分组数据帧。初始数据框如下所示:

df.to_csv("File.csv", index=False)

df:

Category1 Category2 X Y
0 A x 4 5.1
1 B x 3 4.2
2 A y 2 7.1
3 A z 9 6.1
... ... ... ... ...
97 A z 4 5.1
98 A w 3 4.2
99 B y 2 7.1
100 B z 9 6.1

如您所见,category1 只有两种值(A,B),而 category2 有 4 种值(x,y,z,w)。 X 和 Y 值是随机的,仅用于显示目的。

分组的df是使用以下命令创建的:

dfGrouped = df.groupby(["Category1 ","Category2"])

dfGrouped:

X Y
A x 4 5.1
A 7 9.1
y 3 4.2
3 4.2
3 4.2
z 2 7.1
w 9 6.1
... ... ... ...
B x 4 5.1
y 3 4.2
z 2 7.1
2 7.1
w 9 6.1

我尝试单独绘制它们,但没有成功:

fig, ax = plt.subplots(figsize=(8, 6))
ax.margins(0.05)
for name, group in dfGrouped:
    ax.plot(group.X, group.Y, marker='o', linestyle='', ms=2, label=name)

我什至尝试使用 get_group 调用群组,但没有成功。

dfGrouped= dfGrouped.get_group(("A","x"))

有没有办法在一个主图中绘制 4 个不同的散点图(基于“category2”:x、y、z、w),每个图包含 2 个具有 2 种不同颜色的集合值(基于“类别 1":A、B)?

【问题讨论】:

  • 您有兴趣为每个组绘制哪些变量? X 和 Y?
  • @liorr 是正确的!

标签: python pandas dataframe plot group-by


【解决方案1】:

你可以使用seaborn.relplot:

import numpy as np
import seaborn as sns
# dummy data
df = pd.DataFrame({'Category1': np.random.choice(['A','B'], size=100),
                   'Category2': np.random.choice(['w','x', 'y', 'z'], size=100),
                   'x': np.random.random(size=100),
                   'y': np.random.random(size=100),
                   })
# plot
sns.relplot(data=df, x='x', y='y', col='Category2', col_wrap=2, hue='Category1')

输出:

【讨论】:

    【解决方案2】:

    我使用散点图,下面是另一种选择:

    **DataFrame**   
    
           col1     val1    val2    col2
      0     A      1000     5000     w
      1     A      3000     4000     w
      2     A      7000     5000     w
      3     A      3000     4000     w
      4     A      5000     6000     x
      5     A      5000     4000     x
      6     A      5000     9000     x
      7     A      6000     10000    x
      8     B      5000     6000     y
      9     B      5000     4000     y
      10    B      5000     9000     y
      11    A      6000     10000    y
      12    A      5000     6000     z
      13    B      5000     4000     z
      14    B      5000     9000     z
      15    A      6000     10000    z
    

    功能

    def plot_grouped_data():
      fig = plt.figure()
      fig.subplots_adjust(hspace=0.4, wspace=0.4)
      i=0
      for label, df in new.groupby('col2'):
        ax = fig.add_subplot(2,2,i+1)
        # print(label)
        sns.scatterplot(data=df,x= 'val1', y='val2', hue='col1', ax=ax)
        plt.title(f'Title={label}')
        plt.legend(loc="upper right")
        i += 1
      plt.show()
    
    plot_grouped_data()
    

    输出

    【讨论】:

    • 它工作,谢谢,但 CPU 消耗,对吧?
    • 可能是……因为涉及到 for 循环。只是另一个答案!
    猜你喜欢
    • 1970-01-01
    • 2018-04-30
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2020-07-23
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多