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