Добавить аннотацию к указанным c ячейкам в карте тепла - PullRequest
4 голосов
/ 10 марта 2020

Я строю тепловую карту морского побережья и хотел бы аннотировать только указанные c ячейки с пользовательским текстом.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from io import StringIO

data = StringIO(u'''75,83,41,47,19
                    51,24,100,0,58
                    12,94,63,91,7
                    34,13,86,41,77''')

labels = StringIO(u'''7,8,4,,1
                    5,2,,2,8
                    1,,6,,7
                    3,1,,4,7''')

data = pd.read_csv(data, header=None)
data = data.apply(pd.to_numeric)

labels = pd.read_csv(labels, header=None)
#labels = np.ma.masked_invalid(labels)

fig, ax = plt.subplots()
sns.heatmap(data, annot=labels, ax=ax, vmin=0, vmax=100)
plt.show()

Приведенный выше код создает следующую тепловую карту:

heatmap with nan values

и закомментированная строка генерирует следующую тепловую карту:

heatmap with 0 values

Я хотел бы показать только ненан (или ненулевой) текст в ячейках. Как этого достичь?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Чтобы дополнить ответ @ mrzo , вы можете использовать na_filter=False в read_csv() для хранения nan s в качестве пустых строк и использовать pandas.DataFrame.astype() для преобразования в строки на месте:

# ...
labels = pd.read_csv(labels, header=None, na_filter=False).astype(str)
sns.heatmap(data, annot=labels, fmt='s', ax=ax, vmin=0, vmax=100)
2 голосов
/ 10 марта 2020

Используйте массив строк для annot вместо маскированного массива:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from io import StringIO

data = StringIO(u'''75,83,41,47,19
                    51,24,100,0,58
                    12,94,63,91,7
                    34,13,86,41,77''')

labels = StringIO(u'''7,8,4,,1
                    5,2,,2,8
                    1,,6,,7
                    3,1,,4,7''')

data = pd.read_csv(data, header=None)
data = data.apply(pd.to_numeric)

labels = pd.read_csv(labels, header=None)
#labels = np.ma.masked_invalid(labels)

# Convert everything to strings:
annotations = labels.astype(str)
annotations[np.isnan(labels)] = ""

fig, ax = plt.subplots()
sns.heatmap(data, annot=annotations, fmt="s", ax=ax, vmin=0, vmax=100)
plt.show()

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...