#python #pandas #seaborn #heatmap #spacing
Вопрос:
В настоящее время я использую seaborn.heatmap() для отображения двоичных данных, которые я организовал в панде.Фрейм данных. Индекс фрейма данных является дискретным и соответствует разным местоположениям, в то время как столбцы являются непрерывными и представляют время. Как я могу сделать так, чтобы ось x на тепловой карте имела правильное расстояние между значениями измерений?
Чтобы быть более точным, я хочу, чтобы разница между 0 и 1 000 была в 1 000 раз больше, чем между 0 и 1 и 10 000 раз больше разницы между 1 и 1,1. Вот минимум того, как организованы мои данные:
import seaborn as sns import numpy as np import pandas as pd import matplotlib.pyplot as plt df=pd.DataFrame(np.random.randint(0,2,size=(5, 8)), columns=[1,1.1,2,3,4,1001,1002,1003], index=['A','B','C','D','E']) sns.heatmap(df,cmap='binary', square=True)
Полученное изображение выглядит следующим образом: https://i.stack.imgur.com/uxSrH.png
Данные между измерениями (например. для значения измерения 500, которое не является частью фрейма данных, должно быть равно 0. Я не против отказаться от квадрата=Истина.
Для тех из вас, кому интересно, 0/1 являются ложными/Истинными утверждениями, которые указывают, проводил ли я измерение на этом участке отбора проб в данном месте в данный момент времени.
Огромное спасибо
Комментарии:
1. Я не уверен, что понимаю. У вас есть двоичные данные, поэтому вы не можете создать «тепловую карту». У вас будет только два цвета, несмотря ни на что, если ваши данные будут только 0 и 1. И поскольку ось x также дискретна, вы не получите расстояние, которое ищете, и я не думаю, что это то, что вам нужно.
2. Спасибо за ваш ответ. Он должен быть похож только на тепловую карту и показывать, где у меня есть измерение
Ответ №1:
Вы можете использовать plt.pcolor()
, что создает неравномерно расположенную сетку с линиями сетки, указанными в ее первом и втором параметре. Поскольку сетка ячеек 5×8 требует линий сетки 6×9, как список значений x, так и значений y необходимо расширить на единицу.
В примере используется 101
вместо 1001
, потому что разница в 1000 раз приведет к тому, что все будет сведено к тонкой линии, за исключением области между 4 и 1001.
import numpy as np import pandas as pd import matplotlib.pyplot as plt # slightly modified example data df = pd.DataFrame(np.random.randint(0, 2, size=(5, 8)), columns=[1, 1.1, 2, 3, 4, 101, 102, 103], index=['A', 'B', 'C', 'D', 'E']) plt.pcolor(list(df.columns) [2 * df.columns[-1] - df.columns[-2]], np.arange(len(df.index) 1), df.values, cmap='binary') plt.yticks(np.arange(0.5, len(df.index)), df.index) # labels between the grid lines plt.show()