在具有不同轴的栅格中打印不相关的绘图

2024-09-30 12:21:44 发布

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

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({'ID': {0: 93711,  1: 93717,  2: 93719,  3: 93731,  4: 93738,  5: 93755,  6: 93758,  7: 93760,  8: 93763},
                  'sex': {0: 'M',  1: 'M',  2: 'F',  3: 'M',  4: 'M',  5: 'F',  6: 'F',  7: 'F',  8: 'M'},
                  'age': {0: 56,  1: 22,  2: 13,  3: 20,  4: 26,  5: 26,  6: 55,  7: 54,  8: 40},
                  'insulin': {0: 31.68,  1: 23.64,  2: 65.64,  3: 127.98,  4: 33.42,  5: 122.46,  6: 32.52,  7: 119.88,  8: 64.68},
                  'totalPF': {0: 22.8,  1: 20.4,  2: 33.4,  3: 31.3,  4: 25.1,  5: 42.6,  6: 43.5,  7: 44.1,  8: 20.2}})

我有一个类似5000x30的数据帧,并在这里取了一个小样本

      ID sex  age  insulin  totalPF
0  93711   M   56    31.68     22.8
1  93717   M   22    23.64     20.4
2  93719   F   13    65.64     33.4
3  93731   M   20   127.98     31.3
4  93738   M   26    33.42     25.1
5  93755   F   26   122.46     42.6
6  93758   F   55    32.52     43.5
7  93760   F   54   119.88     44.1
8  93763   M   40    64.68     20.2

我想画画

sns.lmplot(x='insulin', y='age', hue='sex', data=df)
sns.lmplot(x='totalPF', y='age', hue='sex', data=df)
sns.lmplot(x='insulin', y='totalPF', hue='sex', data=df)

将这些图放在一个网格中,每个图从我的数据框中的不同列获取y轴和x轴。我还想让它为每个性别显示两种不同的颜色和线条。 理想情况下,我可以在一个漂亮的网格中有20多个图形,显示不同的轴组合。 这都是在Jupyter笔记本中完成的

使用for循环,我可以让它绘制我想要的图形,但不是在一个漂亮的网格中。 我还尝试过使用基本的matplotlib子图,但在许多列上进行迭代似乎非常困难。 也可能有一些方法来整理数据框架,以便lmplot和FaceGrid完成所有工作,但我已经尝试了一些方法,我也没有更进一步

Ideally it looks something like this


Tags: 数据import网格dfagedatamatplotlibas
1条回答
网友
1楼 · 发布于 2024-09-30 12:21:44

您可以使用PairGrid获得几乎所需的输出:

x_vars = ['insulin','totalPF']
y_vars = ['age','totalPF']
hue_var = 'sex'

g = sns.PairGrid(data=df, x_vars=x_vars, y_vars=y_vars, hue=hue_var)
g.map(sns.regplot)
g.add_legend()

enter image description here

或者,您可以删除右下轴以消除多余的打印。 g.axes[-1,-1].remove()

否则,如果你更愿意跟随@PaulH的评论,这是正确的。我将这样实施:

from itertools import product

x_vars = ['insulin','totalPF']
y_vars = ['age','totalPF']
hue_var = 'sex'
fig, axs = plt.subplots(len(y_vars), len(x_vars), sharex='col', sharey='row')
for ax,(y,x) in zip(axs.flat,product(y_vars,x_vars)):
    for hue,gr in df.groupby(hue_var):
        print(x,y,hue,ax)
        sns.regplot(x=x,y=y,data=gr,ax=ax,label=hue)
axs[0,0].legend()

enter image description here

相关问题 更多 >

    热门问题