#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 ║ 100 ║ 10 ║
╚════╩═════╩═════╝
Я хотел бы создать график шестнадцатеричных ячеек, где ось 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
]