Выделите пользовательский цвет для ячейки данных среднего значения каждого столбца в тепловой карте, используя pandas df - PullRequest
2 голосов
/ 06 марта 2020

Я пытаюсь выделить ячейку среднего значения или ячейку наименьшего значения среднего значения в pandas карте тепла, но она всегда дает результат сбоя для меня. Я хочу выделить ячейку с точным средним значением в тепловой карте, если точное значение недоступно, значит необходимо выделить самое низкое значение для среднего значения.

Для примера: среднее значение равно 17,522, но недоступно в df, значит необходимо выделить 15.499 (см.

Здесь у меня есть общие скриншоты того, что я пробовал и чего я ожидаю от вашей ссылки.

Genius Всегда добро пожаловать!! Заранее спасибо.

Каждый Средние значения столбца:

array([17.60950419, 33.73034387, 46.63401871, 56.27580645, 52.62956452,
       63.70669355, 71.75735484, 67.788     , 83.62327419, 75.41342   ])

Я пробовал следующий код, чтобы выделить одну ячейку

df_Mean=np.array(df.mean())

fig, ax = plt.subplots(figsize=(18,8))

cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["#f9f9f9","#B6DBF2","#327AD9","#3068D9"])
color = ["#f9f9f9",'#3068D9',"#f9f9f9","#f9f9f9","#B6DBF2","#327AD9","#3068D9"]

ax = sns.heatmap(df, annot=True, fmt=".5g", linewidths=.02, 
                 cmap=cmap, vmin=0, vmax=300,cbar_kws={'label': 'Si.No'}, 
                linecolor='#CBDBD7',
                ax = ax,
                xticklabels=1, yticklabels=1,
                )

ax = sns.heatmap(df.round(),mask=(df > df_Mean),
             vmin=10, vmax=80, cmap=color, cbar=False)

ax.invert_yaxis()
ax.yaxis.set_label_position("right")
ax.yaxis.tick_right()

ax.set_xticklabels(
    ax.get_xticklabels(), color = 'darkgreen',
    horizontalalignment='center');

ax.set_yticklabels(
    ax.get_yticklabels(), color = 'darkblue',
    horizontalalignment='right',
    size = 10,);

ax.xaxis.set_tick_params(pad=10)
ax.yaxis.set_tick_params(pad=20)  

plt.xlabel('Month', color = 'Maroon', size= 15)
plt.title('Testing_HeatMap', color = 'darkgreen', size = 20)
plt.show()

Я получаю этот вывод, I am getting this Output

Ожидаемый результат: enter image description here

1 Ответ

3 голосов
/ 06 марта 2020

Здесь я продемонстрировал решение для некоторых случайных данных (но оно должно иллюстрировать метод для вашей установки).

Для каждого столбца я нахожу номер строки значения, ближайшего к среднему значению столбца, который меньше или равен значению столбца:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import pandas as pd
import seaborn as sns

# Generate some random data (25 rows, 3 columns)
df = pd.DataFrame(np.random.rand(25, 3))

# Compute the mean of each column
df_mean = df.mean()

# Find the difference between each value and the column mean
diff = df - df.mean()

# We are only interested in values less than or equal to the mean
mask = diff <= 0

# The row numbers of the closest values to the column mean
# which are less than or equal to the column mean
highlight_row = np.nanargmin(np.array(df[mask]), axis=0)

После того, как вы получили эти номера строк, единственное, что остается сделать, - это построить их. Один из способов сделать это - использовать патч Rectangle (хотя, несомненно, есть и другие способы сделать это):

# Plotting
fig, ax = plt.subplots()
ax = sns.heatmap(df, ax=ax)

# Loop over the columns
for col in range(df.shape[1]):
    # Add a rectangle which highlights our cell of interest
    ax.add_patch(Rectangle((col, highlight_row[col]), 1, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...