Ваш вывод отображает все строки, но у-метки уменьшаются, так как они слишком сильно перекрывают друг друга и не читаются.
Если у вас нет столбца частоты, Вы можете создать его и установить все значения на 1
с помощью df['frequency'] = 1
. Функция агрегирования затем суммирует все.
Вы можете отсортировать piv
фрейм данных и принять 10 самых высоких значений с помощью idx = piv.sum(axis=1).sort_values(ascending=False).head(10).index
. Затем piv.loc[idx]
получит только эти строки в указанном порядке.
Код ниже показывает шаги. В этом конкретном случае он также вращает метки тиков, чтобы сделать их более читабельными.
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
N = 1000
abc = list('ABCDEFGHIJKLMNOPQRS')
df = pd.DataFrame({'Date':[f'2018-02-{i:02d}' for i in np.random.randint(18, 23, N)],
'Words': [abc[i]+abc[j] for i,j in np.random.randint(0, len(abc), (N, 2)) ] ,
'frequency': np.random.randint(1, 10, N)
})
# df['frequency'] = 1 # in case there wasn't a frequency column yet
piv = pd.pivot_table(df, values="frequency",index=["Words"], columns=["Date"], fill_value=0, aggfunc=np.sum)
idx = piv.sum(axis=1).sort_values(ascending=False).head(10).index
ax = sns.heatmap(piv.loc[idx], square=False)
ax.set_xticklabels(ax.get_xticklabels(), rotation=0) # rotate the x labels to be horizontally again
ax.set_yticklabels(ax.get_yticklabels(), rotation=0) # rotate the y labels to be horizontally
plt.show()
PS: показать все тики и все метки (они могут быть слишком переполнены) отсортированы в алфавитном порядке:
from matplotlib.ticker import FixedLocator
idx = piv.sort_values('Words', ascending=True).index
ax = sns.heatmap(piv.loc[idx], square=False)
ax.yaxis.set_major_locator(FixedLocator(np.arange(0.5, len(idx) + 0.5, 1)))
ax.set_yticklabels(idx, rotation=0, fontsize=6)
Или, чтобы увидеть метки, чередующиеся слева и справа (чтобы соответствовать двойному размеру), может помочь вторичная ось:
ax.yaxis.set_major_locator(FixedLocator(np.arange(0.5, len(idx) + 0.5, 2)))
ax.set_yticklabels(idx[::2], rotation=0, fontsize=6)
secax = ax.secondary_yaxis('right')
secax.yaxis.set_major_locator(FixedLocator(np.arange(1.5, len(idx) + 0.5, 2)))
secax.set_yticklabels(idx[1::2], rotation=0, fontsize=6)