Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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 :

             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()

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


  • Что пойдет не так, когда вы попробуете это? Можете ли вы опубликовать изображение? 15.01.2014
  • Добавил картинку, другая окраска, но та же проблема. Текстовый вызов помещает значения в правый угол.... 15.01.2014
  • Можете ли вы опубликовать копию своего кода сразу, а не двумя отдельными кусками? Я думаю, проблема в том, что вы запускаете цикл for после добавления файла colorbar. Попробуйте запустить цикл text for сразу после вызова pcolor. 16.01.2014
  • Я попытался поместить цикл for в функцию Heatmap_binary после pcolor... не сработало... Я получил тот же результат 16.01.2014

Ответы:


1

Значения, которые вы использовали для своих координат в цикле 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)

дает:

Ответ

16.01.2014
  • Спасибо! Это именно то, чего я желал. 17.01.2014
  • Рад помочь. Интересно, стоит ли это предлагать в качестве улучшения для Pandas. Есть много вещей, которые я хотел бы сделать с Pandas DataFrames в этом духе. Цвет только определенные столбцы. Нормализуйте перед окрашиванием. И т. д. Для меня остается открытым вопрос: каков правильный общий подход? т.е. Это что-то основано на pcolor или это что-то, что должно включать HTML-представление DataFrame? Что вы ребята думаете? 17.01.2014
  • Да, такое улучшение построения диаграмм было бы полезно. В духе упрощения обработки данных они очень приветствуются. Особенно очень нужна маркировка значений на тепловой карте. Настолько распространенный, что это сэкономило бы некоторые усилия с помощью простого API. 20.01.2014

  • 2

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

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

    Пример использования seaborn:

    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)
    
    24.08.2015

    3

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

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

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

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

    15.01.2014
  • Спасибо. Итак, у вас есть какие-либо предложения о том, как вернуть объект оси из моей функции. Боюсь, я не так хорошо разбираюсь в языке python.. 15.01.2014

  • 4

    Вы также можете использовать plotly.figure_factory для создания тепловой карты из DataFrame, но вам нужно преобразовать ее в список.

        import plotly.figure_factory as ff
    
        z = [your_dataframe].values.tolist()
        x = [your_dataframe].columns.tolist()
        y = [your_dataframe].index.tolist()
    
        fig = ff.create_annotated_heatmap(z, x=x, y=y, annotation_text=z, colorscale='viridis')
    
        # for add annotation into Heatmap
        for i in range(len(fig.layout.annotations)):
            fig.layout.annotations[i].font.size = 12
    
        # show your Heatmap
        fig.show()
    
    05.03.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..