Вернуть ноль в Counter(df[column])
Строю график распределения частоты выборов тех или иных вариантов ответа. ТИпа сколько выбрано единиц, двоек, троек, четверок.
def autolabel(rects, labels=None, height_factor=1.01):
for i, rect in enumerate(rects):
height = rect.get_height()
if labels is not None:
try:
label = labels[i]
except (TypeError, KeyError):
label = ' '
else:
label = '%d' % int(height)
ax.text(rect.get_x() + rect.get_width()/2., height_factor*height,
'{}'.format(label),
ha='center', va='bottom')
for index, column in enumerate(df.columns):
array_counts = Counter(df[column])
x, y = [], []
metki = ('вариант 1', 'вариант 2', 'вариант 3', 'вариант 4')
for m in metki:
if not array_counts.get(m, 0):
array_counts[m] = 0
sns.set_style('whitegrid')
for key, value in array_counts.items():
x.append(key);
y.append(value)
plt.figure(figsize=(6, 3.5))
b = sns.color_palette("ch:start=.2,rot=-.3")
kwargs = {'alpha': 0.9, 'linestyle': '-', 'linewidth': 0.5, 'edgecolor': 'black'}
ax = sns.barplot(x=x, y=y, data=df,
palette=b, **kwargs)
# plt.title("{}".format(str(column)))
plt.title('\n'.join(wrap("{}".format(str(column)),60)))
autolabel(ax.patches, height_factor=1.01)
plt.xlim(-1, 4)
plt.rcParams.update({'font.size': 10})
plt.rc('axes', titlesize=10)
N = 4
ind = np.arange(N)
plt.xticks(ind, metki, rotation=60)
plt.tight_layout()
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["bottom"].set_visible(True)
ax.spines["left"].set_visible(True)
# plt.axis('off')
Так получается, что если один из вариантов набрал ноль выборов, то график смещается- по этому столбцу выводится не ноль выборов, как нужно, а количество выборов следующего за ним варианта. Показываю на прикрепленном рисунке. А должно быть так, что "вариант 1"- 19, "вариант 2"- 1, "вариант 3" - НОЛЬ (столбик на уровне оси и надпись "0"), вариант 4 - 72.
Надеюсь, понятно написано. Не могу заставить counter вернуть мне ноль.
Столбец данных вот:
4
1
4
4
4
4
4
4
4
4
4
2
4
4
1
4
4
4
4
4
4
4
1
4
4
4
4
1
4
4
4
4
4
4
4
4
4
4
4
1
4
1
1
4
4
4
1
4
4
1
4
1
4
4
4
1
1
4
1
4
4
4
1
4
4
4
4
4
4
1
4
4
4
4
4
4
1
4
4
4
4
4
4
4
1
4
4
1
4
4
1
4
Ответы (2 шт):
После строки
metki = ('вариант 1', 'вариант 2', 'вариант 3', 'вариант 4')
добавьте этот код:
for m in metki:
if not array_counts.get(m, 0):
array_counts[m]=0
Можно сделать так, просто перебрав метки по порядковым номерам - Counter вполне лояльно относится к обращениям за ключами, которых у него нет - возвращает 0 в таком случае:
for i, _ in enumerate(metki, 1):
x.append(i);
y.append(array_counts[i])
Ну или даже, наверное, можно прямо m добавлять в x, но надо пробовать. Наверное, это только Seaborn поймёт, а Matplotlib это возможно не умеет отображать, не помню.
