Создайте график Hexbin с фреймом данных pandas, используя имена индексов и столбцов как x и y

#python #pandas #matplotlib

#python #pandas #matplotlib

Вопрос:

У меня есть следующий фрейм данных pandas df :

 import pandas as pd
from decimal import Decimal
df = pd.DataFrame([[1, Decimal('nan')], [100, 10]], index=['y1', 'y2'], columns=['x1', 'x2'])

╔════╦═════╦═════╗
║    ║ x1  ║ x2  ║
╠════╬═════╬═════╣
║ y1 ║   1 ║ NAN ║
║ y2 ║ 10010  ║
╚════╩═════╩═════╝
  

Я хотел бы создать график шестнадцатеричных ячеек, где ось x использует имена столбцов (x1, x2) , а ось y — индексы (y1, y2) . Числа во фрейме данных представляют количество отсчетов, например, чем больше число, тем темнее цвет шестнадцатеричного числа.
В идеале что-то вроде этого:

 df.plot.hexbin(x=df.columns, y=df.index.get_values())
  

Есть ли возможность сделать это простым способом?

Комментарии:

1. Вы получаете сообщение об ошибке? Покажите это в вопросе. И добавьте некоторый код, который мы могли бы запустить для его тестирования.

2. Я в замешательстве? Код, который я использовал, был просто примером, иллюстрирующим то, что я хочу.

3. ТАК же есть место для решения проблемы с существующим кодом. Вы могли бы, по крайней мере, создать df = DataFrame(...) , чтобы получить какой-нибудь пример для работы.

Ответ №1:

Рассмотрим фиктивный фрейм данных, DF :

 from matplotlib.ticker import FuncFormatter

np.random.seed(314)
dummy_df = pd.DataFrame(np.random.randint(0, 100, (10, 3)), columns=['x1', 'x2', 'x3'], 
                        index=['y{}'.format(i) for i in range(1, 11)])
  

Изображение

Melt DF иметь один столбец, соответствующий индексу, столбцу и значениям соответственно:

 df = pd.melt(dummy_df.reset_index(), id_vars=['index'])
  

Используйте только числовую часть строк, чтобы упростить построение осей x и y графика hexbin.

 df['index_int'] = df['index'].str.extract('(d )', expand=False).astype(int)
df['variable_int'] = df['variable'].str.extract('(d )', expand=False).astype(int)
  

Построение графика:

Передайте значения в C arg графика шестиугольной ячейки, который определяет значение в каждой точке (x, y):

 fig, ax = plt.subplots()
hex_ax = ax.hexbin(x=df['variable_int'], y=df['index_int'], C=df['value'], 
                   gridsize=10, cmap=plt.cm.Reds)
fig.colorbar(hex_ax)
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, _: 'x{:.0f}'.format(x)))
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: 'y{:.0f}'.format(y))) 
plt.xticks(np.unique(df['variable_int'].values))
plt.show()
  

Изображение

Примечание: Если вы используете встроенный график hexbin фрейма данных, xticks и xlabels не отображаются на результирующем графике, и, следовательно, был вызван эквивалентный matplotlib метод hexbin.[см. GH issue ]