Matplotlib:plt.xtick与sns.FaceGrid一起使用时出现错误

Matplotlib:plt.xtick与sns.FaceGrid一起使用时出现错误,matplotlib,seaborn,Matplotlib,Seaborn,我试图用sns.FacetGrid做一些相对简单的事情(见下面的代码)。对于n=10,k=10和标尺=1,图看起来很好(除了 BIs=NP.AANGE(K+1)-0.5 < /COD>不在每个列的中间设置标签),但是当您增加k时,图中的最后一个数字歪斜并适应K XICKK。p> k=10 k=30 我认为这是错误的-或者我使用plt.xticks是错误的?使用plt.xticks的问题在于它应该只作用于最后一个激活的子批(在本例中,是右下角)。[注意,它似乎在所有子地块上设置了Xtickla

我试图用sns.FacetGrid做一些相对简单的事情(见下面的代码)。对于n=10,k=10和标尺=1,图看起来很好(除了<代码> BIs=NP.AANGE(K+1)-0.5 < /COD>不在每个列的中间设置标签),但是当您增加k时,图中的最后一个数字歪斜并适应K XICKK。p> k=10

k=30


我认为这是错误的-或者我使用plt.xticks是错误的?

使用
plt.xticks的问题在于它应该只作用于最后一个激活的子批(在本例中,是右下角)。[注意,它似乎在所有子地块上设置了Xticklabel,但没有设置刻度]

有几种方法可以设置所有子批次的
xticklabel
。最好的方法可能是使用
FacetGrid
对象的
set\xticklabels
方法。所以,你可以这样做:

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
。您需要在
FaceGrid
之前定义
标签
,才能使其正常工作:

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(" ")

使用
plt.xticks
的问题是,它应该只作用于最后一个激活的子批次(在本例中,是右下角)。[注意,它似乎在所有子地块上设置了Xticklabel,但没有设置刻度]

有几种方法可以设置所有子批次的
xticklabel
。最好的方法可能是使用
FacetGrid
对象的
set\xticklabels
方法。所以,你可以这样做:

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
。您需要在
FaceGrid
之前定义
标签
,才能使其正常工作:

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(" ")

实际上,
xticks()
正在更改最后一个子批次中的刻度(正如我所期望的)和下一行中所有子批次中的标签(我根本不期望)。FacetGrid可能就是这样工作的,但我觉得这很奇怪。实现这一点的“更适合海洋生物的方式”是在
FacetGrid
对象上使用
set
方法。@mwaskom谢谢,这更友好!我将编辑答案。实际上,
xticks()
正在更改最后一个子批次中的刻度(正如我所期望的)和下一行中所有子批次中的标签(我根本不期望)。FacetGrid可能就是这样工作的,但我觉得这很奇怪。实现这一点的“更适合海洋生物的方式”是在
FacetGrid
对象上使用
set
方法。@mwaskom谢谢,这更友好!我将编辑答案。