Matplotlib 根据过滤数据的直方图网格

Matplotlib 根据过滤数据的直方图网格,matplotlib,subplot,Matplotlib,Subplot,考虑这种数据文件: data-file.txt 请注意,第三列的值仅为1,2 我想产生3×2的直方图网格。下面的子图看起来不错,但每行应该包含来自不同数据集的2个直方图,我的意思是,我根据最后一列过滤数据 重要的代码是ax.histX[y==grp&X[:,2]==1,cols],其中出现了过滤器 我希望每行有2个直方图: 第1行X[:,2]==*其中*是第3列1或2中的任意值, 第二行X[:,2]==1和 第三行X[:,2]==2。 在简历中,我希望得到过滤数据的第2行、第3行直方图: 第三列

考虑这种数据文件:

data-file.txt

请注意,第三列的值仅为1,2

我想产生3×2的直方图网格。下面的子图看起来不错,但每行应该包含来自不同数据集的2个直方图,我的意思是,我根据最后一列过滤数据

重要的代码是ax.histX[y==grp&X[:,2]==1,cols],其中出现了过滤器

我希望每行有2个直方图:

第1行X[:,2]==*其中*是第3列1或2中的任意值, 第二行X[:,2]==1和 第三行X[:,2]==2。 在简历中,我希望得到过滤数据的第2行、第3行直方图:

第三列值=1

第三列值=2

代码:

下面是上面代码的屏幕截图,过滤器y==grp&X[:,2]==1应该在第二行


我的逻辑是使用您选择的相应掩码迭代行,[X[:,2]==1 | X[:,2]==2,X[:,2]==1,X[:,2]==2]。希望这就是你想要的:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import math
from matplotlib import pyplot as plt
from itertools import combinations

data_file='data-file.txt'

df = pd.io.parsers.read_csv(
    filepath_or_buffer=data_file,
    delim_whitespace=False,
    )

M, N = df.shape[0], df.shape[1]

feature_dict = {i+1:label for i,label in zip(
                range(N),
                  ('L',
                   'A',
                   'G',
                   'P',
                   'T', 
                   'PP',
                   ))}

df.columns = [l for i,l in sorted(feature_dict.items())] 

X = df[range(N-1)].values
y = df['PP'].values

label_dict = dict(enumerate(sorted(list(set(y)))))
label_dict = {x+1:y for x,y in label_dict.iteritems()}
num_grupos = len(label_dict.keys())

grps_to_hist_list = [[j for j in i] for i in combinations(label_dict.keys(), 2)]
grps_to_hist_list_values = [[j for j in i] for i in combinations(label_dict.values(), 2)]

cols_to_hist = [3, 4] 

for grps_to_hist in grps_to_hist_list:
    grps_str = [ label_dict[grps_to_hist[0]], label_dict[grps_to_hist[1]] ]
    print 'creating histogram for groups %s from data file %s' % (grps_str , data_file)
    fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(18,8))

    for row_ax, row_mask in zip(axes, [(X[:,2]==1) | (X[:,2]==2), X[:,2]==1, X[:,2]==2]):
        for ax,cols  in zip(row_ax, cols_to_hist):
            # set bin sizes
            min_b = math.floor(np.min(X[:,cols]))
            max_b = math.ceil(np.max(X[:,cols]))
            bins = np.linspace(min_b, max_b, 40)


            # ploting the histograms
            #"""
            for grp,color in zip( grps_str, ('blue', 'red')):
                    ax.hist(X[ (y==grp) & row_mask, cols],
                           color=color,
                           label='%s'  % grp,
                           bins=bins,
                           alpha=0.3,)

            ylims = ax.get_ylim()

            # plot annotation
            leg = ax.legend(loc='upper right', fancybox=True, fontsize=8)
            leg.get_frame().set_alpha(0.5)
            ax.set_ylim([0, max(ylims)+2])
            ax.set_xlabel(feature_dict[cols+1])
            ax.set_title('%s' % str(data_file))

            # hide axis ticks
            ax.tick_params(axis="both", which="both", bottom="off", top="off", labelbottom="on", left="off", right="off", labelleft="on")

            # remove axis spines
            ax.spines["top"].set_visible(False)  
            ax.spines["right"].set_visible(False)
            ax.spines["bottom"].set_visible(False)
            ax.spines["left"].set_visible(False)
            #"""

    fig.tight_layout()       

    plt.show()

我想你误解了一个问题背后的原因。您应该创建一个文件,因为您有一个无法共享的大型文件。在本例中,看起来最小示例可以简单地使用一些随机数np.random.randint。因为我们缺少一些重要的变量,比如grps_to_hist_list、cols_to_hist或label_dict,所以在这里很难帮到你。第33行有keyrerror:“Prop”。老实说,我不明白你的预期结果是什么。我想你知道这一点,这可能不是你的问题。但是如果你想知道为什么第二行和第三行没有绘图,那是因为你的zip grps_str,‘蓝色’、‘红色’只有2个元素。如果你想知道为什么条件y==grp不起作用,也许你可以纠正keyrerror,让其他人更容易理解什么是y。呃,你自己也试过了吗?至少TypeError:不可损坏的类型:“numpy.ndarray”对我来说。。。此外,提供更多关于预期结果的详细信息可能会有所帮助。我总的感觉是我不知道该怎么帮助。留给专家。。。抱歉…由于还没有专家到场,所以在下面给出了答案。不确定这是否是你想要的。一般的想法是使用相应的掩码在行上循环。我认为您的缩进级别和我的不同。我使用4个空格进行缩进。如果你使用3,试着改变它,希望它能起作用。
75,15,1,57.5,9.9,5
75,15,1,58.1,10.0,5
150,15,1,26.4,8.3,10
150,15,1,31.6,7.9,10
75,15,2,37.9,8.3,5
75,15,2,18.2,7.3,5
150,15,2,30.6,7.5,10
150,15,2,25.1,7.1,10
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import math
from matplotlib import pyplot as plt
from itertools import combinations

