在Seaborn上在一个面板上绘制不同功能的散布图

时间:2019-01-04 16:39:15

标签: python-3.x pandas matplotlib seaborn

我有一个具有12种不同功能的数据框。我想一次在4x3面板上绘制每个直方图。

test = pd.DataFrame({
    'a': [10, 5, -2],
    'b': [2, 3, 1],
    'c': [10, 5, -2],
    'd': [-10, -5, 2],
    'aa': [10, 5, -2],
    'bb': [2, 3, 1],
    'cc': [10, 5, -2],
    'dd': [-10, -5, 2],
    'aaa': [10, 5, -2],
    'bbb': [2, 3, 1],
    'ccc': [10, 5, -2],
    'ddd': [-10, -5, 2]
})

我可以通过编写类似于以下代码的代码来做到这一点:

# plot
f, axes = plt.subplots(3, 4, figsize=(20, 10), sharex=True)
sns.distplot( test["a"] , color="skyblue", ax=axes[0, 0])
sns.distplot( test["b"] , color="olive", ax=axes[0, 1])
sns.distplot( test["c"] , color="teal", ax=axes[0, 2])
sns.distplot( test["d"] , color="grey", ax=axes[0, 3])
...

enter image description here

我该如何以一种优雅的方式循环并遍历功能?我想为每行分配相同的四种颜色。

2 个答案:

答案 0 :(得分:2)

您可以将所有内容都包含在for循环中:

colors =["skyblue", "olive", "teal", "grey"]
f, axes = plt.subplots(3, 4, figsize=(20, 10), sharex=True)
for i, ax in enumerate(axes.flatten()):
    sns.distplot( test.iloc[:, i] , color=colors[i%4], ax=ax)

答案 1 :(得分:2)

Seaborn为此提供了FacetGrid

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

test = pd.DataFrame({
    'a': [10, 5, -2],
    'b': [2, 3, 1],
    'c': [10, 5, -2],
    'd': [-10, -5, 2],
    'aa': [10, 5, -2],
    'bb': [2, 3, 1],
    'cc': [10, 5, -2],
    'dd': [-10, -5, 2],
    'aaa': [10, 5, -2],
    'bbb': [2, 3, 1],
    'ccc': [10, 5, -2],
    'ddd': [-10, -5, 2]
})
data = pd.melt(test)
data["hue"] = data["variable"].apply(lambda x: x[:1])

g = sns.FacetGrid(data, col="variable", col_wrap=4, hue="hue")
g.map(sns.distplot, "value")

plt.show()

enter image description here