Тепловые карты с повторяющимися значениями X и Y в Python - PullRequest
0 голосов
/ 12 июля 2020

Итак, у меня есть набор из 3 списков данных, все из которых имеют длину 105 элементов. Первый список - это список из 21 значения температуры, из которых 5 наборов. Второй список состоит из значений Kzz, которых 5, соответствующих каждому из наборов значений температуры. Третий список - это молекулярная распространенность, каждая из которых уникальна. Хотя значения температуры и Kzz действительно повторяются, они никогда не повторяются в тандеме по отношению к значениям молекулярного содержания, действуя больше как категории, чем что-либо еще. Температура и Kzz имеют некоторое отношение к молекулярному содержанию, но, поскольку эти данные являются эмпирическими, точное соотношение еще не известно.

Мое намерение состояло в том, чтобы нанести эти три списка на тепловую карту, где x и координаты y будут значениями температуры и Kzz, а цвет будет определяться значением молекулярного содержания.

Однако я не смог. Моя первая попытка состояла в том, чтобы вставить каждый список в фрейм данных, чтобы затем построить его с помощью функции тепловой карты Seaborn (после преобразования фрейма данных в сводную таблицу с помощью df.pivot ()), но когда я попытался преобразовать его, pandas из-за ошибки из-за того, что они повторяют значения координаты y:

ValueError: Index contains duplicate entries, cannot reshape

Однако без преобразования фрейма данных в сводную таблицу тепловые карты просто оказались непонятными.

Затем я попытался использовать matplotlib contour, но это не сработало, потому что молекулярные содержания являются одномерными, а для контура нужны значения z в виде двумерного массива. Попытка plt.pcolor (температуры, значения kzz, молекулярное содержание) дает ошибку. полезный график.

Какой будет лучший способ получить эти данные в виде тепловой карты? Или другую полезную форму?

Спасибо!

1 Ответ

0 голосов
/ 12 июля 2020

Следующий код с подробными комментариями показывает, как можно нарисовать такую ​​тепловую карту:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import random

# suppose you have a list of 5 times 21 temperatures
temp = [i for i in range(10, 31)] * 5
# suppose you have 5 Kzz, each one for  21 temperatures
Kzz = [j for i in range(10, 31) for j in range(2, 12, 2)]
# suppose you have 105 abundances, corresponding to the temperature-Kzz pairs
abundances = [random.random() for _ in range(len(temp))]

# the easiest to work with is to convert the lists to numpy arrays
#  to make them 2D, with a dimension of 5x21, reshape() can be used
temp = np.array(temp).reshape(5, 21)
Kzz = np.array(Kzz).reshape(5, 21)
abundances = np.array(abundances).reshape(5, 21)

# to draw a heatmap, the principal ingredient are the abundances having the correct 2D shape;
# to tell seaborn what the x and y axes mean, a list of 21 temperatures can be given as xticklabels
#   and 5 Kzz values as yticklabels
sns.heatmap(abundances, xticklabels=temp[0, :], yticklabels=Kzz[:, 0], cmap='inferno')
plt.xlabel('temperature')
plt.ylabel('Kzz')
plt.title('molecular abundances')
plt.show()

resulting plot

PS: You could use the same data to create a scatter plot. The scatter plot helps to show the given data and might give additional insight when the contourplot doesn't give the expected result.

plt.scatter(temp, Kzz, c=abundances, cmap='inferno')
...