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

Учитывая следующее подмножество моих данных

import matplotlib.pyplot as plt
import numpy as np
data = np.array([['Yes', 'No', 'No', 'Maybe', 'Yes', 'Yes', 'Yes'],
                    [0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
                    [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]])

Я хочу построить тепловую карту 2-го и 3-го ряда и использовать 1-й ряд в качестве меток в каждом поле. Я пытался использовать plt.imshow(), но это раздражает, как только я использую полный набор данных, и я не могу найти способ включить категориальные значения в качестве меток в каждом поле.

С другой стороны, если я это сделаю:

data1 = np.array([[0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
                    [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]])

plt.imshow(data1, cmap='hot', interpolation='nearest')

, я получаю тепловую карту, но она не очень описывает то, что я хочу, потому что метки и оси отсутствуют. Есть предложения?

enter image description here

Имена столбцов 'Decision', 'Percentage', 'Salary multiplier'

Ответы [ 2 ]

1 голос
/ 31 января 2020

Прежде всего, массиву np.array необходимо, чтобы все элементы были одного типа. Поскольку ваш массив также содержит строки, это будет общий тип. Поэтому лучше не использовать массив в качестве np.array или использовать отдельный массив для строк.

Поскольку ваши данные кажутся позициями x, y, имеет смысл использовать их в качестве координаты в точечный график. Вы можете закрасить позиции x, y в зависимости от значения Да / Возможно / Нет, например, назначив им зеленый / желтый / красный. Кроме того, вы можете добавить текст, так как у вас очень мало данных. С большим количеством данных вам лучше создать легенду, чтобы связать метки с их окраской.

from matplotlib import pyplot as plt
import numpy as np

data = [['Yes', 'No', 'No', 'Maybe', 'Yes', 'Yes', 'Yes'],
        [0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
        [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]]

answer_to_color = {'Yes': 'limegreen', 'Maybe': 'gold', 'No': 'crimson'}
colors = [answer_to_color[ans] for ans in data[0]]
plt.scatter(data[1], data[2], c=colors, s=500, ls='-', edgecolors='black')

for label, x, y in zip(data[0], data[1], data[2]):
    plt.text(x+0.01, y+0.03, label)
plt.show()

result

Чтобы использовать имена столбцов для маркировки график, вы можете добавить:

plt.title('Decision')
plt.xlabel('Percentage')
plt.ylabel('Salary multiplier')
0 голосов
/ 31 января 2020

Необходимо установить новую ось с помощью ax2.

import matplotlib.pyplot as plt
import numpy as np

data = np.array([[0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
                    [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]])

fig, ax1 = plt.subplots()
ax1.pcolor(data, cmap='hot')

# set top axis
ax2 = ax1.twiny()
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(np.linspace(0.5, 6.5, num=7))
ax2.set_xticklabels(['Yes', 'No', 'No', 'Maybe', 'Yes', 'Yes', 'Yes'])

# change ticks for bottom axis
ax1.set_xticks(np.linspace(0.5, 6.5, num=7))
ax1.set_xticklabels(np.linspace(0, 6, num=7, dtype = int))

plt.show()

Выход:

enter image description here

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