Matplotlib:与sns.FacetGrid一起使用时的plt.xtick错误

时间:2016-03-03 13:13:41

标签: matplotlib seaborn

我试图用sns.FacetGrid做一些相对简单的事情(见下面的代码)。对于N = 10,k = 10和scale = 1,图表看起来很好(除了bins = np.arange(k+1) - 0.5 不是设置每列中间的标签),但是当你增加k时,<情节中的em> last 数字出错并适应k xticks。

k = 10

enter image description here

k = 30

enter image description here

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from ipywidgets import interact

%matplotlib inline

def stateplot(N,k,scale):

    sns.set(style="ticks")

    rs = np.random.RandomState(4)
    value = np.round(rs.exponential(scale, (N,k)),0)
    macrostate = np.repeat(range(N), k)
    df = pd.DataFrame(np.c_[value.flat,macrostate],columns=["value","state"])
    grid = sns.FacetGrid(df, col="state", hue="state", col_wrap=5, 
                         size=2,legend_out=False,xlim=(0,8))
    bins = np.arange(k+1) - 0.5
    grid.map(plt.hist, "value", bins=bins, 
             lw=0,align='left').set_axis_labels(" ", " ").set_titles(" ")
    labels = [' ',r'$0{\Delta}$',r'$1{\Delta}$',r'$2{\Delta}$',r'$3{\Delta}$'
              ,r'$4{\Delta}$',r'$5{\Delta}$',r'$6{\Delta}$',r'$7{\Delta}$']
    plt.xticks(list(range(k)), labels)

我正在考虑它的错误 - 或者我使用plt.xticks错了?

1 个答案:

答案 0 :(得分:4)

使用plt.xticks的priblem是它应该仅作用于最后一个活动的子图(在这种情况下,右下角)。 [注意,似乎在所有子图上设置了xticklabels,但没有设置滴答声]

您可以通过多种方式为所有子图设置xticklabels。可能最好的方法是使用set_xticklabels对象的FacetGrid方法。所以,你可以这样做:

def stateplot(N,k,scale):

    sns.set(style="ticks")

    rs = np.random.RandomState(4)
    value = np.round(rs.exponential(scale, (N,k)),0)
    macrostate = np.repeat(range(N), k)
    df = pd.DataFrame(np.c_[value.flat,macrostate],columns=["value","state"])
    grid = sns.FacetGrid(df, col="state", hue="state", col_wrap=5, 
                         size=2,legend_out=False,xlim=(0,8))
    bins = np.arange(k+1) - 0.5
    grid.map(plt.hist, "value", bins=bins, 
             lw=0,align='left').set_axis_labels(" ", " ").set_titles(" ")

    labels = [' ',r'$0{\Delta}$',r'$1{\Delta}$',r'$2{\Delta}$',r'$3{\Delta}$'
              ,r'$4{\Delta}$',r'$5{\Delta}$',r'$6{\Delta}$',r'$7{\Delta}$']
    grid.set_xticklabels(labels)

另一种方法是使用subplot_kws选项FacetGrid,然后设置xticklabels。您需要在labels之前定义FacetGrid才能使其正常工作:

def stateplot(N,k,scale):

    sns.set(style="ticks")

    rs = np.random.RandomState(4)
    value = np.round(rs.exponential(scale, (N,k)),0)
    macrostate = np.repeat(range(N), k)
    df = pd.DataFrame(np.c_[value.flat,macrostate],columns=["value","state"])
    labels = [' ',r'$0{\Delta}$',r'$1{\Delta}$',r'$2{\Delta}$',r'$3{\Delta}$'
              ,r'$4{\Delta}$',r'$5{\Delta}$',r'$6{\Delta}$',r'$7{\Delta}$']
    grid = sns.FacetGrid(df, col="state", hue="state", col_wrap=5, 
                         size=2,legend_out=False,xlim=(0,8),subplot_kws={'xticklabels':labels})
    bins = np.arange(k+1) - 0.5
    grid.map(plt.hist, "value", bins=bins, 
             lw=0,align='left').set_axis_labels(" ", " ").set_titles(" ")