Создание пузырьковой диаграммы из кросс-таблицы панд

У меня есть пандас с четырьмя столбцами и несколькими тысячами строк. Все записи либо 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)

Другие вопросы по тегам