【问题标题】:Seaborn histogram with 4 panels (2 x 2) in Python在 Python 中具有 4 个面板(2 x 2)的 Seaborn 直方图
【发布时间】:2016-10-21 01:43:56
【问题描述】:

我正在尝试使用sklearn.datasets.load_irisseaborn 重新创建此图像。我真的很喜欢做fig, ax = plt.subplots() 然后使用seabornax=ax 属性的想法。我不知道如何重新创建这个情节:

我检查了 stackoverflow 并发现了这一点,但它覆盖了它们 How To Plot Multiple Histograms On Same Plot With Seaborn

这是我的代码和情节:

# Iris Dataset
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()

%matplotlib inline 

DF_data = pd.DataFrame(load_iris().data, 
                       columns = load_iris().feature_names, 
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])])

Se_targets = pd.Series(load_iris().target, 
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])], 
                       name = "Targets")

#Visualizing Iris Data
D_targets = {0: 'Iris-Setosa',
            1: 'Iris-Versicolor',
            2: 'Iris-Virgnica'}

D_features = {0: 'sepal length [cm]',
              1: 'sepal width [cm]',
              2: 'petal length [cm]',
              3: 'petal width [cm]'}

fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))

idx_feature = 0

#Plot on 2 x 2 ax object

for i in range(ax.shape[0]):
    for j in range(0, ax.shape[1]):
        for idx_target, label_target  in list(D_targets.items()):
            sns.distplot(DF_data.as_matrix()[Se_targets==idx_target, idx_feature],
                         label=D_features[idx_feature],
                         kde=False,
                         bins=10,
                         ax=ax[i][j])        
        idx_feature += 1 

plt.legend(loc='upper right', fancybox=True, fontsize=8)

plt.tight_layout()
plt.show()

我的情节看起来很糟糕:

更新:

响应@Cel 的回答,我已经完成了这个情节,但我无法修复标签并使情节周围的线条变暗。

【问题讨论】:

    标签: python matplotlib plot histogram seaborn


    【解决方案1】:

    这里的问题是您使用布尔系列而不是布尔 numpy 数组来索引 numpy 数组。

    sns.distplot(DF_data.as_matrix()[Se_targets==idx_target, idx_feature],
                 label=D_targets[idx_target],
                 kde=False,
                 bins=10,
                 ax=ax[i][j])
    

    我同意这是非常不直观的。事实上,numpy 已经告诉你,这将在未来改变:

    DF_data.as_matrix()[Se_targets==idx_target, 2]
    

    /Users/ch/miniconda/envs/sci34/lib/python3.4/site-packages/IPython/kernel/ma​​in.py:1:FutureWarning:未来,布尔数组- likes 将作为布尔数组索引处理

    现在,这应该适合你:

    sns.distplot(DF_data.as_matrix()[Se_targets.as_matrix()==idx_target, idx_feature],
                 label=D_features[idx_feature],
                 kde=False,
                 bins=10,
                 ax=ax[i][j])
    

    这是完整的代码:

    # Iris Dataset
    import pandas as pd
    from sklearn.datasets import load_iris
    import matplotlib.pyplot as plt
    import seaborn as sns; sns.set()
    sns.set_style('whitegrid')
    
    %matplotlib inline 
    
    DF_data = pd.DataFrame(load_iris().data, 
                           columns = load_iris().feature_names, 
                           index = ["iris_%d" % i for i in range(load_iris().data.shape[0])])
    
    Se_targets = pd.Series(load_iris().target, 
                           index = ["iris_%d" % i for i in range(load_iris().data.shape[0])], 
                           name = "Targets")
    
    #Visualizing Iris Data
    D_targets = {0: 'Iris-Setosa',
                1: 'Iris-Versicolor',
                2: 'Iris-Virgnica'}
    
    D_features = {0: 'sepal length [cm]',
                  1: 'sepal width [cm]',
                  2: 'petal length [cm]',
                  3: 'petal width [cm]'}
    
    fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
    
    idx_feature = 0
    
    #Plot on 2 x 2 ax object
    
    for i in range(ax.shape[0]):
        for j in range(0, ax.shape[1]):
            for idx_target, label_target  in list(D_targets.items()):
                plot = sns.distplot(DF_data.as_matrix()[Se_targets.as_matrix()==idx_target, idx_feature],
                             label=D_features[idx_feature],
                             kde=False,
                             bins=10,
                             ax=ax[i][j])
                plot.set_xlabel(D_features[idx_feature])
            idx_feature += 1 
    
    plt.legend(loc='upper right', fancybox=True, fontsize=8)
    
    plt.tight_layout()
    

    【讨论】:

    • 您好,感谢您的回复。我的标签仍然有问题。我添加了我的新情节。我用标签检查了字典,标签在那个地方打印正确。
    • label = D_targets[idx_target] 修复标签
    【解决方案2】:

    或者你可以这样做

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    iris = sns.load_dataset("iris")
    iris_long = pd.melt(iris, "species", var_name="measurement")
    g = sns.FacetGrid(iris_long, hue="species", col="measurement", col_wrap=2, sharex=False)
    g.map(plt.hist, "value", alpha=.4)
    

    【讨论】:

    • 你怎么能不说“测量=”?
    • 另外,图例中的物种标签如何获取?
    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多