2016-09-01 5 views
3

Ich versuche, Histogramme von ein paar Serien aus einem Datenrahmen zu plotten. Serie haben unterschiedliche Höchstwerte:Pandas Grundstück sharex = False verhält sich nicht wie erwartet

df[[ 
    'age_sent', 'last_seen', 'forum_reply', 'forum_cnt', 'forum_exp', 'forum_quest' 
]].max() 

kehrt:

age_sent  1516.564016 
last_seen  986.790035 
forum_reply  137.000000 
forum_cnt  155.000000 
forum_exp  13.000000 
forum_quest  10.000000 

Als ich plot histograms versuchte ich sharex=False, subplots=True verwenden, aber es sieht aus wie sharex Eigenschaft ignoriert wird:

df[[ 
    'age_sent', 'last_seen', 'forum_reply', 'forum_cnt', 'forum_exp', 'forum_quest' 
]].plot.hist(figsize=(20, 10), logy=True, sharex=False, subplots=True) 

enter image description here


Ich kann jede von ihnen separat getrennt darstellen, aber das ist weniger wünschenswert. Außerdem würde ich gerne wissen, was ich falsch mache.


Die Daten, die ich habe, ist zu groß, auch enthalten sein, aber es ist leicht, etwas Ähnliches zu schaffen:

ttt = pd.DataFrame({'a': pd.Series(np.random.uniform(1, 1000, 100)), 'b': pd.Series(np.random.uniform(1, 10, 100))}) 

Jetzt habe ich:

ttt.plot.hist(logy=True, sharex=False, subplots=True) 

Überprüfen Sie die x-Achse. Ich möchte, dass es so ist (aber einen Befehl mit Subplots).

ttt['a'].plot.hist(logy=True) 
ttt['b'].plot.hist(logy=True) 
+0

finde ich nicht etwas mit dem Plotten Verhalten falsch schreiben. Es macht genau wie die Parameter, die Sie bestanden haben. Ich verstehe nicht, was Sie mit "sharex" -Eigenschaft meinen, wird ignoriert? Bitte klären Sie. –

+0

@NickilMaveli Wie Sie sehen, wird die X-Achse von allen Unterplots geteilt (jedes Unterplot hat dieselbe Achse). Ich habe (vielleicht zu Unrecht) damit gerechnet, dass ich, wenn ich es zu falsch setze, jede X-Achse auf der Grundlage der Werte dieser Serie anpassen würde. Lass es mich wissen, wenn das klar ist. –

+0

@SalvadorDali sharex bedeutet, dass nur eine x-Achse angezeigt wird. Es handelt sich also um eine Anzeigeeinstellung, die jedoch in diesem Diagramm ignoriert wird (die oberen drei sollten keine x-Achse haben). – ayhan

Antwort

2

Die sharex (höchstwahrscheinlich) fällt nur MPL durch und setzt, wenn die Schwenk-/Zoom-Achsen eine die andere ändert.

Das Problem, das Sie haben, ist, dass die gleichen Bins für alle Histogramme verwendet werden (die von https://github.com/pydata/pandas/blob/master/pandas/tools/plotting.py#L2053 erzwungen wird, wenn ich den Code richtig verstehe), weil Pandas davon ausgeht, dass wenn Sie mehrere Histogramme dann Spalten darstellen von ähnlichen Daten, so dass sie mit dem gleichen Binning vergleichbar sind.

Angenommen, Sie haben mpl> = 1,5 und numpy> = 1,11 Sie sollten Sie sich selbst eine kleine Hilfsfunktion wie

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import pandas as pd 
import numpy as np 

plt.ion() 


def make_hists(df, fig_kwargs=None, hist_kwargs=None, 
       style_cycle=None): 
    ''' 

    Parameters 
    ---------- 
    df : pd.DataFrame 
     Datasource 

    fig_kwargs : dict, optional 
     kwargs to pass to `plt.subplots` 

     defaults to {'fig_size': (4, 1.5*len(df.columns), 
        'tight_layout': True} 

    hist_kwargs : dict, optional 
     Extra kwargs to pass to `ax.hist`, defaults 
     to `{'bins': 'auto'} 

    style_cycle : cycler 
     Style cycle to use, defaults to 
     mpl.rcParams['axes.prop_cycle'] 

    Returns 
    ------- 
    fig : mpl.figure.Figure 
     The figure created 

    ax_list : list 
     The mpl.axes.Axes objects created 

    arts : dict 
     maps column names to the histogram artist 
    ''' 
    if style_cycle is None: 
     style_cycle = mpl.rcParams['axes.prop_cycle'] 

    if fig_kwargs is None: 
     fig_kwargs = {} 
    if hist_kwargs is None: 
     hist_kwargs = {} 

    hist_kwargs.setdefault('log', True) 
    # this requires nmupy >= 1.11 
    hist_kwargs.setdefault('bins', 'auto') 
    cols = df.columns 

    fig_kwargs.setdefault('figsize', (4, 1.5*len(cols))) 
    fig_kwargs.setdefault('tight_layout', True) 
    fig, ax_lst = plt.subplots(len(cols), 1, **fig_kwargs) 
    arts = {} 
    for ax, col, sty in zip(ax_lst, cols, style_cycle()): 
     h = ax.hist(col, data=df, **hist_kwargs, **sty) 
     ax.legend() 

     arts[col] = h 

    return fig, list(ax_lst), arts 

dist = [1, 2, 5, 7, 50] 
col_names = ['weibull $a={}$'.format(alpha) for alpha in dist] 
test_df = pd.DataFrame(np.random.weibull(dist, 
             (10000, len(dist))), 
         columns=col_names) 

make_hists(test_df) 

enter image description here

Verwandte Themen