data_file='data-file.txt'

df = pd.io.parsers.read_csv(
    filepath_or_buffer=data_file,
    delim_whitespace=False,
    )

M, N = df.shape[0], df.shape[1]

feature_dict = {i+1:label for i,label in zip(
                range(N),
                  ('L',
                   'A',
                   'G',
                   'P',
                   'T', 
                   'PP',
                   ))}

df.columns = [l for i,l in sorted(feature_dict.items())] 

X = df[range(N-1)].values
y = df['PP'].values

label_dict = dict(enumerate(sorted(list(set(y)))))
label_dict = {x+1:y for x,y in label_dict.iteritems()}
num_grupos = len(label_dict.keys())

grps_to_hist_list = [[j for j in i] for i in combinations(label_dict.keys(), 2)]
grps_to_hist_list_values = [[j for j in i] for i in combinations(label_dict.values(), 2)]

cols_to_hist = [3, 4] 

for grps_to_hist in grps_to_hist_list:
    grps_str = [ label_dict[grps_to_hist[0]], label_dict[grps_to_hist[1]] ]
    print 'creating histogram for groups %s from data file %s' % (grps_str , data_file)
    fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(18,8))

    for ax,cols  in zip(axes.ravel(), cols_to_hist):
        # set bin sizes
        min_b = math.floor(np.min(X[:,cols]))
        max_b = math.ceil(np.max(X[:,cols]))
        bins = np.linspace(min_b, max_b, 40)


        # ploting the histograms
        #"""
        for grp,color in zip( grps_str, ('blue', 'red')):
                ax.hist(X[ (y==grp) & (X[:,2]==1), cols],
                       color=color,
                       label='%s'  % grp,
                       bins=bins,
                       alpha=0.3,)

        ylims = ax.get_ylim()

        # plot annotation
        leg = ax.legend(loc='upper right', fancybox=True, fontsize=8)
        leg.get_frame().set_alpha(0.5)
        ax.set_ylim([0, max(ylims)+2])
        ax.set_xlabel(feature_dict[cols+1])
        ax.set_title('%s' % str(data_file))

        # hide axis ticks
        ax.tick_params(axis="both", which="both", bottom="off", top="off", labelbottom="on", left="off", right="off", labelleft="on")

        # remove axis spines
        ax.spines["top"].set_visible(False)  
        ax.spines["right"].set_visible(False)
        ax.spines["bottom"].set_visible(False)
        ax.spines["left"].set_visible(False)
        #"""

    fig.tight_layout()       

    plt.show()
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import math
from matplotlib import pyplot as plt
from itertools import combinations

data_file='data-file.txt'

df = pd.io.parsers.read_csv(
    filepath_or_buffer=data_file,
    delim_whitespace=False,
    )

M, N = df.shape[0], df.shape[1]

feature_dict = {i+1:label for i,label in zip(
                range(N),
                  ('L',
                   'A',
                   'G',
                   'P',
                   'T', 
                   'PP',
                   ))}

df.columns = [l for i,l in sorted(feature_dict.items())] 

X = df[range(N-1)].values
y = df['PP'].values

label_dict = dict(enumerate(sorted(list(set(y)))))
label_dict = {x+1:y for x,y in label_dict.iteritems()}
num_grupos = len(label_dict.keys())

grps_to_hist_list = [[j for j in i] for i in combinations(label_dict.keys(), 2)]
grps_to_hist_list_values = [[j for j in i] for i in combinations(label_dict.values(), 2)]

cols_to_hist = [3, 4] 

for grps_to_hist in grps_to_hist_list:
    grps_str = [ label_dict[grps_to_hist[0]], label_dict[grps_to_hist[1]] ]
    print 'creating histogram for groups %s from data file %s' % (grps_str , data_file)
    fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(18,8))

    for row_ax, row_mask in zip(axes, [(X[:,2]==1) | (X[:,2]==2), X[:,2]==1, X[:,2]==2]):
        for ax,cols  in zip(row_ax, cols_to_hist):
            # set bin sizes
            min_b = math.floor(np.min(X[:,cols]))
            max_b = math.ceil(np.max(X[:,cols]))
            bins = np.linspace(min_b, max_b, 40)


            # ploting the histograms
            #"""
            for grp,color in zip( grps_str, ('blue', 'red')):
                    ax.hist(X[ (y==grp) & row_mask, cols],
                           color=color,
                           label='%s'  % grp,
                           bins=bins,
                           alpha=0.3,)

            ylims = ax.get_ylim()

            # plot annotation
            leg = ax.legend(loc='upper right', fancybox=True, fontsize=8)
            leg.get_frame().set_alpha(0.5)
            ax.set_ylim([0, max(ylims)+2])
            ax.set_xlabel(feature_dict[cols+1])
            ax.set_title('%s' % str(data_file))

            # hide axis ticks
            ax.tick_params(axis="both", which="both", bottom="off", top="off", labelbottom="on", left="off", right="off", labelleft="on")

            # remove axis spines
            ax.spines["top"].set_visible(False)  
            ax.spines["right"].set_visible(False)
            ax.spines["bottom"].set_visible(False)
            ax.spines["left"].set_visible(False)
            #"""

    fig.tight_layout()       

    plt.show()