2017-06-09 4 views
0

diese Art von Datendatei vor:Gitter von Histogrammen nach gefilterten Daten

Daten datei.txt

75,15,1,57.5,9.9,5 
75,15,1,58.1,10.0,5 
75,15,2,37.9,8.3,5 
75,15,2,18.2,7.3,5 
150,15,1,26.4,8.3,10 
150,15,1,31.6,7.9,10 
150,15,2,30.6,7.5,10 
150,15,2,25.1,7.1,10 

, dass Spaltenwerte nur 1,2 beachten 3. sind.

Ich möchte 3x2 -grid von Histogrammen produzieren. Die Subplots unten sehen richtig aus, aber jede Zeile sollte 2 Histogramme aus verschiedenen Datensätzen enthalten, ich meine, ich filtere die Daten gemäß der letzten Spalte.

Der wichtige Code ist ax.hist(X[ (y==grp) & (X[:,2]==1), cols],, in dem der Filter auftritt.

Ich mag 2 Histogramme in jeder Zeile:

  • die 1. Reihe mit (X[:,2]== *) wo * jeder Wert aus der 3. Säule sein (1 oder 2),
  • die zweite Reihe mit (X[:,2]==1) und
  • der 3. Reihe mit (X[:,2]==2).

Im Lebenslauf erwarte ich, dass am 2. erhalten, 3. Reihen Histogramme für die gefilterten Daten:

3. Spalte Wert = 1

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 

3. Spalte Wert = 2

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 

Code:

#!/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() 

Hier ist ein Screenshot aus dem obigen Code mit dem Filter (y==grp) & (X[:,2]==1) (die am 2. Reihe sein sollen).

enter image description here

+0

Ich glaube, Sie die Gründe für eine mißverstanden [MCVE]. Du solltest ** a [mcve] ** erstellen **, weil ** du eine riesige Datei hast, die du nicht teilen kannst. In diesem Fall sieht es so aus, als ob das minimale Beispiel einfach einige Zufallszahlen "np.random.randint" verwenden könnte. Da uns wichtige Variablen wie 'grps_to_hist_list',' cols_to_hist' oder 'label_dict' fehlen, ist es sehr schwierig, Ihnen hier zu helfen. – ImportanceOfBeingErnest

+0

Got 'KeyError: 'Prop''für Zeile 33. Ehrlich gesagt, verstehe nicht, was dein erwartetes Ergebnis ist. Ich nehme an, du weißt das und das ist wahrscheinlich nicht deine Frage. Aber wenn Sie sich fragen, warum die zweite und dritte Zeile keinen Plot haben, liegt das daran, dass Ihr 'zip (grps_str, ('blue', 'red'))' nur 2 Elemente hat. Wenn Sie sich wundern, warum die Bedingung 'y == grp' nicht funktioniert, können Sie vielleicht den KeyError korrigieren und es könnte für andere leichter sein zu verstehen, was' y' ist. –

+0

Eh, hast du es selbst versucht? Zumindest 'TypeError: nicht hashbarer Typ: 'numpy.tarray'' für mich ... Außerdem könnte es hilfreich sein, mehr Details zu den erwarteten Ergebnissen anzugeben. Mein Gesamtgefühl ist nicht zu helfen. Überlassen Sie Experten ... Entschuldigung ... –

Antwort

1

Meine Logik ist über Zeilen mit entsprechenden Masken Ihrer Wahl zu wiederholen, [(X[:,2]==1) | (X[:,2]==2), X[:,2]==1, X[:,2]==2]. Hoffentlich ist das, was Sie wollen:

#!/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() 

enter image description here

+0

Ich denke, Ihre Einzugsebene unterscheidet sich von meiner. Ich verwende 4 Leerzeichen zum Einrücken. Wenn du 3 verwendest, versuche es zu ändern und hoffentlich funktioniert das. –

Verwandte Themen