Создание пузырьковой диаграммы из кросс-таблицы панд
У меня есть пандас с четырьмя столбцами и несколькими тысячами строк. Все записи либо True, либо False. Давайте назовем фрейм данных "df" и столбцы "c0", "c1", "c2" и "c3". Меня интересует, сколько строк имеют каждое из 2^4=16 возможных значений истинности, поэтому я делаю кросс-табуляцию:
xt = pd.crosstab([df.c0,df.c1],[df.c2,df.c3])
print(xt)
Это отображает красивую таблицу ячеек 4x4, в каждой ячейке содержится количество строк, имеющих эту комбинацию значений истинности. Более того, пространственное расположение этих 16 ячеек является значимым и полезным для меня. ОК, все хорошо. Но как мне построить это?
В частности, я хотел бы сделать пузырьковую диаграмму из этих кросс-таблиц, то есть графическое представление данных кросс-таблицы в том же пространственном расположении, как показано в таблице, но теперь замените каждое число цветным шариком (скажем, кругом).) площади, пропорциональной количеству. Итак, это точечная диаграмма с четырьмя (c0,c1) истинными значениями вдоль одной оси, четырьмя (c2,c3) истинными значениями вдоль другой оси и регулярной сеткой 4x4 из кругов разного размера.
Я знаю, что могу создать пузырьковую диаграмму, передав данные о размере ключевому слову 's' функции разброса matplotlib, но я не могу придумать простой способ сказать пандам, что нужно создать точечный график, который использует заголовки столбцов в качестве x-координат. заголовки строк в виде y-координат и значения данных в виде размеров пузырьков для точечной диаграммы. Мне повезло, я преобразовал свой фрейм данных в массив и построил его, но затем я потерял структуру меток осей из кросс-таблицы. (Да, я мог бы просто перестроить метки тиков вручную, но я хотел бы иметь возможность воспроизвести эту задачу алгоритмически для других аналогичных наборов данных.)
РЕДАКТИРОВАТЬ: Вдохновленный ответом @piRSquared ниже, вот некоторые разъяснения того, что я прошу. Этот код близок к тому, что я хочу, но оси на полученном графике потеряли любую информацию о многоуровневой структуре меток MultiIndex объекта кросс-таблицы.
import pandas as pd
import numpy as np
randomData=np.random.choice([True,False],size=(100, 4),p=[.6,.4])
df = pd.DataFrame(randomData, columns=['c0','c1','c2','c3'])
xt=pd.crosstab([df.c0,df.c1], [df.c2,df.c3])
x=np.array([range(4)]*4)
y=x.transpose()[::-1,:]
pl.scatter(x,y,s=np.array(xt)*10)
(ссылка на изображение графика, так как у меня недостаточно репутации для встраивания: точечный график с плохо помеченными осями.) В идеале метки осей должны иметь визуально выровненную структуру, полученную из базового MultiIndex объекта кросс-таблицы, примерно так:
c2 False True
c3 False True False True
c0 c1
False False 0 8 4 9
True 3 2 4 10
True False 7 5 3 10
True 2 7 8 18
Или, может быть, что-то напоминает то, что легенда и ось X выражают здесь:
xt.plot(kind='bar',stacked=True)
(Еще одна ссылка на графическое изображение: стековый график, который знает о многоиндексной природе своего базового фрейма данных.)
1 ответ
Надеюсь это поможет
df = pd.DataFrame(
np.random.choice(
np.arange(6),
size=(100, 2),
p=np.arange(1, 7) / 21
), columns=list('AB')
)
c = pd.crosstab(df.A, df.B).stack().reset_index(name='C')
c.plot.scatter('A', 'B', s=c.C * 10)