Вы можете объявить переменную final или сделать ее переменной экземпляра (или глобальной). Если вы объявите его окончательным, вы не сможете изменить его позже.
Любая переменная, определенная в методе и доступная анонимным внутренним классом, должна быть окончательной. В противном случае вы можете использовать эту переменную во внутреннем классе, не сознавая, что если переменная изменяется во внутреннем классе, а затем она используется позже в охватывающей области, изменения, сделанные во внутреннем классе, не сохраняются в охватывающей области. В основном, то, что происходит во внутреннем классе, остается во внутреннем классе.
Я написал более подробное объяснение здесь . Он также объясняет, почему экземпляры и глобальные переменные не обязательно должны быть объявлены окончательными.
Парень, создавший Seaborn , не любит уложенные гистограммы (но эта ссылка имеет хак, который использует Seaborn + Matplotlib для их создания).
Если вы готовы принять сгруппированную гистограмму вместо уложенной в один ряд, вот один из подходов:
# first some sample data
import numpy as np
import pandas as pd
import seaborn as sns
N = 1000
mark = np.random.choice([True,False], N)
periods = np.random.choice(['BASELINE','WEEK 12', 'WEEK 24', 'WEEK 4'], N)
df = pd.DataFrame({'mark':mark,'period':periods})
ct = pd.crosstab(df.period, df.mark)
mark False True
period
BASELINE 118 111
WEEK 12 117 149
WEEK 24 117 130
WEEK 4 127 131
# now stack and reset
stacked = ct.stack().reset_index().rename(columns={0:'value'})
# plot grouped bar chart
sns.barplot(x=stacked.period, y=stacked.value, hue=stacked.mark)
Как вы сказали, вы можете использовать панды для создания графика сложенных штрихов. Аргумент о том, что вы хотите иметь «морской сюжет», не имеет значения, так как каждый сюжет на морском дне и каждый панд-сюжет - это, в конце концов, объекты matplotlib, поскольку инструменты построения обеих библиотек - это просто маскировочные обложки matplotlib.
Итак, вот полное решение (взятие данных из ответа @ andrew_reece).
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
n = 500
mark = np.random.choice([True,False], n)
periods = np.random.choice(['BASELINE','WEEK 12', 'WEEK 24', 'WEEK 4'], n)
df = pd.DataFrame({'mark':mark,'period':periods})
ct = pd.crosstab(df.period, df.mark)
ct.plot.bar(stacked=True)
plt.legend(title='mark')
plt.show()