Тепловая карта не показывает все строки - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть набор данных с 399 строками (Words) и 5 ​​столбцами (Dates). Я хотел бы визуализировать некоторую информацию с помощью тепловых карт. Я создал сводную таблицу с помощью:

pd.pivot_table(df, index='Words', columns='Date', values='frequency', aggfunc=np.sum)

Вывод:

Date    2018-02-18  2018-02-19  2018-02-20  2018-02-21  2018-02-22
Words                   
A   NaN NaN NaN 2.0 2.0
B   NaN NaN NaN NaN 1.0
C   NaN NaN NaN NaN 1.0
D   NaN 1.0 NaN NaN NaN
E   NaN NaN 1.0 NaN NaN
... ... ... ... ... ...
RRR NaN 10.0    NaN NaN 90.0
SSS NaN 3.0 3.0 3.0 NaN
TTT NaN 4.0 NaN NaN NaN
UUU NaN NaN NaN 1.0 NaN
VVV NaN NaN NaN NaN 1.0
ZZZ NaN NaN 1.0 NaN 1.0

399 rows × 5 columns

Затем я попытался создать тепловую карту, используя следующие строки кода:

piv = pd.pivot_table(df, values="frequency",index=["Words"], columns=["Date"], fill_value=0)
ax = sns.heatmap(piv, square=False)

Однако вывод показывает только 20 из этих 399 строк. Можно ли визуализировать все строки в тепловой карте? В случае, если это невозможно, как я могу визуализировать только самые популярные строки (то есть строки, которые имеют большую частоту в зависимости от времени / даты)?

Ваша помощь будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 27 апреля 2020

Ваш вывод отображает все строки, но у-метки уменьшаются, так как они слишком сильно перекрывают друг друга и не читаются.

Если у вас нет столбца частоты, Вы можете создать его и установить все значения на 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()

sample plot

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...