Аннотировать тепловую карту со значением из кадра данных Pandas

Я хотел бы аннотировать тепловую карту со значениями, которые я передаю из кадра данных в приведенную ниже функцию. Я посмотрел на matplotlib.text, но не смог получить значения из моей dataframe в желаемом виде в моей тепловой карте. Я вставил в свою функцию для создания тепловой карты ниже, после чего мой блок данных и выход из вызова тепловой карты. Я хотел бы построить каждое значение из моей информационной рамки в центре каждой ячейки в тепловой карте.

Функция для создания тепловой карты:

import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.colors as mcolors def heatmap_binary(df, edgecolors='w', #cmap=mpl.cm.RdYlGn, log=False): width = len(df.columns)/7*10 height = len(df.index)/7*10 fig, ax = plt.subplots(figsize=(20,10))#(figsize=(width,height)) cmap, norm = mcolors.from_levels_and_colors([0, 0.05, 1],['Teal', 'MidnightBlue'] ) # ['MidnightBlue', Teal]['Darkgreen', 'Darkred'] heatmap = ax.pcolor(df , edgecolors=edgecolors, # put white lines between squares in heatmap cmap=cmap, norm=norm) ax.autoscale(tight=True) # get rid of whitespace in margins of heatmap ax.set_aspect('equal') # ensure heatmap cells are square ax.xaxis.set_ticks_position('top') # put column labels at the top ax.tick_params(bottom='off', top='off', left='off', right='off') # turn off ticks plt.yticks(np.arange(len(df.index)) + 0.5, df.index, size=20) plt.xticks(np.arange(len(df.columns)) + 0.5, df.columns, rotation=90, size= 15) # ugliness from http://matplotlib.org/users/tight_layout_guide.html from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) cax = divider.append_axes("right", "3%", pad="1%") plt.colorbar(heatmap, cax=cax) plt.show() 

Герре – пример моего Dataframe:

 dataframe : 0-5 km / h 5-40 km / h 40-80 km / h 80-120 km / h \ NORDIC 0.113955 0.191888 0.017485 -0.277528 MIDDLE EU 0.117903 0.197084 -0.001447 -0.332677 KOREA 0.314008 0.236503 -0.067174 -0.396518 CHINA 0.314008 0.236503 -0.067174 -0.396518 120-160 km / h 160-190 km / h 190 km / h NORDIC -0.054365 0.006107 0.002458 MIDDLE EU 0.002441 0.012097 0.004599 KOREA -0.087191 0.000331 0.000040 CHINA -0.087191 0.000331 0.000040 

Создание тепловой карты:

 heatmap_binary(dataframe) 

введите описание изображения здесь

Есть идеи?


Обновление для уточнения моей проблемы

Я попробовал предлагаемое решение из вопроса, в результате которого я искал: как комментировать текст с текстом в matplotlib? Тем не менее, у меня все еще есть проблема с использованием функции matplotlib.text для позиционирования значений в тепловой карте: вот моя треска для этого решения:

 import matplotlib.pyplot as plt import numpy as np data = dataframe.values heatmap_binary(dataframe) for y in range(data.shape[0]): for x in range(data.shape[1]): plt.text(data[y,x] +0.05 , data[y,x] + 0.05, '%.4f' % data[y, x], #data[y,x] +0.05 , data[y,x] + 0.05 horizontalalignment='center', verticalalignment='center', color='w') #plt.colorbar(heatmap) plt.show() 

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

  • Есть ли модуль Python для преобразования RTF в обычный текст?
  • Только извлечение текста из этого элемента, а не его детей
  • Статистическая модель предложения предложений, например проверка орфографии
  • Перечислите слова в словаре в соответствии с появлением в текстовом корпусе Scikit-Learn
  • Поиск текста в PDF с помощью Python?
  • пил рисовать текст разными цветами
  • BeautifulSoup Grab Visible Webpage Text
  • Подсчитайте различные слова из кадра данных Pandas
  • 3 Solutions collect form web for “Аннотировать тепловую карту со значением из кадра данных Pandas”

    Значения, которые вы использовали для ваших координат в вашем цикле for были прикручены. Также вы использовали plt.colorbar вместо чего-то более чистого, как fig.colorbar . Попробуйте это (он выполняет свою работу, не прилагая никаких усилий для другой очистки кода):

     def heatmap_binary(df, edgecolors='w', #cmap=mpl.cm.RdYlGn, log=False): width = len(df.columns)/7*10 height = len(df.index)/7*10 fig, ax = plt.subplots(figsize=(20,10))#(figsize=(width,height)) cmap, norm = mcolors.from_levels_and_colors([0, 0.05, 1],['Teal', 'MidnightBlue'] ) # ['MidnightBlue', Teal]['Darkgreen', 'Darkred'] heatmap = ax.pcolor(df , edgecolors=edgecolors, # put white lines between squares in heatmap cmap=cmap, norm=norm) data = df.values for y in range(data.shape[0]): for x in range(data.shape[1]): plt.text(x + 0.5 , y + 0.5, '%.4f' % data[y, x], #data[y,x] +0.05 , data[y,x] + 0.05 horizontalalignment='center', verticalalignment='center', color='w') ax.autoscale(tight=True) # get rid of whitespace in margins of heatmap ax.set_aspect('equal') # ensure heatmap cells are square ax.xaxis.set_ticks_position('top') # put column labels at the top ax.tick_params(bottom='off', top='off', left='off', right='off') # turn off ticks ax.set_yticks(np.arange(len(df.index)) + 0.5) ax.set_yticklabels(df.index, size=20) ax.set_xticks(np.arange(len(df.columns)) + 0.5) ax.set_xticklabels(df.columns, rotation=90, size= 15) # ugliness from http://matplotlib.org/users/tight_layout_guide.html from mpl_toolkits.axes_grid1 import make_axes_locatable divider = make_axes_locatable(ax) cax = divider.append_axes("right", "3%", pad="1%") fig.colorbar(heatmap, cax=cax) 

    затем

     df1 = pd.DataFrame(np.random.choice([0, 0.75], size=(4,5)), columns=list('ABCDE'), index=list('WXYZ')) heatmap_binary(df1) 

    дает:

    Ответ

    Эта функциональность обеспечивается пакетом морского судна . Он может создавать такие карты, как

    Пример аннотированной тепловой карты

    Пример использования морского

     import seaborn as sns sns.set() # Load the example flights dataset and conver to long-form flights_long = sns.load_dataset("flights") flights = flights_long.pivot("month", "year", "passengers") # Draw a heatmap with the numeric values in each cell sns.heatmap(flights, annot=True, fmt="d", linewidths=.5) 

    Это связано с тем, что вы используете plt.text после добавления других осей.

    Машина состояний будет divider.append_axes текущие оси, и после того, как вы добавили новый с divider.append_axes , оси colorbar являются текущими. (Просто вызов plt.colorbar не приведет к этому, так как он снова возвращает текущие оси к оригиналу, если он создает сами оси. Если конкретный объект осей передается при использовании cax kwarg, он не сбрасывает " текущие "оси, поскольку это не то, что вы обычно хотели бы.)

    Такие вещи являются основной причиной того, что вы увидите так много людей, которые советуют вам использовать интерфейс OO для matplotlib вместо интерфейса конечной машины. Таким образом, вы знаете, какие объекты осей вы планируете.

    Например, в вашем случае вы могли бы иметь heatmap_binary вернуть объект ax который он создает, и график, используя ax.text вместо plt.text (и аналогичный для других методов построения).

    Python - лучший язык программирования в мире.